final은 개발할 때 많이 접하고 익숙하지만, 언제 왜 사용하는지는 깊게 생각해본 적이 없었다. 기술 면접을 보았을 때, 면접관님께서 final을 언제 사용하냐는 말씀에 확신을 가지지 않은 채로 대답을 했었다. 이번 기회에 확실히 개념 정리를 해보고자 한다.
🌱 final 필드
final : [형] 최종적인
final 필드라고 하면 최종적인 필드라는 뜻이 된다.
이 말은 무슨 말일까?
final 필드는 초기값이 저장되면 이것이 최종적인 값이 되어서 프로그램 실행 도중에 수정 할 수 없다는 뜻이다.
선언은 다음과 같이 한다.
final 타입 필드 [= 초기값 ];
final 필드의 초기값을 줄 수 있는 방법은 2가지가 있다.
1. 필드 선언시에 주는 방법
2. 생성자에서 주는 방법
다음은 final의 예시이다.
public class Person {
final String nation = "Korea";
final String ssn; // 주민등록번호
String name;
public Person(String ssn, String name) {
this.ssn = ssn;
this.name = name;
}
}
public class PersonExample {
public static void main(String[] args) {
Person p1 = new Person("123456-789456", "sunny");
System.out.println(p1.nation); // 결과값 : Korea
System.out.println(p1.ssn); // 결과값 : 123456-789456
System.out.println(p1.name); // 결과값 : sunny
//p1.nation = "Japan"; // final 필드 수정 불가
//p1.ssn = "455523-982234"; // final 필드 수정 불가
p1.name = "nature";
}
}
🌱 상수(static final)
일반적으로 불변의 값을 상수라고 한다.
(ex. 원주율 파이, 지구의 무게)
이러한 불변의 값을 저장하는 필드를 자바에서는 상수(constant)라고 한다.
❓final 필드는 한 번 초기화되면 수정할 수 없는 필드라고 했는데, 상수라고 불러도 되지 않을까?
이에 대한 답은 'No'이다.
불변의 값은 객체마다 저장할 필요가 없는 공용성을 띠고 있으며, 여러 가지 값으로 초기화될 수 없기 때문이다. 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;
}
}
//상수 사용
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");
}
}