본문 바로가기

Programming/JAVA

상속(4) - final 클래스와 메서드

java logo image

 

 

 

 

기본적으로 필드 값에 대한 학습을 진행하면서 final 필드에 대해서 살펴보았습니다. 요약하면, 필드 선언 시 final로 선언되면 초기값을 설정한 이후로는 그 값을 변경할 수 없다는 것이 정의였습니다. 그렇다면, 필드뿐 아니라 클래스/메서드에 final이 선언될 경우에는 어떤 특성을 갖게 될까요? 하나씩 살펴보도록 하겠습니다. 

 

 


 

 

 

우선 final 클래스에 대해서 살펴보겠습니다. final 클래스는 정의가 생각보다 간단합니다. 특정 클래스가 final로 선언된다면, 어떤 제한이 생길까요? 설마 클래스의 내용을 바꿀 수 없다? 같은 정의는 와닿지 않습니다. 지금 우리가 배우는 카테고리가 '상속'인 만큼, 상속과 관련되어 있습니다. 바로 - final 클래스는 "부모 클래스가 될 수 없다, 즉 상속할 수 없는 클래스"가 된다는 특성을 갖습니다. 클래스의 final이 제한하는 것은, 자식 클래스의 생성을 제한하는 것입니다.

 

// final로 선언한 클래스
public final class TeslaXmodel {
	// ...
}

 

// * 다음과 같은 자식 클래스는 만들 수 없다 *
public class BrandnewTesla extends TeslaXmodel {

}

 

 

 


 

 

이번엔 final 메서드에 대해서 살펴보겠습니다. final 필드, 클래스와 마찬가지로 오버라이드 역시 무언가 '제한'이 걸릴 것 같습니다. 그런데 우리는 지금 '상속' 카테고리에서 final 클래스와 메서드에 대해 배우고 있으니 이 역시 상속과 관련된 제한이 생길 것 같습니다. 

 

예상하셨겠지만, final로 선언된 메서드는 오버라이드(재정의)가 불가하다는 특성을 갖습니다. 즉, 한 번 선언이 된 이후에 임의로 메서드를 바꾸는 것이 불가능해지는 것이죠. 마치 final 필드의 초기값을 수정할 수 없는 것과 비슷한 개념이 됩니다. 이전 아티클에서 Car 클래스의 메서드를 오버라이드하는 실습을 했었는데, final 메서드를 적용하는 예시로 수정해 보겠습니다.

 

public class Car {
	public void stop() {
		System.out.println("멈춥니다.");
	}
	
    // final 메서드 선언
	public final void drive() {
		System.out.println("일반 주행합니다.");
	}
	
	public void start() {
		System.out.println("시동을 겁니다.");
	}
}

 

public class Tesla extends Car {
	public static final int NORMAL = 1;
	public static final int AUTO_DRIVE = 2;
	
	public int driveMode = NORMAL;
	
    // final 메서드이므로 컴파일 에러가 발생한다.
	@Override
	public void drive() {
		if(driveMode == AUTO_DRIVE) {
			System.out.println("자동주행입니다.");
		} else {
			super.drive();
		}
	}
}

 

 


 

 

final 클래스와 메서드의 경우 복잡한 정의가 아니기 때문에 상속과 관련된 기능 제약에 대해서만 기억해 두면 됩니다. 그럼, 우리가 지금껏 배운 final 키워드의 속성에 대해서 정리해 보면 다음과 같습니다. 

 

  • final 필드 - 초기값 수정이 불가능하다.
  • final 클래스 - 상속(자식 클래스 생성)이 불가능하다.
  • final 메서드 - 오버라이드(재정의)가 불가능하다.