public class Day {
private static final int MONDAY = 1;
private static final int TUESDAY = 2;
private static final int WEDNESDAY = 3;
...
}
자바 클래스 내부에서 상수를 정의할 때 관례적으로 private static final을 사용한다
이렇게 선언하면 장점이 무엇이고, 왜 관례가 되었는지 한 번 알아보려고 한다!
static이란?
static은 클래스마다 하나만 만들어지는 정적인 것이다.
- 클래스에 static변수를 만들면 객체가 만들어질 때마다 만들어지지 않고, 클래스마다 각각 하나씩만 만들어진다.
- static변수는 클래스가 로딩될 때 메모리에 올라가고, 객체 생성 및 삭제와 관계없이 프로그램이 종료될 때까지 살아있게 된다
- static변수는 객체가 만들어지지 않아도 접근 및 사용이 가능하다.
- Day.staticMethod();
- Day.staticValue
- 그래서 어떤 곳에서 static변수를 변경하면 다른 사용하는 곳에서도 해당 변경에 대해 영향을 받음
static을 사용한다는 의미는 해당 값 또는 메서드를 공유한다는 의미이다.
Final이란?
final은 해당 값이 오직 한 번만 할당될 수 있다는 의미이다.
final로 지정한 변수는 최초 초기화 이후 다시 재할당이 불가능하다.
public class Class {
private final List<Integer> list = new ArrayList<>();
public void method() {
list.add(1); //에러가 발생하지 않음
System.out.println(list.get(0));
}
}
final의 경우 재할당은 불가능하다. 하지만 값의 변경은 가능하다!
다음과 같이 final 변수가 Collection 타입의 경우 추가 및 삭제가 가능하다
public class Class {
private final int value = 1;
public void method() {
value = 3; //에러 발생
}
}
하지만 Collection 타입이 아닌 기본 데이터타입의 경우 무조건 재할당을 해야하기 때문에 final로 설정할 경우 변경이 불가능하다.
static과 final을 같이쓰면 장점
- 클래스마다 한 번만 만들어짐 -> static
- 기본 데이터타입의 경우 재할당하지 못하기 때문에 값이 변경되지 않음 -> final
- 상수는 변하지 않는 값이기 때문에 final을 쓰는 게 맞다
- 그렇다고 final만 쓸 경우 새로운 인스턴스가 생성될 때마다 변수가 할당된다
=> 이렇게 계속 값을 만들 이유도 없고 메모리 낭비다! 메모리에 한 번만 올려두고 계속 재사용하는 게 더 효율적이다 - static으로 지정하면 메모리에 한 번만 할당되고, 재활용이 가능하다
그러므로 메모리에 한 번 올려놓고 계속 재활용이 가능하도록 하고, 값이 변하지 않도록 상수에는 static과 final을 같이 쓰는 게 좋겠다.
private는 필수인가?
구글링을 열심히 해봤지만 static과 final은 필수이지만, private이 필수라는 말은 없었다.
외부에서도 해당 상수를 사용한다면 public으로 지정해도 될 것 같다.
참고자료들
https://zorba91.tistory.com/275
[Java] 왜 private 상수는 관습적으로 private static final로 선언할까?
private static final과 private final의 차이 public으로 사용하는 상수 타입은 enum을 이용하고 있다. 클래스 내부에서만 간단하게 사용할 상수를 만들 때, 아무 생각 없이 private static final을 사용하고 있는
zorba91.tistory.com
https://devbox.tistory.com/entry/Java-static
[Java] static
staticstatic이라는 의미는 ‘정적인, 움직이지 않는다.’는 뜻이다. 메모리에서 고정되기 때문에 붙은 이름이지만, 실제 소스에서 static을 사용한다는 의미는 모든 객체가 ‘공유’한다는 의미이
devbox.tistory.com
'프로그래밍 언어 > Java' 카테고리의 다른 글
[JAVA] 상수와 enum 공부하기2 (0) | 2023.11.07 |
---|---|
[JAVA] 상수와 enum 공부하기1 (0) | 2023.11.07 |
[JAVA] 단위테스트 공부3: 활용하기 (0) | 2023.11.01 |
[JAVA] 클래스 내부 속성으로 가지고 있는 객체를 mock으로 설정하는 방법: @InjectMock이 동작하지 않는 이유 (0) | 2023.11.01 |
[우테코] 2주차 Test코드 분석 - NsTest, assertj, JUnit (0) | 2023.10.30 |