숨밈
들숨에 건강을 날숨에 재력을
숨밈
전체 방문자
오늘
어제
  • 분류 전체보기 (55)
    • 💻 프로젝트 (8)
      • 🍝 홍잇 (5)
      • 🏕 캠퍼 (3)
    • 👩‍💻 개발 (30)
      • ⚙️ BACKEND (16)
      • 🖥 FRONTEND (3)
      • 📡 DEVOPS (7)
      • 💡SOFTWARE (4)
    • 📑 개발 이론 (13)
      • 🚎 JAVA (1)
      • 🌱 SPRING (12)
    • 📚 CS (2)
      • 🔎 Infra (2)
    • 📔 회고 (2)

블로그 메뉴

  • 홈
  • 태그
  • 글쓰기

인기 글

태그

  • django-rest-auth_custom
  • 타임리프
  • Tistory
  • 스프링부트
  • 스프링
  • django-rest-auth
  • notion
  • querydsl
  • springboot
  • Django
  • 자바스크립트
  • static final
  • 프리코스
  • jsp
  • django-auth

티스토리

hELLO · Designed By 정상우.
숨밈

들숨에 건강을 날숨에 재력을

📑 개발 이론/🚎 JAVA

[Java] static, final, static final의 차이

2022. 11. 30. 18:46

1.static

static은 "정적인", "고정된"이라는 의미로 전역이라고 이해하면 쉽다.

즉, 객체 생성 없이 사용할 수 있는 필드와 메서드를 생성하고자 할 때 활용한다.

 

예를 들어 ErrorMessage를 일관되게 반환하고자 할 경우에

1. return "[ERROR] 오류 발생" 이런 식으로 하드 코딩을 하고 싶지 않고

2. 따로 클래스를 만들어서 사용하고 각 클래스마다 ErrorMessage 객체를 생성하고 싶지 않다면!

다시 말해, 공용 데이터라면!

 

생성된 클래스의 매소드들을 모두 static으로 선언해주면 된다.

※ 단, 매소드를 static으로 선언하면 외부에서 불러오는 변수(class 변수)는 모두 static으로 선언되어야 함.

ErrorMessage.printError()

위와 같이 호출해 줄 수 있다.

 

또한 정적 매소드는 객체 참조 없이(객체 생성 없이) 바로 사용할 수 있어

인스턴스 필드나 매소드, this 키워드(인스턴스의 특징)를 사용할 수 없다. 

 

static은 매소드 영역에 저장되기 때문에 Garbage Collector이 작동하지 않아 시스템 종료 시 까지 계속 메모리에 남게 된다.

 

2. final

final은 "최종인", "결정적인"이라는 뜻으로 값이 한번 저장되면 수정이 불가능하다는 뜻이다.

 

그래서 흔히 생성자 주입을 받을 때 해당 변수를 final로선 언하여 임의로 해당 인스턴스의 변경을 막아 준다.

public class Flow {
    private final FlowContext flowContext;
    
    # 받아오는 flowContext마다 다른 값을 저장하게 됨
    public Flow(FlowContext flowContext) {
        this.flowContext = flowContext;
    }
}

 

또한 값을 받아오기 전까지는 어떤 값도 final 변수에 할당이 가능하므로 완전한 상수라고 보긴 어렵다.

 

만약 class에 final 함수로 선언하면, 해당 클래스를 상속 받은 클래스는 final함수를 재정의 해줄 수 없다.

마찬가지로 class를 final로 선언하면, 해당 클래스는 어디에서도 상속을 해 줄 수 없다.

 

3. static final

static final = "고정된"+"최종"이라는 뜻으로 상수를 선언하고자 할 때 사용된다. 

※ 상수란 변하지 않는 값을 뜻함.

 

final과는 달리 애초에 빈 값으로 둘 수 없다!

static final을 선언한 순간 값을 할당하여야 오류가 발생하지 않는다.

 

예를 들어 아래와 같이 하드코딩이 아닌 의미 있는 변수를 할당하여 return 값을 날리고 싶을 때 사용해주면 된다.

public class Message {
    private static final String startMessage = "게임을 시작합니다.";
	 
    public static void printStartMessage() {
        System.out.println(startMessage);
    }
}

 

저작자표시 (새창열림)
    숨밈
    숨밈
    기술블로그

    티스토리툴바