티스토리 뷰
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
- Hash
- Red-Black Tree
- spring boot
- Sticky Session
- Spring
- 오블완
- 티스토리챌린지
- fail-safe
- 추상클래스
- nosql
- 인터페이스
- 인스턴스변수
- HashSet
- AutoConfiguration
- 정적변수
- 다중화
- java
- HashMap
- nginx
- @conditional
- object
- Caching
- 로드 밸런서
- Security
- fail-fast
- JPA
- 고정 세션
- Load Balancer
- 자동구성
- syncronized
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |