본문 바로가기

Java 기본 문법 - 참조 서적 [이것이 자바다 - 한빛미디어]/4. 객체지향 프로그래밍

8. Java 자바 - final 필드와 상수

final 필드

 

최종적인 필드

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

 

1. final 필드 선언

 

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

 

final 필드에 초기값을 줄 수 있는 방법은 딱 2 가지 뿐

 

- 필드 선언 시에 주는 방법

 

- 생성자에서 주는 방법

 

단순 값이라면 필드 선언 시 초기화가 간단하다.

 

복잡한 초기화 코드가 필요하거나 객체 생성 시 외부 데이터로 초기화해야 한다면,

생성자에서 초기값을 지정해야 한다.

 

생성자는 final 필드의 최종 초기화를 마쳐야 하므로, 초기화가 되지 않은 final 필드가 남아있으면

컴파일 에러가 발생한다.

 

ex) 주민등록번호는 Person 객체가 생성될 때 부여되므로 초기값을 미리 줄 수 없다.

따라서 생성자의 매개값으로 주민등록번호를 받아서 초기값으로 지정한다.

nation은 항상 고정된 값을 가지기 때문에 필드 선언 시 초기값으로 "Korea" 지정한다.

 

Person.java

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

 

PersonExample.java

public class PersonExample {
    public static void main(String[] args) {
        Person p1 = new Person("123456-1234567", "케피");
        
        System.out.println(p1.nation);   // Korea
        System.out.println(p1.ssn);      // 123456-1234567
        System.out.println(p1.name);     // 케피
        
        //p1.nation = "usa";             // final 필드 값은 수정 불가!! 컴파일 에러
        //p1.ssn = "123523-1234534";
        p1.name = "배찌";                // 인스턴스 필드 : 수정 가능
    }
}

 

 

2. 상수 (static final)

 

불변의 값

 

수학에서의 파이(3.14), 지구의 둘레 값 등... 불변의 값을 저장하는 필드는 상수(constant)라고 한다.

 

그렇다면, final 필드를 상수라고 불러도 되지 않을까?

 

NO, final 필드를 상수라고 부르지 않는다.

 

불변의 값은 객체마다 저장할 필요가 없는 공용성을 띄고 있고,

여러 가지 값으로 초기화될 수 없기 때문이다. (오직 하나의 값을 가지기 때문에 final 필드와 거리가 멀다.)

 

final 필드는 객체마다 저장되고, 생성자의 매개값을 통해 여러 가지 값을 가질 수 있다. (상수가 될 수 없다.)

 

즉 상수는 static (공용성) 이면서 final (수정 불가) 이어야 한다.

 

static final 필드는 객체마다 저장되지 않고, 클래스에만 포함되고, 한 번 초기화되면 변경할 수 없다.

 

 

상수 선언 방식

 

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

 

복잡한 초기화일 경우 정적 블록에서도 초기화 할 수 있다.

 

static final 타입 상수;

static {           // 정적 블록 사용 가능
    상수 = 초기값;
}

 

상수 이름은 모두 대문자, 서로 다른 단어 혼합 시 ( _ ) 기호로 이어준다.

 

static final double PI = 3.141592;
static final double EARTH_AREA;

 

ex) Earth.java : 상수 선언

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;  //Math.PI는 자바에서 제공하는 상수
    }
}

 

EarthExample.java : 상수 사용

public class EarthExample {
    public static void main(String[] args) {
        System.out.println("지구 반지름 : "+ Earth.EARTH_RADIUS + "km");
        System.out.println("지구 표면적 : "+ Earth.EARTH_SURFACE_AREA + " km^2");
    }
}