본문 바로가기

자바 프로그래밍

[JAVA] 객체의 형변환

- 대입 연산자를 기준으로 왼쪽과 오른쪽 변수의 자료형이 서로 달랐을 경우 객체 형변환이 발생한다.

그런데 무조건 왼쪽과 오른쪽의 관계가 반드시 상속 관계여야 한다.

 

A obj = new B(); → 에러 발생

 

하지만! 

Class B extends A {

}

상속 관계인 경우 에러가 발생하지 않음 

 

 

 

원래는 

Printer p = (Printer) (new LGPrinter()); 이렇게 해주는게 맞는데

오른쪽이 하위 클래스인 경우 (Printer) 을 생략이 가능함.

 

왜 ?

 

class A{

}

class B extends A{

    // super() 생략
}

 

new B(); → 하는 순간 A의 공간이 만들어지고, B의 공간이 만들어지고.. 그리고 이 전체를 B로 인식

 

이미 new B(); 라는 공간에는 A 공간과 B 공간이 존재하므로 

 

obj를 B에서 A 영역만 접근이 가능! 

 

묵시형 변환에서는 A의 객체 obj는 B 영역에서 Override한 멤버 함수로 접근이 된다. (다형성)

 

 

tv.power (o) / tv.name (x) / tv.print() (x) / tv.powerOn() (o)

 

 

상퀴클래스 타입 자리의 객체는 반드시 묵시형 변환이 되어 있어야 함.

 

 

메모리 안 잡힌곳에 obj2가 접근을 하기 때문에 런타임 에러가 발생

 

부모 클래스가 묵시형 변환이 되어 있어야 B로 명시적 형변환이 가능하다.

 

반드시 new A() 가 들어오는 것이 아니라, 변수가 와야함.

 

이 변수는 자식을 가리키고 있어야 한다. (묵시형 변환이 되어 있어야 함)

 

명시적 형변환의 예시 (중요)

 

 

명시적 형변환을 그림으로 표현하면 아래와 같다.

 

 

 

Child01.java

 

Child02.java

Parent.java

Child01 에서 오버라이딩 되지 않은 play(), sleep() 은 호출할 수 없지만 오버라이딩된 info()함수는 호출이 가능하다.

 

근데 묵시적 형변환은 언제 씀 ?

 

 

이렇게 긴 코드를 메소드로 만들고 싶었다 ????

 

묵시적 형변환 ? 다형성 (어떠한 인풋에 유연하게 대처. 영향이 줄어든다)

 

 

 

 

회사에서 유지보수를 할 때 버전업을 하는 경우 왼쪽의 경우와 같이 지속해서 변경해주어야 하지만

 

control 클래스 에서 AA a = new A1(); 와 같이 사용할 경우 (묵시적 형변환)

                          AA a = new A2(); 와 같이 사용할 경우

 

실제 보이는 결과는 같게 하고 싶을 때!!!

 

 

** instanceof 는  상속관계일때만 쓸수 있음

 

메소드에서 매개 변수를 묵시적 형변환을 통해 받는데..

 

p instanceof Child01 일때 

Child01 a = (Child01) p;

a.play(); // Child01 클래스에만 있는 클래스를 호출할 수 있다.

instanceof 는 상속 관계일 경우에만 사용할 수 있음.

 

 

 

 

'자바 프로그래밍' 카테고리의 다른 글

[JAVA] final 키워드  (0) 2019.05.21
[JAVA] 인터페이스  (0) 2019.05.21
[JAVA] 추상클래스 (abstract)  (0) 2019.05.20
[JAVA] 상속  (0) 2019.05.20
[JAVA] static 키워드  (0) 2019.05.20