본글은 'Do it 자바 완전 정복' 책을 통한 공부내용을 정리한 글입니다.
final 제어자
final 제어자는 필드, 지역 변수, 메세드, 클래스 앞에 위치할 수 있다. 어디에 위치하느냐에 따라 의미가 달라진다.
final 변수
final 변수는 한 번 대입된 값을 수정할 수 없다. (상수)
class A1 {
int a = 3;
final int b = 5;
}
class A2 {
int a;
final int b = 5;
A2 () {
b = 7; // final로 선언했기 때문에 대입 불가능
}
}
final 필드의 초기화는 반드시 생성자에서 진행한다. final 필드도 선언과 값의 대입을 분리해 표기할 수 있지만 생성자에서는 값을 대입해야 한다. 이는 final 필드가 일반 필드와 달리 강제 초기화되지 않기 때문이다.
final 변수는 언제 많이 사용할까?
어떤 필요에 따라 복사본을 하나 만들어 놓음으로써 원본이 삭제된 이후에도 그 값을 활용할 수 있도록 하는 것이 final 변수의 기능이다. 그래서 한 번 생성하면 사라지지 않는 영역인 상수 영역에 복사해 놓는것이다.
final 메서드와 final 클래스
final 변수가 저장한 값이 최종 값의 의미를 지니고 있는 것처럼 final 메서드와 final 클래스도 각각 최종 메서드, 최종 클래스의 의미를 가진다. 메서드를 final로 정의하면 자식 클래스에서 해당 메서드를 오버라이딩 할 수 없다. 이와 같은 개념으로 final 클래스 역시 더 이상 자식 클래스가 없다는 것을 의미한다. 따라서 final 클래스는 상속 자체가 불가능하다.
class A {
void abc() {}
final void bcd() {} // final 메서드
}
class b extends A {
void abc() {}
// void bcd() {} final 메서드 이므로 오버라이딩 불가능
}
class C extends String {} // String 클래스는 final 클래스로 정의되어 있으므로 상속 불가능
abstract 제어자
abstract의 사전상 의미는 추상적인이다. abstract가 붙은 메서드를 추상 메서드, abstract가 붙은 클래스를 추상 클래스라 한다. 추상 메서드는 중괄호가 없는 메서드로 메서드의 기능 자체가 정의되지 않으며 세미콜론(;)으로 끝난다. 추상 메서드를 1개 이상 포함하고 있는 클래스는 반드시 추상 클래스로 정의해야 한다. 추상 클래스도 당연히 상속할 수 있다. 만일 cry()라는 추상 메서드가 정의되어 있는 부모클래스를 상속받은 자식클래스가 있다면 해당 자식클래스는 해당 추상 메서드를 오버라이딩하거나 자신을 추상클래스로 정의해야 한다.
abstract class Animal {
abstract void cry(); // 추상메서드
}
class Cat extends Animal {
void Cry() {
System.out.println("야옹");
}
}
class Dog extends Animal {
void Cry() {
System.out.println("멍멍");
}
}
public class AbstractClass {
public static void main(String[] args) {
Animal a = new Cat();
Animal b = new Dog();
a.cry(); // 야옹
b.cry(); // 멍멍
}
}
'Backend > JAVA' 카테고리의 다른 글
[Java] #13 이너 클래스와 이너 인터페이스 (1) | 2023.06.06 |
---|---|
[Java] #12 추상 클래스와 인터페이스 (0) | 2023.06.04 |
[Java] #9 자바 제어자 1 - 접근지정자, static (0) | 2023.05.28 |
[Java] #8 클래스 외부 구성 요소 (0) | 2023.05.25 |
[Java] #5.2 참조자료형 - 문자열 (0) | 2023.05.21 |