[기초 정리] Static, Final, private static final & private final 차이
static이란?
static은 '정적인', '움직임이 없는'으로 해석할 수 있는데, 이 static을 사용하면 메모리가 jvm의 static 메모리(해당 영역은 프로그램이 시작하고 종료될 때까지 살아있는다.) 에 올라간다. static 메모리에 올라가기 때문에 초기화 과정이 필요없어 static이 선언된 변수, 메서드에 곧장 접근이 가능하다.
public class Ketchup {
// 변수에 static 사용
private static final String HEINZE = "heinze";
private static final String OTTOGI = "ottogi";
// 메서드에 static 사용
public static boolean isHeinzeKetchup(String brandName) {
return brandName.equals(HEINZE);
}
public static boolean isOttogiKetchup(String brandName) {
return brandName.equals(OTTOGI);
}
}
static을 사용한다는 의미는 해당 객체를 공유하겠다 는 의미이다.
여기저기서 해당 객체를 사용한다치면, 그 객체는 항상 동일한 객체라는 뜻이다.
(주의: 그래서 static이 선언된 변수의 값을 바꿔버리면 다른 곳에서 해당 변수의 값을 참조하는 부분의 값이 변한다.)
final이란?
final은 불변하도록 만드는 것이 아니라 재할당할 수 없도록 만드는 것이다. 상속을 하거나, 최초 초기화 이후 다시 초기화를 할 수 없다.
public class MutableTest {
private final Map<String, Object> mutableMap = new HashMap<>();
public void testFinal() {
// 재할당 안됨
// mutableMap = new HashMap<>();
mutableMap.put("choco", "M&M");
mutableMap.put("jelly", "haribo");
System.out.println(mutableMap.toString());
}
public static void main(String[] args) {
MutableTest mutableTest = new MutableTest();
mutableTest.testFinal();
}
}
예시처럼, 재할당은 안되지만 값은 변할 수 있다.
하지만 대게 Collections타입(Map,List,Set)에 해당하고, 기본 데이터 타입인 int, boolean, char 등등에서는 재할당이 안되니 값을 변경할 수 있는 방법이 없다. 위의 예제에서 쓴 logger의 경우도 값이 변할 일이 없어보인다.
정리: 그럼 상수로 사용할 때, private static final인가?
private static final을 선언한 변수를 사용하면 재할당하지 못하며, 메모리에 한 번 올라가면 같은 값을 클래스 내부의 전체 필드, 메서드에서 공유한다.
private final을 선언한 변수를 사용하면 재할당하지 못하며, 해당 필드, 메서드별로 호출할 때마다 새로이 값이 할당(인스턴스화)한다.
그렇다면 상수로 사용하려고 할 때, 그 값은 변하지 않을 것인데 호출할 때마다 새롭게 인스턴스화할 필요가 없다. 한 번 메모리에 올려놓고 계속 같은 값을 갔다쓰면 될 일이다.
출처 :
https://zorba91.tistory.com/275
[Java] 왜 private 상수는 관습적으로 private static final로 선언할까?
private static final과 private final의 차이 public으로 사용하는 상수 타입은 enum을 이용하고 있다. 클래스 내부에서만 간단하게 사용할 상수를 만들 때, 아무 생각 없이 private static final을 사용하고 있는
zorba91.tistory.com