IMG-LOGO
공지사항 :

자바 상속(Inheritance)과 생성자(Constructor)

lmkfox - 2025-07-15 06:55:50 16 Views 0 Comment

1. 자바에서 상속과 생성자의 기본 관계

  • 자식 클래스는 부모 클래스의 필드와 메서드를 상속받지만, 생성자(Constructor)는 상속되지 않습니다.

  • 하지만 객체를 생성할 때는 부모 클래스의 생성자도 반드시 호출되어야 합니다.

  • 자바에서는 자식 클래스의 생성자에서 자동으로 **부모 클래스의 기본 생성자(super())**를 호출합니다.


2. super() 키워드

super()는 자식 클래스 생성자 내부에서 부모 클래스의 생성자를 명시적으로 호출하는 역할을 합니다.

class Parent {
    Parent() {
        System.out.println("부모 생성자 호출");
    }
}

class Child extends Parent {
    Child() {
        super(); // 생략 가능. 자동으로 부모의 기본 생성자 호출
        System.out.println("자식 생성자 호출");
    }
}


3. 부모 클래스에 기본 생성자가 없을 경우

부모 클래스에 기본 생성자가 없고, 매개변수가 있는 생성자만 존재하면 **자식 클래스에서 반드시 super(매개변수)**를 명시해야 합니다.

class Parent {
    Parent(String name) {
        System.out.println("부모 생성자: " + name);
    }
}

class Child extends Parent {
    Child() {
        super("홍길동"); // 반드시 명시적으로 호출해야 함
        System.out.println("자식 생성자");
    }
}
만약 super("홍길동")을 작성하지 않으면 컴파일 오류가 발생합니다. 자바는 생성자 첫 줄에서 반드시 부모 생성자 호출을 요구합니다.


4. 생성자 호출 순서

객체를 생성할 때 호출 순서는 다음과 같습니다.

  1. 자식 클래스 생성자에서 super()를 통해 부모 생성자 호출

  2. 부모 클래스 생성자의 코드 실행

  3. 자식 클래스 생성자의 코드 실행

예시:

class Animal {
    Animal() {
        System.out.println("Animal 생성자");
    }
}

class Dog extends Animal {
    Dog() {
        System.out.println("Dog 생성자");
    }
}

public class Main {
    public static void main(String[] args) {
        Dog d = new Dog();
    }
}

출력 결과:

Animal 생성자  
Dog 생성자


5. 생성자 오버로딩과 상속

부모 클래스가 생성자 오버로딩(overloading)을 제공할 때, 자식 클래스에서도 다양한 부모 생성자를 선택적으로 호출할 수 있습니다.

class Parent {
    Parent() {
        System.out.println("기본 생성자");
    }

    Parent(String msg) {
        System.out.println("매개변수 생성자: " + msg);
    }
}

class Child extends Parent {
    Child() {
        super("Hello");
        System.out.println("자식 생성자");
    }
}


6. super()와 this()의 차이

구분

설명

super()

부모 클래스의 생성자 호출

this()

같은 클래스의 다른 생성자 호출

  • 둘 다 반드시 생성자의 첫 줄에 위치해야 하므로 동시에 사용할 수 없습니다.


7. 생성자 상속은 불가능하지만 호출은 필수

  • 생성자는 클래스 이름과 동일하고 반환형이 없으며, 상속되지 않는다.

  • 그러나 자식 클래스에서 객체를 생성할 때 부모의 생성자가 반드시 호출된다.

  • 이는 부모 클래스의 필드를 올바르게 초기화하고, 객체를 안정적인 상태로 만들기 위함이다.


8. 예제 종합

class Vehicle {
    String type;

    Vehicle(String type) {
        this.type = type;
        System.out.println("Vehicle 생성자: " + type);
    }
}

class Car extends Vehicle {
    String brand;

    Car(String type, String brand) {
        super(type); // 부모 생성자 호출
        this.brand = brand;
        System.out.println("Car 생성자: " + brand);
    }
}

public class Main {
    public static void main(String[] args) {
        Car myCar = new Car("승용차", "현대");
    }
}

출력:

Vehicle 생성자: 승용차  
Car 생성자: 현대


9. 요약

항목

설명

생성자 상속 여부

상속되지 않음

부모 생성자 호출 방법

super() 사용

기본 생성자 없을 경우

반드시 super(매개변수) 호출 필요

생성자 호출 순서

부모 → 자식

this()와 super()

생성자 내에서 첫 줄에만 사용 가능, 동시에 사용 불가

생성자의 역할

객체 초기화, 상속 구조에서 안정적인 상태 보장


10. 결론

상속 구조에서 생성자는 매우 중요한 역할을 하며, 부모 클래스가 자식 클래스보다 먼저 초기화되어야 객체가 올바른 상태로 만들어집니다. 자바에서는 이를 강제하기 위해 생성자 호출 순서와 규칙을 명확히 정의하고 있습니다. 따라서 상속을 사용하는 클래스 구조에서는 생성자의 흐름을 반드시 이해하고 있어야 합니다.


댓글