자바에서는 하나의 클래스에 abstract와 final 수정자를 동시에 붙일 수 없습니다. 두 키워드는 서로 정반대의 목적을 가지고 있어 함께 사용하면 컴파일 오류가 발생하기 때문입니다. 각각의 개념과 함께 자세히 살펴보겠습니다.
추상 클래스(Abstract Class)란?
추상 클래스는 0개 이상의 추상 메서드를 포함하는 클래스입니다. 클래스 안에 추상 메서드가 하나라도 존재한다면, 해당 클래스는 반드시 abstract로 선언해야 합니다.
추상 클래스 내부에는 일반 메서드(구현된 메서드)도 포함될 수 있습니다. 다만 이 메서드를 실제로 사용하려면 추상 클래스를 상속받은 하위 클래스를 만들고, 추상 메서드가 있다면 이를 구현한 뒤, 하위 클래스의 객체를 통해 호출해야 합니다.
예제
다음 자바 예제에서 추상 클래스 MyClass는 display라는 이름의 일반 메서드를 포함하고 있습니다.
또 다른 클래스(AbstractClassExample)에서 MyClass를 상속받아, 하위 클래스 객체를 통해 display 메서드를 호출합니다.
abstract class MyClass {
public void display() {
System.out.println("This is a method of abstract class");
}
}
public class AbstractClassExample extends MyClass {
public static void main(String args[]) {
new AbstractClassExample().display();
}
}실행 결과
This is a method of abstract class
즉, 추상 클래스는 반드시 상속을 통해서만 사용할 수 있다는 것이 핵심입니다.
final 클래스란?
클래스를 final로 선언하면 해당 클래스는 더 이상 상속(확장)할 수 없습니다. final 클래스를 상속하려고 시도하면 컴파일 타임에 "cannot inherit from final SuperClass"라는 오류 메시지가 출력됩니다.
예제
다음 자바 프로그램에는 SuperClass라는 final 클래스가 있으며, 이를 다른 클래스(SubClass)가 상속하려고 시도합니다.
final class SuperClass {
public void display() {
System.out.println("This is a method of the superclass");
}
}컴파일 오류
이 프로그램을 컴파일하면 아래와 같은 컴파일 오류가 발생합니다.
SubClass.java:7: error: cannot inherit from final SuperClass
public class SubClass extends SuperClass{
^
1 error즉, final 클래스는 상속 자체가 금지되어 있습니다.
abstract와 final을 동시에 사용하면 왜 안 될까?
두 키워드의 요구 사항을 비교해 보면 답이 명확해집니다.
- abstract 클래스: 사용하려면 반드시 상속(extends)해야 합니다.
- final 클래스: 상속 자체가 불가능합니다.
abstract 클래스는 상속을 전제로 설계된 반면, final 클래스는 상속을 원천적으로 차단합니다. 두 요구 사항이 서로 모순되기 때문에 자바에서는 하나의 클래스에 abstract와 final을 동시에 선언하는 것을 허용하지 않으며, 이를 위반하면 컴파일 타임 오류가 발생합니다.
예제
public final abstract class Example {
public void sample() {
}
}컴파일 오류
Example.java:1: error: illegal combination of modifiers: abstract and final
public final abstract class Example {
^
1 error정리
abstract는 "상속을 강제"하는 수정자이고, final은 "상속을 금지"하는 수정자입니다. 두 개념이 정확히 반대 방향을 가리키기 때문에 같은 클래스에 함께 적용될 수 없으며, 자바 컴파일러는 이러한 조합을 불법(illegal combination of modifiers)으로 판단하여 컴파일 오류를 발생시킵니다.