특성 | static | final | static final |
---|---|---|---|
인스턴스간 공유 가능 여부 | O | X | O |
필드값 초기화 이후 변경 가능 여부 | O | X | X |
static : 정적인, 고정된.
클래스의 인스턴스간 공유되는 공용 멤버. 필드값 초기화 이후 변경 가능.
정적 멤버 : 클래스에 고정된 멤버.
객체를 생성하지 않고 사용할 수 있는 필드와 메소드.
정적 필드, 정적 메소드라고 한다.
정적 멤버는 객체(인스턴스)에 소속된 멤버가 아니라, 클래스에 소속된 멤버이다.
클래스 로더가 클래스(바이트 코드)를 로딩해서 메소드 메모리 영역에 적재할 때 클래스별로 관리된다. 따라서 클래스의 로딩이 끝나면 별도의 인스턴스 생성 필요없이 바로 사용할 수 있다.
각 객체마다 개별적으로 가지고 있어야 할 데이터 : 인스턴스 필드로 선언.
각 객체마다 개별적으로 가지고 있을 필요성이 없는 공용의 데이터 : 정적 필드로 선언.
정적 필드는 다음과 같이 필드 선언과 동시에 초기값을 주는 것이 보통이다.
static double pi = 3.1459;
하지만 계산이 필요한 초기화 작업이 있을 수도 있다. 정적 필드는 객체 생성 없이도 사용해야 하므로 생성자에서 초기화 작업을 할 수 없다. 따라서 정적 필드의 초기화 작업은 다음과 같이 정적 블록(static block)에서 해야 한다.
public class 클래스이름 {
static 타입 정적필드이름A;
static {
// 초기화
정적필드이름A = 초기값;
}
}
정적 블록은 클래스가 메모리로 로딩될 때 자동적으로 실행된다. 클래스 내부에 여러개가 선언되어도 상관없다. 클래스가 메모리로 로딩될 때, 선언된 순서대로 실행된다.
final : 최종적인. 결코 수정될 수 없음.
최종값. 고정값. 초기화 이후 변경 불가능. 인스턴스간 공유 불가.
초기값이 저장되면 이것이 최종적인 값이 된다.
즉, 프로그램 실행 도중에 수정할 수 없다.
final 필드 초기화 방법
필드 선언 시에 초기화.
생성자에서 초기화.
초기화되지 않은 final 필드를 그대로 남겨두면 컴파일 에러가 발생한다.
클래스 또는 메소드에 final이 지정되면 상속과 관련이 있다.
final class : 최종적인 클래스이므로 상속할 수 없는 클래스이다.
final method : 최종적인 메소드이므로 오버라이딩 할 수 없다. 즉, 하위 클래스에서 그대로 써야한다.
인스턴스간 공유 가능. 초기화 이후 변경 불가.
static block에서 초기화 가능.
참조 : 책 '이것이 자바다'