자바 변수에서 final
자바 final 키워드 완벽 이해
자바에서 final은 “값을 한 번만 할당할 수 있다”는 의미를 가진 키워드입니다.
즉, 한 번 정해진 값이나 정의는 이후에 변경할 수 없습니다.
이 단어 하나로 코드의 안정성과 의도를 명확히 표현할 수 있기 때문에, 실무에서도 자주 사용됩니다.
1. 예제 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Person {
final String nation = "Korea";
final String name;
int age;
Person(String name, int age) {
this.name = name;
this.age = age;
}
}
public class Main {
public static void main(String[] args) {
Person p = new Person("Kim", 20);
System.out.println(p.nation);
System.out.println(p.name);
System.out.println(p.age);
}
}
출력 결과
1
2
3
Korea
Kim
20
2. 코드 분석
이 코드의 핵심은 final이 붙은 필드들이 언제 초기화되는가입니다.
| 필드 | 초기화 시점 | 변경 가능 여부 | 설명 |
|---|---|---|---|
nation | 선언 시 즉시 | 불가능 | 모든 객체가 동일한 값 보유. 상수처럼 동작 |
name | 생성자에서 | 불가능 | 객체마다 다른 값 가능. 한 번만 할당 가능 |
age | 자유롭게 | 가능 | 일반 변수처럼 수정 가능 |
final 필드는 한 번만 초기화되면 절대 바꿀 수 없습니다.
예를 들어 p.nation = "USA"; 같은 코드는 컴파일 오류가 납니다.
3. final 변수
final이 변수에 붙으면 다음과 같이 동작합니다.
1
2
3
4
void method() {
final int x = 10;
// x = 20; // 오류 발생
}
지역 변수일 경우에도 한 번 초기화된 이후에는 값을 바꿀 수 없습니다.
즉, 읽기 전용 값이 됩니다.
클래스 멤버 변수라면 생성자에서 한 번만 초기화할 수 있습니다.
1
2
3
4
5
6
7
class Example {
final int value;
Example(int v) {
value = v; // 여기서 한 번만 가능
}
}
이 방식은 객체 생성 시 불변 상태를 보장하는 데 자주 사용됩니다.
4. final 메서드
1
2
3
4
5
6
7
8
9
class Parent {
final void greet() {
System.out.println("Hello");
}
}
class Child extends Parent {
// void greet() {} // 컴파일 오류 – 오버라이딩 불가
}
final 메서드는 하위 클래스에서 오버라이딩할 수 없습니다.
즉, 부모 클래스의 동작을 그대로 유지해야 할 때 사용합니다.
5. final 클래스
1
2
3
4
5
6
7
final class Utility {
static void print() {
System.out.println("Utility class");
}
}
// class MyUtil extends Utility {} // 오류 – 상속 불가
final 클래스는 상속 자체를 막습니다.
대표적인 예로 String, Math, Integer 클래스가 있습니다.
한 번 만들어진 형태를 그대로 유지해야 할 때 사용합니다.
6. 정리
| 구분 | 예시 | 의미 |
|---|---|---|
final 변수 | final int a = 10; | 한 번만 초기화 가능 |
final 메서드 | final void run() | 오버라이딩 불가 |
final 클래스 | final class MyClass | 상속 불가 |
7. 실무에서의 활용
상수 정의 시
public static final조합으로 선언 (Math.PI등)불변 객체 설계 시
모든 필드를final로 선언API 안정성 확보 시
변경되면 안 되는 클래스나 메서드에final적용
8. 마무리
final은 단순한 문법 요소가 아닙니다.
한 번 정한 값을 지켜 코드의 일관성과 신뢰성을 높이는 장치입니다.
불변성을 명확히 선언함으로써, 멀티스레드 환경에서도 예측 가능한 코드를 유지할 수 있습니다.
요약
변수: 한 번만 초기화
메서드: 오버라이딩 불가
클래스: 상속 불가