아래 코드처럼 자기 자신을 인스턴스화 시키는 것도 가능하다.
그 이유는 어떠한 생성자도 생성하지 않아 Java는 자동으로 매개변수가 없는 기본 생성자를 만들어주기 때문에 가능하다. 만약, 생성자를 하나라도 생성하게 된다면 Java는 명시적으로 기본 생성자를 생성해 주지 않는다.
public class ConstructorDemo {
public static void main(String[] args) {
ConstructorDemo c = new ConstructorDemo();
}
}
아래 코드를 실행을 하면 에러가 발생한다.
그 이유는 ConstructorDemo 클래스는 인자가 없는 생성자를 가지고 있지 않고 인자가 있는 생성자를 가지고 있기 때문이다. main 메소드에서 인자가 없는 생성자를 호출하려고 하기 때문에 에러가 발생한다.
public class ConstructorDemo {
public ConstructorDemo(int param1) {}
public static void main(String[] args) {
ConstructorDemo c = new ConstructorDemo();
}
}
이와 같은 에러를 해결하기 위해서는 인자가 없는 기본 생성자를 명시적으로 선언해주면 에러가 발생하지 않는다.
new Constructor();가 public Constructor() {} 기본 생성자를 호출하여 실행하기 때문에 에러가 발생하지 않는다.
public class ConstructorDemo {
public ConstructorDemo() {}
public ConstructorDemo(int param1) {}
public static void main(String[] args) {
ConstructorDemo c = new ConstructorDemo();
}
}
위의 코드처럼 기본 생성자를 정의하지 않고도 해결할 수 있는 방법이 있다!
자식 클래스와 부모 클래스가 각각 생성자가 있는데 그 생성자의 역할이 똑같다면 super를 사용하면 된다.
super라는 것은 부모클래스를 의미한다. 즉, super() -> 부모클래스의 생성자를 의미한다.
34번 째 코드를 보면 Substraction의 매개변수(인자)의 값이 super(left, right) 안으로 들어간다.
3번 째 ~ 14번 째 코드를 보면 Calculatorclass가 슈퍼 클래스가 되고 생성자가 두개가 있다.
34번 째 코드에서 매개변수(인자)가 있는 것을 호출하기 때문에 11번 째 줄의 코드인 생성자를 호출하게 된다.
주의! super를 먼저 선언하고 그 아래에 자식 클래스의 초기화 작업을 하는 코드를 작성해야 한다.
자식 클래스가 인스턴스화가 된다는 뜻은 부모 클래스가 인스턴스화 되어서 생성이 되었기 때문이다.
부모보다 자식이 먼저 태어날 수 없다고 생각하면 조금 더 와닿지 않을까 싶다.
ps. 아래 게시글은 이전에 생성자와 상속을 공부하면서 정리했던 글이다.
https://yelin1217.tistory.com/83?category=1018443
[Java] 상속(Inheritance)
상속(Inheritance) 상속이란 물려준다는 의미이다. 어떤 객체가 있을 때 그 객체의 필드(변수)와 메소드를 다른 객체가 물려받을 수 있는 기능을 상속이라고 한다. 이때 기존의 객체는 기능을 물려
yelin1217.tistory.com
https://yelin1217.tistory.com/45?category=1018443
[Java] 생성자(Constructor)
+ 22.01.18 생성자(Constructor) 클래스 안에 클래스의 이름과 똑같은 메소드를 생성 -> setOprands의 역할을 함 ex) Calculator 클래스 안에 Calculator 메소드를 생성 생성자는 어떠한 메소드보다 가장 먼저 진..
yelin1217.tistory.com
'TIL > Java' 카테고리의 다른 글
[Java] 메소드 오버로딩(Method Overloading) (0) | 2022.01.20 |
---|---|
[Java] 오버라이딩(Overriding) (0) | 2022.01.19 |
[Java] 상속(Inheritance) (0) | 2022.01.18 |
[Java] 유효범위(Scope) (0) | 2022.01.17 |
[Java] 클래스 멤버와 인스턴스 멤버: 타입별 비교 (0) | 2022.01.17 |