포스트

자바 변수에서 final

자바 변수에서 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은 단순한 문법 요소가 아닙니다.
한 번 정한 값을 지켜 코드의 일관성과 신뢰성을 높이는 장치입니다.
불변성을 명확히 선언함으로써, 멀티스레드 환경에서도 예측 가능한 코드를 유지할 수 있습니다.


요약

  • 변수: 한 번만 초기화

  • 메서드: 오버라이딩 불가

  • 클래스: 상속 불가

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.