기타 제어자의 종류
final
final 제어자는 '변경할 수 없다'는 의미로 사용된다.
필드나 지역변수에 사용하면 상수가 된다
final class Car { // 이 클래스는 상속을 통해 서브 클래스를 생성할 수 없음.
final int VAR; // 이 필드는 상수화되어 값을 변경할 수 없음.
final void brake() { // 이 메소드는 오버라이딩을 통해 재정의할 수 없음.
final double MAX_NUM = 10.2; // 이 지역 변수는 상수화되어 값을 변경할 수 없음.
}
}
static
static 제어자는 '공통적인' 이라는 의미로 사용된다.
메소드에 사용하면 해당 메소드를 클래스 메소드로 만들어 준다.
프로그램 시작시 최초에 단 한 번만 생성되고 초기화된다.
인스턴스를 생성하지 않고도 바로 사용할 수 있게 된다.
해당 클래스의 모든 인스턴스가 공유 한다.
class Car {
static int var; // 클래스 필드(static 변수)
static { // static 초기화 블록
// 보통 클래스 필드의 초기화를 진행함.
}
static void brake() { // 클래스 메소드(static 메소드)
...
}
}
abstract
abstract 제어자는 '추상적인' 이라는 의미로 사용된다.
추상 메소드: 선언부만 있고 구현부가 없는 메소드
추상메소드, 추상메소들를 포함하고 있는 클래스는 abstract 제어자를 붙여야한다.
abstract class Car { // 추상 클래스
abstract void brake(); // 추상 메소드
}
final 제어자를 가지는 클래스는 다른 클래스가 상속받을 수 없게 되며, abstract 제어자를 가지는 클래스는 다른 클래스가 상속해서 오버라이딩해야만 사용할 수 있으므로, 이 두 제어자는 클래스에 함께 사용할 수 없습니다.
abstract 제어자를 가지는 메소드는 선언부만 있고 구현부가 없는 메소드인데, static 제어자를 가지는 메소드는 인스턴스를 생성하지 않고도 바로 사용할 수 있어야 하므로, 이 두 제어자는 메소드에 함께 사용할 수 없습니다.
abstract 제어자를 가지는 메소드는 다른 클래스가 상속하여 오버라이딩해야만 사용할 수 있는데, private 제어자를 가지는 메소드는 자식 클래스에서 접근할 수 없게 되므로, 이 두 제어자는 메소드에 함께 사용할 수 없습니다.
4. 메소드에 private과 final은 함께 사용할 필요가 없습니다.
메소드에 사용된 final 제어자와 private 제어자는 모두 해당 메소드가 오버라이딩을 통한 재정의를 할 수 없다는 의미를 가지므로, 둘 중에 하나만 사용해도 의미가 충분히 전달될 수 있습니다.