티스토리 뷰

Language/Java

final 키워드

DUCKBAE's 2024. 10. 18. 11:52

final 키워드는 어떻게 활용되는지에 대해 알아보려고 한다.


final

final 은 최종적이라는 뜻으로, 해당 선언이 최종 상태이고 수정될 수 없다.

final 키워드는 필드와 메서드 그리고 클래스에 선언할 수 있는데 각각 해석이 다르다.

필드, 메서드 그리고 클래스에 final 키워드를 선언하였을 때 어떻게 해석되는지 알아본다.

 

final 클래스

클래스에 final 키워드를 선언하면 해당 클래스는 자식클래스를 가질 수 없다. 즉 상속될 수 없다.

해당 클래스가 최종적인 클래스가 되기때문에 자식클래스를 만들 수 없는 것이다.

따라서 자식클래스를 갖는 부모클래스에 final 키워드를 선언하도록 변경할 때 주의해야 한다.

public final class Vehicle {

}

/*
    final 로 선언 된 Vehicle 을 상속받을 수 없다.
    상속 받으려고 하면 다음과 같이 컴파일 오류가 발생한다.
    Cannot inherit from final 'Vehicle'
*/
public class Car extends Vehicle {

}

 

final 필드

final 로 선언된 필드는 한 번만 할당될 수 있다. 즉 한 번 초기화되면 그 이후에 값을 변경할 수 없다.

정적 및 인스턴스 필드에 선언할 수 있으며, 해당 필드는 불변상태를 유지한다.

필드 선언 시에 초기 값을 설정할 수 있고, 생성자를 통해 초기 값을 설정할 수 있다.

필드 선언 시 초기 값을 설정하지 않았다면 생성자를 통해서 final 필드에 대하여 최종 초기화를 해야하는데, 이 과정에서도 초기화를 하지 않았다면 final 필드에 대해 컴파일 오류가 발생하게 된다.

아래 예제에서 model이라는 필드는 final 로 선언되어 있지만 동시에 초기 값을 설정하지 않았다. 따라서 생성자를 통해 초기화를 해줘야하는데 model 필드를 초기화하는 생성자가 없다면 컴파일 오류가 발생한다.

public class Car {

    private final String brand = "hyundai";
    private final String model;
    
    public Car(String brand) {
    	/*
            다음과 같이 컴파일 오류가 발생한다.
            Cannot assign a value to final variable 'brand'
        */
    	this.brand = brand;
    }
    
    /*
    	만약 해당 생성자가 없으면 model 필드에서는 다음과 같이 컴파일 오류가 발생한다.
        Variable 'model' might not have been initialized
    */
    public Car(String model) {
    	this.model = model;
    }
}

 

final 메서드

메서드에 final 키워드를 선언하면 자식 클래스가 부모 클래스의 인스턴스 메서드를 재정의(오버라이딩)할 수 없다. 즉, 자식 클래스는 부모 클래스에 정의된 final 메서드를 재정의 할 수 없다는 것으로 부모 클래스에 구현된 메서드를 변경할 수 없다. 해당 메서드가 최종적인 메서드이기때문에 재정의가 불가능한 것이다.

만약 자식 클래스에서 부모 클래스의 final 인스턴스 메서드를 재정의하려고 시도하면 컴파일 에러가 발생한다.

또한 접근 제어자 private 과 사용하면 final 키워드가 무시된다.

public class Vehicle {

    //final 키워드가 무시된다.
    private final void print() {
    	..
    }
    
    public final void print() {
    	..
    }
}

public class Car extends Vehicle {
    /*
    	이렇게 오버라이딩을 할 수 없다.
    	오버라이딩하려고 하면 다음과 같이 컴파일 오류가 발생한다.
        'print()' cannot override 'print()' in 'Vehicle'; overridden method is final
    */
    @Override
    public void print() {
    
    }
}

 

static final

필드 선언 시 사용되는 키워드이다.

static 은 정적이며, method 영역에 할당되어 모든 객체의 참조 대상이 된다. 여기에 final 키워드가 붙어 절대 변하지 않는 상수라는 의미를 갖게된다.

public class Car {
    public static final String brand = "hyundai";
}

brand 필드는 클래스 정보로 method 영역에 할당되며, 모든 Car 객체가 brand 필드를 참조하지만 해당 값을 변경할 수는 없다.

 

final 과 static final

final 키워드는 클래스, 필드, 메서드에 사용할 수 있는 키워드이다. 클래스, 필드, 메서드에 사용될 때의 용도는 위에 언급한 내용 그대로이다.

static final 키워드는 필드 선언시 사용되는 키워드이다. 해당 필드가 객체가 아닌 클래스 자체에 속한다는 것으로 변경할 수 없는 상수로 method 영역에 할당되어 모든 객체의 참조 대상이 된다.

 


final 키워드에 대하여 정리해본다.

final 키워드는 클래스, 필드, 메서드에 사용할 수 있다.

1. (final class) 상속이 불가능한 클래스

2. (final field) 값을 한 번만 할당할 수 있는 필드

3. (final method) 자식클래스에서 오버라이드 할 수 없는 메서드

 

static final 키워드는 필드 선언시에만 사용할 수 있다.

 

'Language > Java' 카테고리의 다른 글

상속과 인터페이스의 다형성  (0) 2024.10.20
인스턴스 멤버와 정적 멤버  (0) 2024.10.18
생성자와 오버로딩  (0) 2024.10.18
클래스  (0) 2024.10.17
이넘(Enum)  (0) 2024.10.16
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함