자바

final 키워드 특징

Blue_bull 2025. 2. 8. 23:58

🚀 final이란?

final변경할 수 없도록 제한하는 키워드입니다.
Java에서 final변수, 메서드, 클래스에 적용될 수 있으며, 각각의 의미가 다릅니다.


✅ 1️⃣ final 변수 (변경 불가능한 값)

final이 붙은 변수는 한 번만 값을 설정할 수 있고, 이후 변경할 수 없음.
✔ 선언과 동시에 초기화하거나, 생성자에서 한 번만 초기화 가능.

📌 예제 (선언과 동시에 초기화)

public class Example {
    private final int number = 10; // ✅ 한 번 초기화, 변경 불가

    public void changeValue() {
        // number = 20; // ❌ 오류 발생 (final 변수는 변경 불가능)
    }
}

📌 예제 (생성자에서 초기화)

public class Example {
    private final int number;

    public Example(int num) {
        this.number = num; // ✅ 생성자에서 초기화 가능
    }

    public void changeValue() {
        // number = 30; // ❌ 오류 발생 (한 번 초기화 후 변경 불가)
    }
}

✔ 생성자를 이용하면 객체마다 다른 값을 설정할 수 있음.
✔ 하지만 객체가 생성된 후에는 값을 변경할 수 없음.


✅ 2️⃣ final 메서드 (오버라이딩 불가)

final이 붙은 메서드는 하위 클래스에서 재정의(오버라이딩)할 수 없음.
✔ 부모 클래스의 동작을 변경하지 않도록 보호할 때 사용.

📌 예제

class Parent {
    public final void show() {
        System.out.println("Parent class method");
    }
}

class Child extends Parent {
    // ❌ 오류 발생! (오버라이딩 불가능)
    // public void show() {
    //     System.out.println("Child class method");
    // }
}

final 메서드는 자식 클래스에서 수정할 수 없음.
보안이 중요한 로직이나 변경하면 안 되는 동작을 보호할 때 사용.


✅ 3️⃣ final 클래스 (상속 불가)

final이 붙은 클래스는 상속할 수 없음.
✔ 다른 클래스가 이 클래스를 확장(extends)하지 못하도록 제한.

📌 예제

final class FinalClass {
    public void display() {
        System.out.println("This is a final class");
    }
}

// ❌ 오류 발생! (상속 불가능)
// class SubClass extends FinalClass { }

FinalClass상속이 금지됨 → 보안이 필요한 클래스에서 사용됨.
✔ 대표적인 예: java.lang.String, java.lang.Mathfinal 클래스이므로 상속할 수 없음.


✅ 4️⃣ final + static (상수 만들기)

finalstatic을 함께 사용하면 클래스 단위의 상수를 만들 수 있음.
static final 변수는 변경할 수 없고, 모든 객체가 공유함.

📌 예제

public class Constants {
    public static final double PI = 3.141592;
}

PI한 번 초기화된 후 변경할 수 없음.
✔ 모든 곳에서 Constants.PI로 사용 가능 → 전역 상수 역할.


🚀 final 요약 정리

사용 대상 의미 특징
변수 값 변경 불가능 한 번만 초기화 가능
메서드 오버라이딩 불가능 자식 클래스에서 재정의할 수 없음
클래스 상속 불가능 다른 클래스가 확장할 수 없음
static final 상수 변경할 수 없는 공통 값

🎯 결론

final은 변경할 수 없도록 제한하는 키워드.
변수 → 값 변경 불가능, 한 번만 초기화 가능.
메서드 → 오버라이딩 불가능.
클래스 → 상속 불가능.
static final → 상수 역할.

📌 final을 활용하면 코드의 안정성을 높이고, 불필요한 변경을 방지할 수 있음! 🚀

final 필드는 객체가 생성될 때 한 번만 초기화할 수 있으며, 이후에는 변경할 수 없습니다.
즉, 객체가 생성될 때(new로 생성될 때) final 필드는 반드시 한 번 초기화되어야 합니다.


✅ 1️⃣ final 필드의 초기화 방법

Java에서 final 필드는 한 번만 값을 설정할 수 있으며, 이후 변경이 불가능합니다.
초기화 방법은 다음 3가지가 있습니다.

📌 (1) 선언과 동시에 초기화

public class Example {
    private final int number = 10; // ✅ 선언과 동시에 초기화

    public Example() {
        // number = 20; // ❌ 오류! 이미 초기화되었으므로 변경 불가
    }

    public int getNumber() {
        return number;
    }
}

final 필드는 선언과 동시에 값을 설정할 수 있음.
✔ 생성자에서 다시 값을 할당하는 것은 불가능! (number = 20; → 오류 발생)


📌 (2) 생성자를 통해 초기화 (객체마다 다른 값 설정 가능)

public class Example {
    private final int number; // ✅ 선언만 하고 생성자에서 초기화

    public Example(int number) {
        this.number = number; // ✅ 생성자에서 초기화 (객체마다 다른 값 가능)
    }

    public int getNumber() {
        return number;
    }

    public static void main(String[] args) {
        Example ex1 = new Example(10);
        Example ex2 = new Example(20);

        System.out.println(ex1.getNumber()); // 10
        System.out.println(ex2.getNumber()); // 20
    }
}

✔ 생성자를 통해 객체마다 다른 값을 설정 가능.
✔ 단, 생성자에서 final 필드를 한 번도 초기화하지 않으면 오류 발생!

🚨 오류 예제 (초기화하지 않음)

public class Example {
    private final int number; // ❌ 오류 발생 (생성자에서 초기화하지 않음)

    public Example() {
        // number = 10; // 초기화해야 오류가 없음!
    }
}

final 필드는 반드시 한 번 초기화해야 하므로, 생성자에서 값을 설정하지 않으면 컴파일 오류 발생.


📌 (3) 정적 final 필드 (클래스 단위 상수)

public class Example {
    public static final double PI = 3.141592; // ✅ static final로 선언

    public static void main(String[] args) {
        System.out.println(Example.PI); // 3.141592
    }
}

static final 필드는 클래스 로딩 시 한 번만 초기화됨.
객체마다 다른 값이 아니라, 모든 객체가 동일한 값을 공유.
한 번 설정된 값은 변경할 수 없음.
✔ 보통 상수(const) 역할을 할 때 사용됨. (public static final)


✅ 2️⃣ final 필드의 특징 정리

초기화 방법 가능 여부 설명
선언과 동시에 초기화 ✅ 가능 final int a = 10;
생성자에서 초기화 ✅ 가능 this.a = 값; (객체마다 다른 값 가능)
static 블록에서 초기화 ✅ 가능 static final 필드일 경우
객체 생성 후 값 변경 ❌ 불가능 a = 20; → 오류 발생!

🚀 결론

final 필드는 객체가 생성될 때 반드시 초기화되어야 하며, 이후 변경할 수 없음.
선언과 동시에 초기화하거나, 생성자를 통해 초기화해야 함.
생성자를 통한 초기화는 객체마다 다른 값을 설정할 수 있음.
static final 필드는 클래스 로딩 시 한 번만 초기화됨 (상수 역할).

📌 즉, final 필드는 한 번만 설정 가능하지만, 객체가 생성될 때 초기화하는 방법은 유연하게 선택할 수 있음! 🚀