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);
}
}