어제 오늘 내일

[Java] final 키워드 (변수, 메서드, 클래스) 본문

IT/Java

[Java] final 키워드 (변수, 메서드, 클래스)

hi.anna 2025. 12. 25. 00:54

 

Java에서 final 키워드는 더 이상 변경할 수 없도록 제한하는 역할을 합니다.
final은 변수, 메서드, 클래스에 모두 적용할 수 있으며, 적용 대상에 따라 의미가 달라집니다.
이 글에서는 각각의 의미와 활용 예제를 쉽게 정리합니다.

 

1. final 변수 — 값 변경 불가

final이 변수에 붙으면 값을 한 번만 설정할 수 있고 이후 변경할 수 없습니다.

1-1. 기본 예

final int age = 20;
// age = 30; // ❌ 오류: final 변수는 값 변경 불가

1-2. 초기화는 반드시 한 번만

final String name;
name = "Tom";   // ✔ 최초 1회 설정 가능
// name = "Alice"; // ❌ 다시 변경 불가

1-3. final 참조 변수

참조 변수(객체)에 final을 붙이면 참조 자체는 변경 불가지만, 객체 내부 값은 변경 가능합니다.

final Person p = new Person("Tom");
p.name = "Alice";    // ✔ 내부 값 변경 가능
// p = new Person("Bob"); // ❌ 참조 변경 불가

핵심

  • final = “참조를 바꾸지 못한다”
  • 객체 내부 상태 변경은 가능

 

2. final 메서드 — 오버라이딩 금지

final이 메서드에 붙으면 자식 클래스가 메서드를 오버라이딩할 수 없습니다.

class Parent {
    final void hello() {
        System.out.println("Hello");
    }
}

class Child extends Parent {
    // @Override
    // void hello() {} // ❌ 오버라이딩 불가
}

언제 사용할까?

  • 핵심 로직을 자식 클래스가 변경하지 못하도록 보호해야 할 때
  • 설계상 반드시 동일하게 유지해야 하는 기능을 명시할 때

 

3. final 클래스 — 상속 금지

final이 클래스에 붙으면 해당 클래스를 상속할 수 없습니다.

final class Animal { }

// class Dog extends Animal {} // ❌ 오류: final 클래스는 상속 불가

final 클래스를 언제 사용할까?

  • 더 이상 확장 가능하게 하고 싶지 않을 때
  • 안전성, 보안성, 불변성을 보장해야 할 때
    (대표 예: String 클래스는 final)

 

4. final 키워드 정리

적용 대상 의미

적용대상 의미
변수 값 변경 불가 (참조 변수는 주소 불변)
메서드 오버라이딩 불가
클래스 상속 불가

 

5. 전체 예제

final class Person {
    final String name;

    Person(String name) {
        this.name = name; // final 변수 초기화
    }

    final void introduce() { // 오버라이딩 불가
        System.out.println("My name is " + name);
    }
}

public class Main {
    public static void main(String[] args) {
        Person p = new Person("Tom");
        p.introduce();
    }
}

결과:

My name is Tom

 

 

6. 언제 final을 사용할까?

  • 변수
    → 값이 변경되면 안 되거나, 안전한 값 유지가 중요할 때
  • 메서드
    → 상속 구조에서 특정 기능의 변경을 막고 싶을 때
  • 클래스
    → 절대 확장되지 않도록 설계하고 싶을 때 (ex: String)

 

 

반응형
Comments