프로그래밍 언어/JAVA

상속과 생성자

· 코딩마이데이

서브 클래스와 슈퍼 클래스의 호출 및 실행

서브 클래스와 슈퍼 클래스는 각각 생성자를 가지고 있습니다.

서브 클래스의 객체가 생성되면 이 객체 속에 서브 클래스와 멤버와 슈퍼 클래스의 멤버가 모두 들어있습니다.

서브 클래스의 생성자는 생성된 객체 속에서 들어 있는 서브 클래스의 맴버 초기화나 필요한 초기화를 수행하고, 슈퍼 클래스의 생성자는 생성된 객체 속에 있는 슈퍼 클래스의 멤버 초기화나 필요한 초기화를 각각 수행합니다.

 

슈퍼 클래스의 생성자가 먼저 실행된 후 서브 클래스의 생성자가 실행됩니다.

C = new C();

 

컴파일러는 이 new 문장이 실행되면 즉각 생성자 C()를 호출하게 합니다.

 

서브 클래스의 생성자가 먼저 호출되지만, 결국 슈퍼 클래스의 생성자가 먼저 실행되고 서브 클래스의 생성자가 나중에 실행됩니다.

컴파일러는 서브 클래스의 생성자에 대해, 슈퍼 클래스의 생성자를 호출한 뒤 자신의 코드를 실행하도록 컴파일합니다.

 

슈퍼 클래스와 서브 클래스의 생성자 간의 호출

 

서브 클래스에서 슈퍼 클래스 생성자 선택

서브 클래스의 개발자가 서브 클래스의 각 생성자에 대해, 함께 실행될 슈퍼 클래스의 생성자를 지정하여야 합니다

하지만, 개발자가 슈퍼 클래스의 생성자를 명시적으로 지정하지 않는 경우, 컴파일러는 자동으로 슈퍼 클래스의 기본 생성자를 호출하도록 컴파일합니다.

 

슈퍼 클래스의 기본 생성자가 자동 선택되는 경우

개발자의 명시적 지시가 없으면, 서브 클래스의 생성자가 기본 생성자이든 매개 변수를 가진 것이든, 슈퍼 클래스에 만들어진 기본 생성자가 선택됩니다.

이 선택은 자바 컴파일러에 의해 강제로 이루어집니다.

슈퍼 클래스 B의 셍성자에 대해 슈퍼 클래스 A의 기본 생성자가 묵시적으로 선택

 

 

 

슈퍼 클래스 A에 기본 생성자가 없는 경우. 오류 발생

 

이 경우 클래스 B의 생성자와 짝을 이룰 기본 생성자가 클래스 A에 없기 때문에, 컴파일러는 'implict super constructor A() is undefined. Must explicitly invoke another constructor" 오류 메시지를 출력합니다.

b = new B(5);

 

서브 클래스 B의 매개변수를 가진 생성자도 슈퍼 클래스 A의 기본 생성저와 짝을 이룸

 

 

super()를 이용하여 명시적으로 슈퍼 클래스의 생성자 선택

서브 클래스의 생성자에서 슈퍼 클래스의 생성자를 명시적으로 선택하는 것이 원칙입니다.

서브 클래스의생성자에서  super()를 이용하면, 슈퍼 클래스 생성자를 명시적으로 선택할 수 있습니다.

super()는 슈퍼 클래스 생성자호출하는 코드입니다. 괄호 안에 인지를 전달하여 슈퍼 클래스의 생성자를 호출할 수 있습니다.

b = new B(5);

 

B(int x)의 생성자는 첫 코드로 다음 코드를 실행하면,

super(x); // x 값은 5

 

super(x)는 슈퍼  클래스 A의 다음 생성자를 호출하고, x에 5을 전달합니다.

A(int x) { ... } // x에 5를 전달받음

 

중요한 것은 super() 는 반드시 생성자의 첫 라인에 사용되어야 한다는 점입니다.

클래스 B에서 super()를 이용하여 명시적으로 슈퍼 클래스 A의 생성자 선택

 

super()를 활용한 ColorPoint 작성

class Point {
    private int x, y; // 한 점을 구성하는 x, y 좌표

    public Point() {
        this.x = this.y = 0;
    }

    public Point(int x, int y) {
        this.x = x;
        this.y = y;
    }

    public void showPoint() { // 점의 좌표 출력
        System.out.println("(" + x + "," + y + ")");
    }
}

class ColorPoint extends Point { // Point를 상속받은 ColorPoint 선언
    private String color; // 점의 색
    public ColorPoint (int x, int y, String color) {
        super(x, y);
        this.color = color;
    }

    public void showColorPoint() { // 컬러 점의 좌표 출력
        System.out.print(color);
        showPoint(); // Point 클래스의 showPoint() 호출
    }
}

public class SuperEx {
    public static void main(String[] args) {
        ColorPoint cp = new ColorPoint(5, 6, "blue");
        cp.showColorPoint();
    }
}

 

실행 결과

blue(5,6)

'프로그래밍 언어 > JAVA' 카테고리의 다른 글

메소드 오버라이딩  (0) 2025.02.10
업캐스팅과 instanceof 연산자  (0) 2025.02.09
상속과 protected 접근 지정자  (0) 2025.02.07
클래스 상속과 객체  (1) 2025.02.06
상속  (0) 2025.02.06