인프런 커뮤니티 질문&답변

송바래님의 프로필 이미지
송바래

작성한 질문수

즐거운 자바

43. 생성자 -super가 기본 생성자가 아닐 때

해결된 질문

작성

·

500

1

package 객체지향문법_3;

public class Car2 {
    public Car2(String name) {
        super(); // 자동으로 들어간다.
        System.out.println("Car2() 생성자 출력");
    }
}
package 객체지향문법_3;

public class Bus2 extends Car2{
    public Bus2(){
        // 부모의 기본생성자가 없으면 super에 값을 넣어줘야한다.
        super("Bus!!"); // 부모의 기본 생성자를 호출하는 코드가 자동으로 삽입된다.
        System.out.println("Bus2 기본생성자");
    }
}
package 객체지향문법_3;

public class Car2Exam {
    public static void main(String[] args) {
        Car2 c1 = new Car2("urstory");

        Bus2 b1 = new Bus2();
    }
}

 

안녕하세요. 위의 코드에서 이해가 되지 않는 부분이 있어서 질문 남겨요.

 

package 객체지향문법_3;

public class Car2 {
    public Car2(String name) {
        super(); // 자동으로 들어간다.
        System.out.println("Car2() 생성자 출력");
    }
}

Car2 생성자가 파라미터에 값이 들어갔기 때문에 기본 생성자 아니라, super에 값을 넣어 줘야하는건 이해가 갔습니다. 근데 super() 이 부분에 값이 들어가야하는데 정확히 어떤 값이 들어가야하는지 이해가 가질 않습니다. 그래서 구글에서 super 관련 문서 몇개를 찾아봤는데, 좀 다양하게 쓸 수 있는거 같습니다.

class Parent {

    int a;

    Parent() { a = 10; }

    Parent(int n) { a = n; }

}

 

class Child extends Parent {

    int b;

    Child() {

①      //super(40);

        b = 20;

    }

    void display() {

        System.out.println(a);

        System.out.println(b);

    }

}

 

public class Inheritance04 {

    public static void main(String[] args) {

        Child ch = new Child();

        ch.display();

    }

}

 

위의 예시에서는 super부분 주석을 해제하면 부모 생성자의 값인 a를 40으로 초기화할 수 있는거 같고,

public class Vehicle {
    protected int speed;
    
    public Vehicle(int speed) {
        this.speed = speed;
    }
    
    public void move() {
        System.out.println("Vehicle is moving.");
    }
}

public class Car extends Vehicle {
    private String model;
    
    public Car(String model, int speed) {
        super(speed); // 부모 클래스의 생성자 호출
        this.model = model;
    }
    
    @Override
    public void move() {
        super.move(); // 부모 클래스의 move 메소드 호출
        System.out.println("Car is moving.");
    }
    
    public void displayModel() {
        System.out.println("Model: " + model);
    }
}
Car car = new Car("BMW", 100);
car.move(); // "Vehicle is moving."와 "Car is moving." 출력
car.displayModel(); // "Model: BMW" 출력

위의 예시 역시 Car 클래스가 Vehicle 클래스를 상속 받았기 때문에 직접 Car 클래스에서 speed를 수정할 수 없는거 같네요.

package 객체지향문법_3;

public class Bus2 extends Car2{
    public Bus2(){
        // 부모의 기본생성자가 없으면 super에 값을 넣어줘야한다.
        super("Bus!!"); // 부모의 기본 생성자를 호출하는 코드가 자동으로 삽입된다.
        System.out.println("Bus2 기본생성자");
    }
}

 

즐거운 자바 강좌에서는 super("Bus!!")라고 했는데 이게 어떤 의미인지 잘 모르겠어요.

답변 1

2

Car2가 기본 생성자가 없기 때문에 상속받는 Bus2의 생성자에서는 Car2가 가지고 있은 다른 생성자를 호출해줘야 합니다. (문법. 호출안하면 컴파일 안됨)

Car2가 가지는 생성자는 Car2(String)이 있죠.

이걸 호출해준겁니다. 원래 Car2생성자는 Car2의 속성을 초기화 하거나 그런 용도일텐데 여기서는 생성자에 넘겨준 값응 출력만 하고 있습니다

송바래님의 프로필 이미지
송바래
질문자

package 객체지향문법_3;

public class Bus2 extends Car2{
    public Bus2(){
        // 부모의 기본생성자가 없으면 super에 값을 넣어줘야한다.
        super("Bus!!"); // 부모의 기본 생성자를 호출하는 코드가 자동으로 삽입된다.
        System.out.println("Bus2 기본생성자");
    }
}

혹시 그러면 이 부분에서 super("Bus!!") 이 부분에서 Bus!! 를 출력해야하면 코드를 어떻게 수정 해야하나요?

Car2샐성자 안에서 받은 String값을 출력해야죠.

송바래님의 프로필 이미지
송바래
질문자

 

package 객체지향문법_3;

public class Car2 {
    public String name;
    public Car2(String name) {
        super(); // 자동으로 들어간다.
        System.out.println("Car2() 생성자 출력");
        this.name = name;
        System.out.println(name);
    }
}

부모안 Car2 생성자안에서 String값을 출력하니까 되네요. 감사합니다~!!

송바래님의 프로필 이미지
송바래

작성한 질문수

질문하기