728x90
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
https://devbox.tistory.com/entry/Java-static
728x90
'프로그래밍 언어 > 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 |