Java static, static final, final 차이
자바의 static, static final, final은 종종 헷갈릴 수 있는 제어자로 코드를 통해 어떻게 다른지 확인해보겠습니다.
예시 코드
public class Account {
static double rate = 1.5;
static final int odLimit = 1000;
final int accountId;
public Account(int id) {
accountId = id;
}
public static void main(String[] args) {
Account first = new Account(123);
Account second = new Account(456);
// The following prints 123
System.out.println(first.accountId);
// The following prints 456
System.out.println(second.accountId);
// Next line triggers a compile error
// first.accountId = 789;
//static 변수 변경. Account.rate 1.5 -> 3.5로 변경
Account.rate = 3.5;
System.out.println("Account.rate:" + Account.rate);
//Next line triggers a compile error
//Account.odLimit = 2000;
}
}
static
static 키워드를 가진 멤버는 값이 클래스의 모든 인스턴스에 대해 동일합니다.
클래스의 모든 인스턴스가 액세스할 수 있는 전역 변수라고 볼 수 있습니다. 그러나 static 변수는 상수가 아니므로 언제나 변경될 수 있습니다.
- 때때로 static 을 설명할 때 단 한 번 초기화 된다는 문구를 볼 수 있는데요. 해당 부분을 확인해봐야겠습니다.
- static 변수가 생성되는 메모리 위치와 실행순서 확인하기.
- 클래스로더에 의해서 initialize 단계에서 생성되는 것으로 알고 있다.
static final
변경할 수 없고 클래스의 모든 인스턴스에 대해 동일한 값을 설정할 때는 static final을 사용해야 합니다.
static 키워드는 값이 클래스의 모든 인스턴스에 대해 동일함을 의미합니다. final 키워드는 변수에 값이 할당되면 절대 변경할 수 없음을 의미합니다. Java에서 static final의 조합은 클래스 변수의 상수 값을 만드는 방법입니다.
final
final이 붙은 변수는 상수이므로 일반적으로 선언과 초기화를 동시에 합니다. 하지만 인스턴스 변수의 경우 생성자에서 초기화할 수 있습니다.
그 이유는 인스턴스가 new 키워드로 힙에 생성될 때 처음엔 변수 타입의 기본값으로 할당된 후 각 인스턴스에서 설정한 값으로 초기화 되기 때문입니다.
그러므로 accountId가 final이더라도 각 개별 Account 인스턴스는 고유한 값을 가질 수 있습니다.
추가로 자바 메모리 할당 과정과 JVM에 대해 작성한 글도 확인해보세요.
참고자료
'Java관련 > Java' 카테고리의 다른 글
Java 클래스 (0) | 2022.09.30 |
---|---|
Java 예외 처리 (0) | 2022.09.29 |
자바 상속의 메모리 할당 과정 (0) | 2022.09.05 |
Java 상속, 오버라이딩, 다이나믹 메소드 디스패치 (0) | 2022.08.29 |
JVM과 자바 실행 과정 알아보기 (2) | 2022.08.07 |
댓글