본문 바로가기

Java

자동타입변환(Promotion)

어제 글에서 다형성을 할때 부모 클래스와 자식클래스간의 자동타입변환이 이루어 진다고 했다. 

그것에 이어서 정리한다. 

자동타입변환(Promotion)

말 그대로 프로그램 실행도중 자동적으로 타입이 변환되는 것을 말한다. 방식은 객체를 만드는것과 비슷하다.

자동타입변환

부모클래스 변수 = 자식클래스타입;

자식 클래스는 부모 클래스를 상속받기 때문에 부모클래스의 필드,메소드를 사용할 수 있다.

바꿔말하면 자식 클래스를 부모클래스 취급 할 수 있다는 말이다.

예를 들어 

class Animal{....}

class Cat extends Animal{....}

두가지 클래스가 있다. 이 클래스들은 Animal이 부모클래스 , Cat이 자식 클래스이다.

'동물'이라는 큰 카테고리가 있고 '고양이'라는 카테고리는 동물 카테고리를 상속받아 동물의 특성과 기능을 상속받는다.

동물카테고리의 특징과 기능을 상속받으면서 고양이 카테고리의 특징을 더해주는것이다. << 이이야기를 어제 이야기한 타이어에 대입해보면 동물 카테고리에 '개'카테고리를 붙일수도있고 '호랑이'카테고리를 붙일수도있다는 것.

이제 자동 타입변환을 해보자

일단 Cat의 객체를 생성한다. 

Cat cat = new Cat();

그리고 부모클래스로 자동타입변환을 시킨다. 

Animal animal = cat;

Cat타입으로 객체를 생성한 cat을 animal변수에 대입하면 Cat는 자동타입변환이 진행된다. 

위의 두 코드를 줄여서 

Animal animal = new Cat();  으로 사용한다.

이것을 풀어 보면 어떻게 되는가 

우선 힙 영역에서 Cat과 Animal객체가 있고 Cat은 Animal을 상속받고 있다. 

cat은 Cat타입의 참조변수로서 Cat객체의 주소를 참조 하고있다. 

이것을 타입변환해서 animal에 대입했을때 animal은 무엇을 가르키는가.

cat을 대입헀기때문에 Cat객체의 주소를 참조한다. 

결국 cat, animal 은 같은 객체를 참조하게된다 그저 타입이 변환되는것뿐이다. 

실제로 자바에서 cat == animal 의 결과를 확인하면 true가 뜬다. 같은 주소를 참조하고있다는 뜻.

자동 타입변환은 부모와 자식 클래스 간에 이루어 지는데 만약 직속 부모가 아니더라도 상속계층에서 상위의 부모라면 자동타입변환이 가능하다 

예를 들어

<<=는 상속받고있다는 뜻

A  클래스 <<= B class

    <<=C class

B class <<= D class

C class <<= E class   

이런 식으로 상속이 되고 있다고 보자

이럴때 b, c, d, e 라는 객체를 만든뒤 자동타입변환이 가능한 경우를 찾아보면  

A a1=b;(가능)        B b1 = d;(가능)        B b2 = E;(불가능)

A a2=c;(가능)        C c1 = E;(가능)        C c2 = d;(불가능)

A a3=d;(가능)

A a4=e;(가능)

이렇게 된다 D와E는 직접 A를 상속받지는 않지만 B,C에서 A를 상속받기 때문에 자동타입변환이 가능하다.

하지만 B와E 그리고C와D의 경우 상속관계가 아닌 상관없는 클래스이기 때문에 자동타입변환이 불가능하다. 

 이렇게 자동타입변환이 일어난 이후에는 자식클래스의 필드, 메소드는 접근할 수 없다. 

변수는 자식클래스의 주소를 참조하지만 접근할 수 있는 멤버는 부모 클래스의 멤버로 한정된다. 

자식클래스의 메소드에 접근할수있는 경우가 한가지 있는데 만약 부모클래스의 메소드를 자식 클래스에서 재정의 (Override)했다면 자식클래스의 메소드가 호출된다. 

코드로 보자

class Parent{ void method1(){...}

  void method2(){...}}


class Child{ void method2(){...}<<Override

  void method3(){...}}

main

Parent parent = new Child ();

parent.method1();

parent.method2();

parent.method3();

이런 식으로 메소드를 호출했을 때 메소드 1은 부모 클래스의 메소드이기 때문에 호출이 가능하다

메소드 2의 경우 자식클래스에서 재정의 되었기 때문에 자식클래스의 메소드2를 호출한다. 

메소드 3의 경우 부모클래스에는 없는 자식클래스의 메소드이기 때문에 호출이 불가능해서 에러가 발생한다. 

 

'Java' 카테고리의 다른 글

배열로 객체관리하기  (0) 2018.12.21
자동타입변환2 필드의 당형성  (0) 2018.12.21
타입변환. 다형성  (0) 2018.12.20
메소드 재정의(Override)와 몇가지..  (0) 2018.12.12
상속이란?  (0) 2018.12.05