devnoong.log
728x90

상속 클래스 관련해서 간단하게 정리하고자 포스팅을 남깁니다.

 

자바에서는 extends를 통해 클래스를 상속받을 수 있다.

자바에서 클래스를 상속받을때, 하위 클래스는 상위클래스의 모든 멤버(필드,메서드 등)을 상속받는다.

 

하지만 부모 클래스의 생성자는 상속되지 않고 있으므로 부모클래스의 생성자를 하위 클래스에서 super 키워드를 통해 명시적 호출 후 초기화를 진행해줘야 한다.
부모클래스에 기본생성자가 존재할 경우에 super 키워드를 사용하지 않아도 자동으로 적용된다.

 

Q. 부모 클래스에 생성자가 없을 경우 ?

 

부모클래스에 생성자가 존재하지 않을 경우에 컴파일러가 자동으로 기본 생성자 (매개변수가 없는 생성자) 를 생성해 런타임 오류가 발생하지 않도록 조치를 해준다.

 

대신 컴파일러가 무조건 기본 생성자를 생성해주는 것이 아니라, 부모클래스에 생성자를 정의하지 않은 경우에만 생성해주므로 매개변수가 있는 다른 생성자가 존재할 경우에는 기본 생성자를 만들어주지 않는다.

 

 

 

 

즉, 정리하자면 아래와 같다.

 

1. 부모 클래스에서 매개변수가 있는 다른 생성자만 존재한다면 ,하위 클래스에서는 SUPER  키워드를 통해 명시적으로 호출을 진행해줘야 한다. 

public class Animal {
    private String name;

    public Animal(String name) {
        this.name = name;
    }
}

public class Dog extends Animal {
    private String breed;

    public Dog(String name, String breed) {
        super(name); // 상위 클래스의 생성자 명시적으로 호출
        this.breed = breed;
    }
}

위의 코드에서는 Animal이라는 부모 클래스에서 name을 입력받는 생성자만 존재하고, 기본생성자는 존재하지 않고 있다.

그로 인하여 Animal을 상속받은 Dog 클래스는 super키워드를 통해 생성자를 명시적으로 호출하고 있다.

 

 

2. 기본생성자와 다른 생성자가 같이 존재할 경우에는 하위 클래스에서 기본 생성자가 자동으로 적용된다.

public class Animal {
    private String name;

    public Animal(String name) {
        this.name = name;
    }
    
    public Animal(){ //기본 생성자
    }
}

public class Dog extends Animal {
    private String breed;

    public Dog(String name, String breed) { //Animal 기본 생성자 자동 호출
        this.breed = breed;
    }
}

 

위의 코드에서는 Animal 은 이름을 매개변수로 입력받는 생성자와 기본 생성자로 구성되어 있다.

기본 생성자가 존재하기때문에 자식 클래스인 Dog에서 super 키워드를 사용 안해도 기본 생성자가 호출되고 있음을 알려준다.

 

 

3. 부모클래스에 생성자가 아예 없으면 컴파일러가 기본 생성자를 생성해준다.

public class Animal {
    private String name;
    //생성자 미 존재
}

public class Dog extends Animal {
    private String breed;

    public Dog(String name, String breed) { //컴파일러 기본 생성자 자동 생성
        this.breed = breed;
    }
}

위의 코드에서 Animal이 생성자가 존재하지 않음에도 하위 클래스인 dog에서 문제가 발생하지 않는다.

컴파일러가 기본생성자를 만들어주고 자동으로 적용하기 때문이다.

 

 

 

 

그렇기때문에 생성자를 만들때 기본 생성자는 꼭 만들어야되는 점을 유의해야한다.

기본생성자가 아닌 다른 생성자를 호출하고 싶을 경우에만 super를 통해 호출해서 사용하는 것이 편리하다.

 

 

 

그럼 안뇽~

728x90