네, 추상 클래스에서도 매개변수가 있는 생성자(파라미터화된 생성자)를 충분히 정의할 수 있습니다.
추상 클래스에서 매개변수 생성자를 정의하기 위한 조건
- 추상 클래스를 상속하는 하위 클래스는 반드시 자신만의 생성자를 가져야 하며, 이 생성자 내부에서 슈퍼 클래스의 매개변수 생성자를 호출할 수 있어야 합니다.
- 하위 클래스에서는 super() 호출을 사용하여 슈퍼 클래스의 매개변수 생성자를 호출할 수 있습니다.
- 하위 클래스 생성자에 super() 호출을 작성하지 않으면 컴파일 타임 오류(compile-time error)가 발생합니다.
예제 코드
abstract class AbstractClassTest {
AbstractClassTest(int a) { // 매개변수가 있는 생성자
System.out.println("추상 클래스의 매개변수 생성자 a=" + a);
}
}
public class Test extends AbstractClassTest {
Test() {
super(20);
System.out.println("Test 클래스 생성자");
}
public static void main(String[] args) {
Test obj = new Test();
}
}위 예제에서 하위 클래스(Test)의 생성자 안에는 반드시 super() 호출을 첫 번째 문장으로 작성해야 합니다. 만약 이 호출을 생략하면 컴파일러가 슈퍼 클래스의 기본 생성자를 찾으려다 실패하기 때문에 컴파일 타임 오류가 발생합니다.
실행 결과
추상 클래스의 매개변수 생성자 a=20 Test 클래스 생성자
실행 결과를 보면 객체 생성 시 먼저 슈퍼 클래스인 AbstractClassTest의 매개변수 생성자가 호출되고, 그 다음에 하위 클래스 Test의 생성자 본문이 실행되는 것을 확인할 수 있습니다. 즉, 추상 클래스는 직접 인스턴스화할 수 없지만, 하위 클래스가 객체로 생성될 때 그 생성자는 반드시 호출된다는 점을 기억하면 좋습니다.