- 대입 연산자를 기준으로 왼쪽과 오른쪽 변수의 자료형이 서로 달랐을 경우 객체 형변환이 발생한다.
그런데 무조건 왼쪽과 오른쪽의 관계가 반드시 상속 관계여야 한다.
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 |