본문 바로가기

Java 길찾기/이것이 자바다

[Java] final 필드와 상수

final 필드

final의 의미는 마지막이라는 뜻을 가지고 있다. 그렇다면 final 필드는 마지막의 필드라는 뜻인데, 무슨 말일까? final 필드는 초기값이 저장되면 이것이 최종적인 값이 되어서 프로그램 실행 도중에 수정할 수 없다는 것이다. final 필드는 다음과 같이 선언한다.

final 타입 필드 [= 초기값];

 

final 필드의 초기값을 줄 수 있는 방법은 딱 두가지 밖에 없다. 첫 번째는 필드 선언 시에 주는 방법이고, 두 번째는 생성자에서 주는 방법이다. 단순 값이라면 필드 선언 시에 주는 것이 제일 간단하다. 하지만 복잡한 초기화 코드가 필요하거나 객체 생성 시에 외부 데이터로 초기화해야 한다면 생성자에서 초기값을 지정해야 한다. 생성자는 final 필드의 최종 초기화를 마쳐야 하는데, 만약 초기화 되지 않은 final 필드를 그대로 남겨두면 컴파일 에러가 발생한다.

다음 예제를 보자. 주민등록번호 필드는 한 번 값이 저장되면 변경할 수 없도록 final 필드로 선언했다. 하지만 주민등록번호는 Person 객체가 생성될 때 부여되므로 Person 클래스 설계시 초기값을 미리 줄 수 없다. 그래서 생성자 매개값으로 주민등록번호를 받아서 초기값으로 지정해주었다. 반면 nation은 항상 고정된 값을 갖기 때문에 필드 선언 시 초기값으로 "Korea"를 주었다.

public class Person {
    final String nation = "Korea";
    final String ssn;
    String name;
    
    public Person(String ssn, String name) {
        this.ssn = ssn;
        this.name = name;
    }
}

 

상수(static final)

일반적으로 불변의 값을 상수라고 부른다. 불변의 값은 수학에서 사용되는 원주율 파이()나, 지구의 무게 및 둘레 등이 해당된다. 이런 불변의 값을 저장하는 필드를 자바에서는 상수라고 한다. fianl 필드는 한 번 초기화되면 수정할 수 없는 필드라고 했다. 그렇다면 final 필드를 상수라고 불러도 되지 않을까? 하지만 final 필드를 상수라고 부르진 않는다. 왜냐하면 불변의 값은 객체마다 저장할 필요가 없는 공용성을 띠고 있으며, 여러가지 값으로 초기화될 수 없기 때문이다. final 필드는 객체마다 저장되고, 생성자의 매개값을 통해서 여러가지 값을 가질 수 있기 때문에 상수가 될 수 없다. 객체마다 저장할 필요가 없는 공용성을 띤다는 말이 중요하다고 생각한다. 상수는 static이면서 final이어야 한다. static final 필드는 객체마다 저장되지 않고, 클래스에만 포함된다. 그리고 한 번 초기값이 저장되면 변경할 수 없다.

static final 타입 상수 [= 초기값];

 

초기값이 단순 값이라면 선언 시에 주는 것이 일반적이지만, 복잡한 초기화일 경우 정적 블록에서도 할 수 있다.

static final 타입 상수;
static {
    상수 = 초기값;
}

 

상수 이름은 모두 대문자로 작성하는 것이 관례이다. 만약 서로 다른 단어가 혼합된 이름이라면 언더바( _ )로 단어들을 연결해준다. 다음은 상수 필드를 올바르게 선언한 예를 보여준다.

public class Earth {
    static final double EARTH_RADIUS = 6400;
    static final double EARTH_SURFACE_AREA;
    
    static {
        EARTH_SURFACE_AREA = 4 * Math.PI * EARTH_RADIUS * EARTH_RADIUS;
    }
}

 

'Java 길찾기 > 이것이 자바다' 카테고리의 다른 글

[Java] 접근 제한자  (0) 2022.01.14
[Java] 패키지  (0) 2022.01.13
[Java] 정적 멤버와 static  (0) 2022.01.11
[Java] 인스턴스 멤버와 this  (0) 2022.01.10
[Java] 클래스의 구성 멤버 (2)  (2) 2022.01.07