[java] 클래스 생성자 호출 순서

hyejin·2022년 4월 20일
0

자바 상속의 특징

1.자바클래스의 상속은 단일상속이다.

2.상속은(특정 클래스가 가지는 일부 속성과 기능을 다른 클래스에 제공하기위해 맺는 클래스간의 관계이다. )

3.두 클래스를 부모와 자식관계로 맺어주는다.

4.자식은 부모의 요소를 전부 가져온다.(단, 생성자는 제외이다.)

5.조상은 자손에게 영향O , 자손클래스의 변경은 아무런 영향X.

6.상속받지 않은 클래스들은 모두 최상위 클래스 java.lang.Object클래스를 묵시적으로 상속받는다.

자식 클래스의 생성자에서 명시적으로 부모 클래스의 생성자가 호출되지 않으면 자동으로 부모 클래스의 default 생성자가 호출된다.

자식 클래스의 생성자에서 명시적으로 부모 클래스의 생성자를 호출할 수도 있다.

super 키워드를 사용하여 부모 클래스의 생성자를 호출할 수 있는데, 이때 super 키워드는 제일 처음에 호출되어야 한다. 그러지 않으면 'Constructor call must be the first statement in a constructor'라는 오류 문구가 뜬다.

또한 부모 클래스에 디폴트 생성자가 없는 경우도 있는데 그럴 때는 다른 생성자를 반드시 호출해야 한다.

package action.java.test;

class Vehicle {
    int speed;

    //삭제시 에러발생 -> superClass가 시그니처 생성자를 만들경우 더이상 default생성자가지고 있다.
    //따라서 default 클래스를 만들어 자동으로 호출하게 하거나
    //시그니처 생성자를 super()로 호출하게 해야한다.
    public Vehicle() {
        System.out.println("Vehicle()생성");
    }

    public Vehicle(int speed) {
        super();//상속받지 않은 클래스들은 모두 최상위 클래스 java.lang.Object클래스를 묵시적으로 상속기때문에 생략가능
        this.speed = speed;
        System.out.println("Vehicle(int) 생성 : speed = " + speed);
    }

}

class Car extends Vehicle {
    int oil;

    public Car() {
        //호출할 상위클래스의 생성자를 직접 명시할 수 있다.
        super(45);
        System.out.println("Car() 생성");
    }

    public Car(int oil) {
        super();
        this.oil = oil;
        super(); //super 키워드가 처음에 호출되지 않으면 오류 발생
        System.out.println("Car(int) 생성 : oil = " + oil);
    }

    public Car(int oil, int speed) {
        super();
        //상위클래스의 생성자를 호출하지 않으면 상위클래스의 기본 생성자가 호출 된다.
        this.oil = oil;
        System.out.println("Car(int) 생성 : oil = " + oil + " speed = " + speed);
    }

}

public class DefaultConstructor {
    public static void main(String[] args) {
        Vehicle v1 = new Vehicle();
        System.out.println();

        Vehicle v2 = new Vehicle(100);
        System.out.println();

        Car car1 = new Car(100, 60);
        System.out.println();

        Car car2 = new Car();
        System.out.println();
        
         //정답 유추 해보세요!
        Car car3 = new Car(100, 60);
        System.out.println();

    }

}

Vehicle()생성

Vehicle(int) 생성 : speed = 100

Vehicle()생성
Car(int) 생성 : oil = 100 speed = 60

Vehicle(int) 생성 : speed = 45
Car() 생성

Vehicle()생성
Car(int) 생성 : oil = 100 speed = 60


class HybridCar extends Car {
    int electricity;

    public HybridCar() {
        System.out.println("HybridCar() 생성");
    }

    public HybridCar(int electricity) {
        System.out.println("HybridCar(int) 생성 : electricity = " + electricity);
        this.electricity = electricity;
    }

    public HybridCar(int electricity, int oil) {
        this(electricity); //생성자 위임, 매개변수가 하나인 본인 클래스의 생성자를 호출함
        System.out.println("HybridCar(int, int) 생성 : oil = " + oil);
        this.oil = oil;
    }

}

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

        //정답 유추 해보세요!
        HybridCar hybridCar1 = new HybridCar();
        System.out.println();
       
        //정답 유추 해보세요!
        HybridCar hybridCar2 = new HybridCar(120, 800);
    }

}

Vehicle(int) 생성 : speed = 45
Car() 생성
HybridCar() 생성

Vehicle(int) 생성 : speed = 45
Car() 생성
HybridCar(int) 생성 : electricity = 120
HybridCar(int, int) 생성 : oil = 800

참고

https://jojelly.tistory.com/39

https://mimah.tistory.com/entry/Java-%EC%83%81%EC%86%8D-%EA%B4%80%EA%B3%84%EC%97%90%EC%84%9C-%EC%83%9D%EC%84%B1%EC%9E%90-%ED%98%B8%EC%B6%9C-%EC%88%9C%EC%84%9C

https://stackoverflow.com/questions/48392818/when-do-superclasses-not-have-a-default-constructor

0개의 댓글