Java

Java) 객체지향 프로그래밍 : 상속성 및 다형성(3)

pogun 2025. 1. 9. 00:19

다형성과 생성자 호출: 부모 클래스 매개변수 생성자 호출 방법

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


        Parent par = new Child();
    }
}

: 부모 타입 참조 변수(par)가 자식 클래스(child)의 객체를 참조

: 다형성을 통해 부모 클래스의 메서드만 접근 가능

public class Parent {

    private int number;

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

    public Parent(int number) {
        this.number = number;
        System.out.println("Parent(int number) 기본생성자");
    }
}
public class Child extends Parent{

    String name;

    public Child() {
        super();
        System.out.println("Child 기본생성자");
    }
}

출력값 : Parent 기본생성자, Child 기본생성자

: 여기서 " Parent 기본생성자 " 이게 아닌 "Parent(int number) 기본생성자" 이것을 출력하고 싶으면 아래 코드처럼 수정

public class Child extends Parent{

    String name;

    public Child() {
        super(0);
        System.out.println("Child 기본생성자");
    }
}

: super() 호출을 super(int number)로 변경하여 부모 클래스의 매개변수 생성자를 호출해야 한다.

부모 메서드 호출과 자식 메서드 오버라이딩의 결과 이해

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


        Parent par = new Child();
        par.parent_method();
        par.method(); 
    }
}
public class Parent {

    private int number;

    public void parent_method(){
        System.out.println("Parent 클래스의 parent_method()");
    }

    public void method(){
        System.out.println("Parent 클래스의 method()");
    }
}
public class Child extends Parent{

    String name;

    @Override
    public void method() {
        System.out.println("Child 클래스에서 오버라이드된 method()");
    }
}

 

: Parent 클래스의 method()를 호출하지만 출력값은 Child의 Override된 결과값이 출력 된다.

: 고쳐(추가) 기입이 진행되기 때문이다.

: "Parent 클래스의 method()"  -> "Child 클래스에서 오버라이드된 method()" 이렇게 된 것

instanceof와 형변환을 활용한 자식 클래스 고유 메서드 호출

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


        Parent par = new Child();

        if(par instanceof Child){
            System.out.println("Child class로 생성");
            Child chi = (Child) par;
            chi.child_method();
        }
    }
}

: par에는 child_method()가 없기 때문에 child로 형변환을 해준다.

public class Parent {

    private int number;

    public void parent_method(){
        System.out.println("Parent 클래스의 parent_method()");
    }

    public void method(){
        System.out.println("Parent 클래스의 method()");
    }
}

: main에서 호출한 것을 보면 부모클래스인 Parent에는 없는 메서드이다.

: 그런데 어떻게 호출이 되었는가? 형변환을 해줘서!

public class Child extends Parent{

    String name;

    public void child_method() {
        System.out.println("Child 클래스의 고유 메서드: child_method()");
    }
}

: par이 실제로 child 클래스의 인스턴스이므로 조건이 참이라 첫 번째 행 출력

: 형변환된 chi 객체로 child 클래스의 고유 메서드 child_method()를 호출 두 번째 행 출력

부모-자식 클래스 관계와 생성자 활용

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

        Child ch = new Child(13, "일지매");
        System.out.println(ch.toString());
    }
}

: Child 객체를 생성한 뒤, toString() 메서드를 호출하여 객체 정보를 출력

public class Parent {

    private int number;

    public Parent(int number){
        this.number = number;
    }

    public int getNumber() {
        return number;
    }
}

: 정수형 필드를 가지고 있으며, 매개변수 생성자를 통해 초기화 된다.

: getNumber() 메서드는 number 값을 반환한다.

: Parent 클래스는 객체의 공통 속성을 정의하는 부모 클래스 역할

public class Child extends Parent{

    private String name;

    public Child(int number, String name) {
        super(number);
        this.name = name;
    }

    @Override
    public String toString() {
        return "Child{" +
                "number : " + getNumber() + " " +
                "name : '" + name + '\'' +
                '}';
    }
}

: Parent 클래스를 상속받아 number 필드를 물려받고, 추가적으로 name이라는 문자열 필드를 정의

: 생성자를 통해 부모 클래스의 필드(number)와 자식 클래스의 필드(name)을 초기화

: toStirng 메서드를 오버라이드하여 number와 name을 포함한 객체 정보를 문자열로 출력