코딜기
[Java] final (final 필드, final 메서드) 본문
반응형
final이란?
- 'final' 키워드는 무언가를 제한하는 의미를 가지며, 변수, 메서드, 클래스에 적용될 수 있습니다.
- 'final'이 어디에 선언되느냐에 따라 그 의미가 달라집니다.
- final + 변수 : 변수가 한번 초기화되면 값을 변경할 수 없고, 상수처럼 작동합니다.
- final + 메서드 : 메서드를 재정의할 수 없고, 상속된 클래스에서도 더 이상 오버라이드되지 않습니다.
- final + 클래스 : 클래스를 상속할 수 없고, 더 이상 확장이 불가능하며, 다른 클래스가 이 클래스를 기반으로 파생될 수 없습니다.
final 사용 (필드)
- Person라는 클래스를 하나 만들고 내부에 인스턴스 변수와 'final' 키워드를 사용한 변수를 추가하겠습니다.
- 'final' 변수는 반드시 선언과 동시에 초기화되거나 생성자를 통해 초기화되어야 합니다.
public class Person {
final String nation = "대한민국"; // -> 선언과 동시에 초기화
final String name; // -> 생성자를 통해 초기화
int age;
// 값 초기화를 위한 생성자
public Person(String name) {
this.name = name;
}
}
- 따라서, 'final'로 선언된 변수는 초기화된 후에는 값이 변경될 수 없는 불변의 값으로 취급되기 때문에, 초기화 이후에 다시 값을 할당하는 행위는 허용되지 않습니다.
public class Main {
public static void main(String[] args) {
Person p = new Person("김혜성");
p.nation = "한국"; // -> 에러
p.name = "이정후"; // -> 에러
}
}
final 사용 (메서드)
- Parent 클래스에 메서드를 3개 선언했고, 마지막 메서드만 final로 지정하였습니다.
public class Parent {
void method1() {}
void method2() {}
final void method3() {}
}
- Parent 클래스를 상속을 받는 Child 클래스를 선언하였습니다.
public class Child extends Parent {
@Override
void method1() {
// TODO Auto-generated method stub
super.method1();
}
@Override
void method2() {
// TODO Auto-generated method stub
super.method2();
}
// void method3() {
// System.out.println("오버라이딩 실패"); (x) -> final 메서드는 오버라이딩을 막습니다.
// }
}
- 마지막 메서드는 인텔리제이에서도 자동 오버라이딩이 진행되지 않는 것을 확인할 수 있습니다.
- 직접 작성하려고 해도 동작하지 않는 것을 볼 수 있는데, 이는 문법적으로 메서드 재정의를 막고 있는 것을 알 수 있습니다.
final 사용 (클래스)
- 클래스 선언 시 final을 사용하면 그 클래스는 상속이 불가능 해집니다.
- final 클래스는 자식 클래스를 가질 수 없고, 오직 외부에서 직접 객체 생성을 통해서만 사용할 수 있습니다.
- 대표적인 final 클래스는 String이 있습니다.
반응형
'Language > Java' 카테고리의 다른 글
[Java] 상속 (Inheritance) (0) | 2024.09.02 |
---|---|
[Java] 상수 (Constant) (0) | 2024.08.29 |
[Java] static (static 필드, static 메서드) (0) | 2024.08.27 |
[Java] 캡슐화 (Encapsulation) (0) | 2024.08.27 |
[Java] 정보은닉(Infomation Hiding) (1) | 2024.08.26 |
Comments