본문 바로가기
Java

[Java] final

by goblin- 2024. 9. 28.

final 키워드는 자바에서 변경 불가능성을 나타내며, 클래스, 메서드, 변수에 적용될 수 있습니다. 이 키워드는 사용되는 위치에 따라 동작이 다르게 나타납니다.

 

1. final 키워드의 사용

 

1.1 final 변수

 

설명: final 변수는 값을 한 번만 할당할 수 있으며, 그 이후에는 변경할 수 없습니다.

특징: 한 번 초기화되면, 해당 변수는 재할당할 수 없습니다. 상수로 사용될 때 유용합니다.

 

예시: final 변수

final int MAX_VALUE = 100;
MAX_VALUE = 200;  // 오류 발생: 값 변경 불가

상수 필드의 경우, 보통 final과 함께 static 키워드를 사용하여 클래스 수준에서 상수를 정의합니다.

 

1.2 final 참조 변수

 

설명: 객체 참조에 **final**을 사용할 경우, 해당 참조가 가리키는 객체를 변경할 수 없습니다.

주의: 참조 변수가 가리키는 객체의 필드는 변경할 수 있지만, 참조 자체를 다른 객체로 바꿀 수 없습니다.

 

예시: final 참조 변수

final StringBuilder sb = new StringBuilder("Hello");
sb.append(" World!");  // 허용: 객체의 내부 상태 변경
sb = new StringBuilder("New");  // 오류 발생: 참조 변경 불가

여기서 참조 변수는 변경할 수 없지만, 객체의 내부 상태는 변경 가능합니다.

 

1.3 final 메서드

 

설명: final 메서드는 **하위 클래스에서 재정의(Override)**할 수 없습니다.

목적: 부모 클래스에서 특정 메서드가 변경되지 않도록 보장하기 위해 사용합니다. 보안이나 일관성이 중요한 경우 유용합니다.

 

예시: final 메서드

public class Animal {
    public final void eat() {
        System.out.println("Animal is eating");
    }
}

public class Dog extends Animal {
    @Override
    public void eat() {  // 오류 발생: final 메서드는 재정의 불가
        System.out.println("Dog is eating");
    }
}

final 메서드는 하위 클래스에서 재정의할 수 없으며, 부모 클래스의 동작을 그대로 유지해야 합니다.

 

1.4 final 클래스

 

설명: final 클래스는 상속할 수 없습니다. 즉, 이 클래스를 하위 클래스로 확장할 수 없습니다.

목적: 보통 완전한 클래스변경되지 않아야 하는 클래스를 만들 때 사용합니다. 대표적인 예는 String 클래스입니다.

 

예시: final 클래스

public final class Car {
    // Car 클래스의 내용
}

public class SportsCar extends Car {  // 오류 발생: final 클래스는 상속 불가
    // 하위 클래스 정의 불가
}

final 클래스는 다른 클래스에서 상속할 수 없으며, 클래스 구조가 고정됩니다.

 

2. final과 객체 불변성

 

**불변 객체(Immutable Object)**는 내부 상태가 한 번 설정되면 변경할 수 없는 객체를 의미하며, 이 개념은 주로 final과 함께 사용됩니다. 예를 들어, String 클래스는 불변 클래스이며, 그 내부에서 모든 필드는 final로 선언되어 있습니다.

 

불변 객체 만들기:

public final class Person {
    private final String name;
    private final int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }
}

Person 클래스불변 객체로, 생성 후에는 필드 값이 변경될 수 없습니다.

 

3. final 키워드의 장점

 

1. 안정성: final 키워드를 사용하면 변경되지 않는 값이나 메서드를 명확하게 나타내어 예측 가능한 코드를 작성할 수 있습니다.

2. 상속 방지: 특정 클래스나 메서드가 변경되지 않도록 보장할 수 있으며, 코드의 일관성을 유지할 수 있습니다.

3. 성능 향상: 컴파일러가 최적화할 수 있는 기회를 제공할 수 있습니다. final 메서드는 인라인(inline) 방식으로 처리될 수 있기 때문에 성능에 약간의 이점을 제공할 수 있습니다.

 

4. final과 상속의 관계

 

final 키워드는 상속을 제한하는 중요한 도구입니다. 자바의 객체지향 특성 중 하나인 상속은 잘못 사용될 경우, 강한 결합유지보수 어려움을 초래할 수 있습니다. 이를 방지하기 위해 **클래스나 메서드에 final**을 사용하여 상속과 재정의를 제한하는 경우가 많습니다.

 

상속과의 관계:

 

1. final 클래스상속을 완전히 막아 해당 클래스가 더 이상 확장될 수 없도록 보장합니다.

2. final 메서드하위 클래스가 부모 클래스의 메서드를 재정의할 수 없도록 제한하여 안정성을 보장합니다.

3. 상속을 통해 동작을 재사용하려면, final제거하여 상속과 재정의를 허용할 수 있습니다. 하지만 의도적인 설계에서 상속이 불필요하거나 문제가 될 수 있는 경우에는 final을 사용하는 것이 권장됩니다.

 

상속보다 합성을 우선하는 트렌드와의 관계:

 

상속보다 합성을 우선하라는 객체지향 설계 원칙에서, final 키워드는 상속을 남용하지 않도록 제한하는 도구로 유용합니다.

상속보다는 **합성(Composition)**을 사용해 객체 간의 결합을 느슨하게 만들고, 유연성을 확보하는 것이 더 현대적인 코드 스타일입니다. 이때, final을 사용하여 불필요한 상속을 방지하고 구성 요소 간의 관계를 명확하게 할 수 있습니다.

 

 

5. 요약

 

final 변수: 한 번 값을 할당하면 변경할 수 없는 상수를 의미합니다.

final 참조 변수: 참조 자체는 변경할 수 없지만, 참조하는 객체의 내부 상태는 변경할 수 있습니다.

final 메서드: 재정의할 수 없는 메서드로, 하위 클래스가 부모 클래스의 메서드를 변경하지 못하도록 방지합니다.

final 클래스: 상속할 수 없는 클래스로, 더 이상 확장될 수 없는 클래스입니다.

 

final 키워드는 코드의 안정성일관성을 높이는 데 중요한 역할을 하며, 특히 불변성이 중요한 상황에서 자주 사용됩니다.

'Java' 카테고리의 다른 글

[Java] Enum  (2) 2024.09.28
[Java] 상속 vs 합성  (0) 2024.09.28
[Java] 추상 클래스(Abstract Class)  (1) 2024.09.28
[Java] Interface  (2) 2024.09.28
[Java]Generic(Interface에서의 활용)  (0) 2024.09.28