본문 바로가기

Language/Java

상속과 생성자

자식 클래스는 부모 클래스의 모든 것들을 상속 받는다. 생성자(Constructor)도 마찬가지이다.

 

부모 클래스에 생성자가 있는 경우에, 자식 클래스에 이미 해당하는 생성자가 만들어져 있다면 그것을 호출한다. 그렇지 않다면 암묵적으로 부모 클래스의 생성자(super())를 호출하게 된다.

 

하지만 상속관계에 있는 클래스의 생성자에 기본 생성자(인자가 전혀 없는 생성자)가 아닌 인자가 포함된 생성자를 사용하는 경우 주의해야 한다.

 

class Calculator {
	int v1, v2;
	Calculator(int v1, int v2) {
		System.out.println("Calculator init!");
		this.v1 = v1;
		this.v2 = v2;
	}
}

// Compile Error
class Calculator2 extends Calculator {
	
}

 

위와 같이 부모 클래스에 기본 생성자가 아닌 인자를 주는 생성자만 명시된 경우, 자식 클래스에서 생성자를 명시적으로 만들지 않는다면 컴파일이 되지 않는다. 왜냐하면 자식 클래스에서 생성자를 호출하는 경우(인스턴스 생성), 정의한 생성자가 없기 때문에 부모 클래스의 생성자(super())를 사용해야 하는데, 명시적으로 인자를 받는 생성자만 부모 클래스에 만들어져 있기 때문에 기본 생성자가 없는 것으로 받아들여지기 때문이다.

 

자식 클래스의 경우에도, 기본 생성자는 명시적으로 만들지 않고, 인자를 받는 생성자만 만들었을 경우에는 인수를 주지 않고 인스턴스를 생성할 수 없다.

 

class Calculator {
	int v1, v2;
}

class Calculator2 extends Calculator {

	Calculator2(int v1, int v2) {
		this.v1 = v1;
		this.v2 = v2;
        	System.out.println("Calculator2 init!!");
	}
}

public class CalApp {
	
	public static void main(String[] args) {

		Calculator c = new Calculator();
		Calculator2 c2 = new Calculator2();	// Compile Error
	}
}

 

따라서 부모 클래스에 인자를 받는 생성자만 만들었을 경우, 다음과 같이 자식 클래스에도 인자를 받는 생성자를 만들어야 한다.

 

class Calculator {
	int v1;
	int v2;
	Calculator(int v1, int v2) {
		System.out.println("Calculator init!");
		this.v1 = v1;
		this.v2 = v2;
	}
}

class Calculator2 extends Calculator {

	Calculator2(int v1, int v2) {
		super(v1, v2);
		System.out.println("Calculator2 init!!");
	}
}

public class CalApp {
	
	public static void main(String[] args) {

		Calculator c = new Calculator(2, 1);
		Calculator2 c2 = new Calculator2(2, 1);	// super 먼저 실행, 그 다음에 자식 것 실행
	}
}

 

여기서 super(v1, v2)의 super은 부모 클래스를 의미한다. 즉, 부모 클래스의 생성자라고 할 수 있다. super(v1, v2)는 부모 클래스의 생성자를 실행시킨다는 뜻이다. 추가적으로 해야 하는 Calculator2 만의 작업이 있다면, System.out.println("Calculator2 init!!"); 과 같이 추가해주면 되는 것이다.

 

생성자가 있는 클래스를 상속 받았다면, 생성자를 만들어서 부모 클래스를 반드시 호출해야 한다.

 

Calculator2 를 실행시키면, 우선 super가 먼저 실행되고 추가적인 작업이 실행된다.

 

 

 

 

 

[참고자료]

https://docs.oracle.com/javase/tutorial/java/IandI/super.html

 

Using the Keyword super (The Java™ Tutorials > Learning the Java Language > Interfaces and Inheritance)

The Java Tutorials have been written for JDK 8. Examples and practices described in this page don't take advantage of improvements introduced in later releases and might use technology no longer available. See Java Language Changes for a summary of updated

docs.oracle.com

'Language > Java' 카테고리의 다른 글

다형성 (Polymorphism)  (0) 2022.11.20
인터페이스 (Interface)  (0) 2022.11.20
this, super  (0) 2022.11.14
Overriding, Overloading  (0) 2022.11.14
생성자(constructor)와 this  (0) 2022.11.13