GitHub

https://github.com/Backcoder-June

BackCoder 기록 그리고 숙달

Back to the Java

A a1 = new B( ); 객체 형변환 , 자동 / 명시적

Backcoder 2022. 6. 30. 13:06

< 객체 형변환 > 
상속관계가 있어야 객체 형변환이 가능하다. 

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 클래스 다 부모로취하니까 그거 이용하기  ( 보충 )