static, final, static final

김태희·2020년 12월 1일
1
특성staticfinalstatic final
인스턴스간 공유 가능 여부OXO
필드값 초기화 이후 변경 가능 여부OXX

static


static : 정적인, 고정된.

클래스의 인스턴스간 공유되는 공용 멤버. 필드값 초기화 이후 변경 가능.

정적 멤버 : 클래스에 고정된 멤버.

객체를 생성하지 않고 사용할 수 있는 필드와 메소드.

정적 필드, 정적 메소드라고 한다.

정적 멤버는 객체(인스턴스)에 소속된 멤버가 아니라, 클래스에 소속된 멤버이다.

클래스 로더가 클래스(바이트 코드)를 로딩해서 메소드 메모리 영역에 적재할 때 클래스별로 관리된다. 따라서 클래스의 로딩이 끝나면 별도의 인스턴스 생성 필요없이 바로 사용할 수 있다.


  • 각 객체마다 개별적으로 가지고 있어야 할 데이터 : 인스턴스 필드로 선언.

  • 각 객체마다 개별적으로 가지고 있을 필요성이 없는 공용의 데이터 : 정적 필드로 선언.


정적 초기화 블록

정적 필드는 다음과 같이 필드 선언과 동시에 초기값을 주는 것이 보통이다.

static double pi = 3.1459;

하지만 계산이 필요한 초기화 작업이 있을 수도 있다. 정적 필드는 객체 생성 없이도 사용해야 하므로 생성자에서 초기화 작업을 할 수 없다. 따라서 정적 필드의 초기화 작업은 다음과 같이 정적 블록(static block)에서 해야 한다.

public class 클래스이름 {
    static 타입 정적필드이름A;
    
    static {
        // 초기화
        정적필드이름A = 초기값;
    }
}

정적 블록은 클래스가 메모리로 로딩될 때 자동적으로 실행된다. 클래스 내부에 여러개가 선언되어도 상관없다. 클래스가 메모리로 로딩될 때, 선언된 순서대로 실행된다.


final 필드와 상수


final

final : 최종적인. 결코 수정될 수 없음.

최종값. 고정값. 초기화 이후 변경 불가능. 인스턴스간 공유 불가.

초기값이 저장되면 이것이 최종적인 값이 된다.
즉, 프로그램 실행 도중에 수정할 수 없다.

final 필드 초기화 방법

  • 필드 선언 시에 초기화.

  • 생성자에서 초기화.

    • 복잡한 초기화 코드가 필요할 때
    • 객체 생성 시, 외부 데이터로 초기화해야 할 때.

초기화되지 않은 final 필드를 그대로 남겨두면 컴파일 에러가 발생한다.

클래스 또는 메소드에 final이 지정되면 상속과 관련이 있다.

  • final class : 최종적인 클래스이므로 상속할 수 없는 클래스이다.

  • final method : 최종적인 메소드이므로 오버라이딩 할 수 없다. 즉, 하위 클래스에서 그대로 써야한다.


상수(static final)

인스턴스간 공유 가능. 초기화 이후 변경 불가.

static block에서 초기화 가능.



참조 : 책 '이것이 자바다'

profile
Web Back-End (Spring, JPA, AWS)

0개의 댓글