< 객체 형변환 >
- 상속관계가 있어야 객체 형변환이 가능하다.
class A { }
class B extends A { }
class C extends A { }
class D extends C { }
1. 자동형변환 - 자식이 부모행세
상위클래스 변수명 = new 하위클래스( );
A a1 = new B( );
A a2 = new C( );
A a3 = new D( );
=> 자식을 부모행세를 하는 객체로 담는다.
자식이 부모행세 하는건 자동 형변환 가능
부모 : 카톡하기, 메일쓰기
자식 : 카톡하기, 메일쓰기, 결제하기, 쇼핑하기
( 자식은 이미 부모꺼 다 가짐 + 자기꺼 추가로 가짐 => 부모행세를 충분히 할 수 있다. => 자동형변환 해줌 )
=> 대신, 부모행세를 해야해서,
1. 부모한테 없는건 못가져오고 ( 결제하기, 쇼핑하기 )
2. 부모한테 있는건 당연히 가져오는데, 그걸 자식이 overriding 해놨을 경우
overriding 해놓은걸 가져온다.
자식 : "부모행세 해야하지만, 최신트렌드는 못참지!"
( '변수'는 이름 같은거여도 부모한테 있는걸로 가져오고, ( 별개의 변수다. 이름만 우연히 같을 뿐 )
'메소드'는 overriding 된걸로 가져옴 - 메소드는 우연히 이름이 같은게 아니라 @override 기능이 적용되는 것. )
---
2. 명시적 형변환 - 행세하다가 원래대로 "자기클래스"로 되돌아갈때만 쓰인다.
A a2 = new B ( ) ; 자동형변환 (A 부모 / B 자식 / 자식 a2로 부모행세중 )
B b3 = (B) a2; 명시적형변환 ( 행세하다가 원래 "자기클래스" 인 B 로 돌아갈 때 쓴다. )
( new 필요없다 )
( 원래 자기 역할로 돌아가는 것 => b3는 이제 다시 본래 자식역할을 한다.
부모꺼 자기꺼 당연히 다 사용 가능 )
< 부모는 절대로 자식 행세를 할 수 없다 >
A a2 = new A ( ); 그냥 A 부모객체 a2
B b2 = (B) a2; (X)
원래부터 A 였던 a2 객체는 B타입으로 못바꾼다. ( 명시적 형변환 X )
바꿔말하면,
B b2 = new A ( ); (X) <= 부모 A 가 자식 b2 행세를 하려고 한다. (X) 오류
부모는 절대 자식행세를 할 수 없다. ( 자동형변환이든, 명시적 형변환이든 안된다.)
부모는 자식만 가지고있는 추가적인 ( 결제하기, 쇼핑하기 ) 등의 기능이 없기 때문에, 자식의 행세를 할 수 없다.
컴파일은 ok 되는데 ( 자바가 형 비교만 하고 넘어감 )
직접 실행하면 error 난다.
결국 객체형변환은
1. 자식이 부모 행세를 하거나 (자동형변환)
2. 자식이 원래 자기클래스로 돌아가는것 (명시적형변환)
이 두가지가 끝.
근데 이걸 왜써? ( 그냥 자식은 자식으로 쓰면 안돼? 왜 굳이 부모행세 하게해서 기능 몇개 못쓰게 만들어? )
1. 여러가지 서로 다른 객체들을 하나의 "배열"로 모으고싶다
{ new A( ), new B( ), new C( ), new D( ) }
이 자식들의 부모클래스를 하나 만든다.
그리고 객체만들때, 이 부모클래스 객체로 만든다.
그럼 배열로 한 클래스 객체타입으로 넣을 수 있다.
A[ ] array = new A[4];
array[0] = new A( );
array[0] = new B( );
array[0] = new C( );
array[0] = new D( );
2. 메소드의 매개변수에도 여러가지 객체가 들어갈수 있다.
이럴 때, 객체 한 부모객체로 다 담아서 넣어주기 위해서.
void test ( A a1 ) { }
main : test( new A ( ) ) 호출실행
main : test( new B ( ) ) 호출실행
main : test( new C ( ) ) 호출실행
3.
class 한국타이어 extends 타이어{ }
class 금호타이어 extends 타이어{ }
타이어 tire1 = new 한국타이어( );
타이어 tire2 = new 금호타이어( );
이런식으로 그때그때 뽑아서
class자동차{
타이어 t1 = new 한국/금호타이어( );
이렇게 필요에 따라 쓸 수 있다.
---
자동형변환 ( 자식이 부모행세 )
==> 서로 다른타입의 객체들을 사용시 => 하나의 부모클래스 객체로 묶어서
여러가지 타입의 객체들을 모두 쓸 수 있게 하려고
명시적형변환 ( 자식이 다시 자식역할로 돌아오기 )
==> 자식이 부모행세를 하면 부모행세를 해야해서, 자식만 가진 기능은 사용 불가능 ( 제한됨 )
=> 근데 작업 하다보니, 자식만 가진 기능들도 필요할때
명시적 형변환해서 다시 자식을 자식역할로 돌리는 것.
4. jdk library 메소드 - 예를들어 Object 클래스 다 부모로취하니까 그거 이용하기 ( 보충 )
'Back to the Java' 카테고리의 다른 글
Exception 예외처리 / try-catch / throws / throw는 생성 (0) | 2022.07.01 |
---|---|
Interface 에 숨겨진 비밀 (0) | 2022.06.30 |
abstract 클래스-메소드 / super 메소드-생성자 (0) | 2022.06.27 |
상속과 Override, 상속을 막는 final 메소드와 final 클래스. (0) | 2022.06.27 |
클래스 안의 클래스 Inner class <- Outer class 에게 허락을 맡아라 (0) | 2022.06.27 |