본문 바로가기
개발 수업/JAVA

[Java] 상속/자동 타입 변환(Promotion)

by 오늘 하루s 2023. 5. 17.
728x90
더보기

Day14-3. 230517

타입변환과 다형성

다형성이란?

같은 타입이지만 실행 결과가 다양한 객체 대입(이용) 가능한 성질

- 부모 타입에는 모든 자식 객체가 대입 가능

-> 효과 : 객체 부품화 가능

 

 

자동 타입 변환(Promotion)

- 상속관계에 있는 클래스 간에 프로그램 실행 도중에 자동적으로 타입변환이 일어나는 것

클래스         참조변수 = new 클래스();
부모타입     참조변수 = 자식타입
부모클래스 참조변수 = new 자식 클래스();

- 클래스의 변환은 상속 관계에 있는 클래스 사이에서 발생.

- 자식은 부모타입으로 자동 타입 변환 가능

- 자식은 부모의 특징과 기능을 상속받기 때문에 부모와 동일하게 취급될 수 있다.

- 바로 위의 부모가 아니더라도 상속 계층에서 상위 타입이라면 자동 타입 변환이 일어날 수 있다.

 

- 부모 타입으로 자동 타입 변환된 이후에는 부모 클래스에 선언된 필드와 메소드만 접근 가능

- 그러나 메소드가 자식 클래스에서 재정의 되었다면 자식 클래스의 메소드가 대신 호출됨.

 

 

예제1)

Parent 클래스>

1
2
3
4
5
6
7
8
9
10
package Ex;
 
public class Parent {
    public void method1() {
        System.out.println("Parent-method1()");
    }
    public void method2() {
        System.out.println("Parent-method2()");
    }
}
cs

 

Parent의 자식 클래스 Child>

1
2
3
4
5
6
7
8
9
10
11
12
package Ex;
 
public class Child extends Parent {
        @Override
        public void method1() {
            System.out.println("Child-method2()");
        }
        
        public void method3() {
            System.out.println("Child-method3()");
        }
}
cs

 

실행 클래스>

1
2
3
4
5
6
7
8
9
10
11
12
13
package Ex;
 
public class ChildExample {
 
    public static void main(String[] args) {
        Child child = new Child();
        
        Parent parent = child; //자동 타입 변환
        parent.method1();
        parent.method2(); //재정의된 메소드가 호출됨.
        //parent.method3(); //호출 불가능
    }
}
cs

Child 객체는 method3() 메소드를 가지고 있지만, parent 타입으로 변환되 이후에는 method3() 메소드를 호출할 수 없음.

method2() 메소드는 부모와 자식 모두에게 있기 때문에 재정의되 메소드는 타입 변환 이후에도 자식 메소드가 호출됨.

 

 

예제2)

메소드가 자식 클래스에서 재정의 되었다면 자식 클래스의 메소드가 대신 호출됨.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
package chap0607;
 
class GrandFather02{
    int height = 160;
    String name = "홍할";
    void sing() {System.out.println("할아버지의 sing()");}
}
class Father02 extends GrandFather02{
    int height = 170;
    String addr = "서울";
    void dance() {System.out.println("아빠의 dance()");}
    @Override
    void sing() {System.out.println("아빠의 sing()");}
}
class Son02      extends Father02{
    int height = 180;
    String gender = "남자";
    void run() {System.out.println("아들의 run()");}
    @Override
    void sing() {System.out.println("아들의 sing()");}
}
 
public class promotion {
 
    public static void main(String[] args) {
        GrandFather02 gf1 =    new GrandFather02(); 
        System.out.println("할아버지타입참조변수gf1.height="+gf1.height); //160
        System.out.println("할아버지타입참조변수gf1.name="+gf1.name);
        gf1.sing();
System.out.println();

        GrandFather02 gf2 =    new Father02();
        System.out.println("할아버지타입참조변수gf1.height="+gf2.height); //160
        System.out.println("할아버지타입참조변수gf1.name="+gf2.name);
        //System.out.println("할아버지타입참조변수gf1.addr="+gf2.addr); //에러
        gf2.sing();
        //gf2.dance();  //에러

System.out.println();
        GrandFather02 gf3 =    new Son02();
        System.out.println("할아버지타입참조변수gf3.height="+gf3.height); //160
        System.out.println("할아버지타입참조변수gf3.name="+gf3.name);
        gf3.sing();
    }
}
cs
더보기

* 실행 결과

 

할아버지타입참조변수gf1.height=160
할아버지타입참조변수gf1.name=홍할
할아버지의 sing()


할아버지타입참조변수gf1.height=160
할아버지타입참조변수gf1.name=홍할
아빠의 sing()


할아버지타입참조변수gf3.height=160
할아버지타입참조변수gf3.name=홍할
아들의 sing()

728x90