[Java] 상속과 생성자

SeongEon Kim·2022년 4월 25일
0

JAVA

목록 보기
20/52
  1. 기본 생성자

생성자는 객체를 생성한다. 그 과정에서 해야 할 일들을 생성자 메소드에 지정해서 초기화 작업을 할 수 있다.

public class ConstructorDemo {
   public static void main(String[] args) {
       ConstructorDemo  c = new ConstructorDemo();
   }
}

위의 코드는 에러가 발생하지 않은 깔끔한 코드다. ConstructorDemo 객체를 생성할 때 자동으로 생성자를 만들어주기 때문이다.

public class ConstructorDemo {
   public ConstructorDemo(int param1) {}
   //생성자를 형성했는데 parameter가 있다는 것은 이 생성자가 기본 생성자가 아니라는 뜻이다.
    매개 변수가 있는 생성자를 정의한 것이다.
   public static void main(String[] args) {
       ConstructorDemo  c = new ConstructorDemo();
   //그런데 위와 같은 상황에서 인스턴스를 선언해버리면 오류가 발생한다.
   }
}

위의 코드는 오류가 발생한다.
기본 생성자가 아닌데, 인스턴스를 선언해버리면 오류가 발생할 수 밖에 없다.
어떠한 생성자가 개발자에 의해서 명시적으로 만들어지게 되면, Java는 기본 생성자를 암시적으로 자동적으로 만들어주지 않는다.
즉, 위에서 ConstructorDemo(int para1)이라는 인자를 생성하고 아랫줄에서 ConstructorDemo()와 같이 인자가 없는걸 호출하니 오류가 생긴 것이다.

위의 코드에 대한 해결 코드는 아래를 참고하자.

public class ConstructorDemo {
   public ConstructorDemo(){}
   // 인자가 없는 ConstructorDemo를 명시적으로 생성해준다.
   public ConstructorDemo(int param1) {}
   public static void main(String[] args) {
       ConstructorDemo  c = new ConstructorDemo();
   }
}

인자가 없는 ConstructorDemo를 생성하고 아래에서 인자가 없는 ConstructroDemo를 호출하면 오류가 생길 수 가 없다.

  1. Super

    자식클래스는 부모클래스의 생성자를 자동으로 호출하게 되어있다. 그러나 부모클래스가 매개변수가 있는 생성자를 선언하면, 자바는 자동으로 기본생성자를 생성하지 않기 때문에 하위 생성자는 기본생성자를 호출할 수 없어 오류가 발생한다.
    이를 해결하기 위해 기본 생성자를 만들면 되는데, 굳이 기본 생성자를 만들지 않고 상위 클래스의 생성자를 하위 클래스가 바로 호출할 수 있다.
    이때 사용되는게 super다.

class Calculator {
//부모클래스
    int left, right;
     
    public Calculator(){}
    //생성자
     
    public Calculator(int left, int right){
    //생성자
        this.left = left;
        this.right = right;
    }
    
 }
 
 class SubstractionableCalculator extends Calculator {
    public SubstractionableCalculator(int left, int right) {
        super(left, right);
        //부모클래스의 생성자를 뜻한다.
        //하위 클래스의 초기화 코드는 무조건 super 뒤에 써야한다.
    }
 
    public void substract() {
        System.out.println(this.left - this.right);
    }
}

위 코드만 봐서는 super의 기능의 필요성을 못 느낄 수 있다.
하지만, 부모클래스 내 생성자의 밑 코드가 1000줄이 넘어가는 복잡한 코드라면 super의 기능은 매우 크게 실감할 수 있다.

profile
꿈을 이루는 사람

0개의 댓글