[Java] 형변환(Type Casting) - 업캐스팅/다운캐스팅

2022. 10. 5. 14:51Dev.Program/Java & Spring

728x90

p.234

지난시간 폴더(JAVA0217)에

======== test3.java 만들기(p.234랑 똑같이 치기)

 

  • 생성자 자동생성 Alt + Shift + S → O 했을 때 나오는 창.
  • 지금은 Person2(String) 타입만 있음.

  • Person2() {} 만 적어줬는데
  • 생성자 만들 때 Person2() 가 생김!

 

< Alt + Shift + S → C > 부모랑 똑같은거 하나 만들어줌

 

======== Ex.java 만들기

p.254 (다형성)

< 레퍼런스 형변환 >

  • 참조형 변수(레퍼런스타입 변수)끼리의 형변환
  • 업캐스팅(Upcasting) 과 다운캐스팅(Downcasting) 으로 나뉨
  • 참조형 변수로 다른 타입의 인스턴스를 참조하기 위해 변환하는 것

 

 1. 업캐스팅(Upcasting)

  • 슈퍼클래스의 레퍼런스가 서브클래스의 인스턴스를 가리키는 것 (= 서브클래스의 인스턴스를 슈퍼클래스 타입으로 형변환(참조)하는 것)
  • 묵시적 형변환(자동 형변환)이 일어남
  • 참조 가능한 영역의 축소 발생 (= 슈퍼클래스로부터 상속된 멤버에만 접근 가능하고, 서브클래스 멤버 접근 불가)
  • 일반적으로 클래스끼리의 형변환은 업캐스팅을 의미함

2. 다운캐스팅(Downcasting)

  • 서브클래스의 레퍼런스가 슈퍼클래스의 인스턴스를 가리키는 것 (= 슈퍼클래스의 인스턴스를 서브클래스 타입으로 형변환하는 것)
  • 참조 가능한 영역의 확대 발생
  • 자동(묵시적) 형변환이 되지 않음 = 강제(명시적) 형변환 필요
  • 강제(명시적) 형변환을 통해 구문 오류가 해결되더라도 실제 실행 시점에서 오류가 발생하게 됨
  • ⇒ 존재하지 않는 영역의 참조 위험성 때문에

===================================================================

  • 다운 캐스팅 후에도 실행 시 예외(오류)가 발생할 수 있으므로 인스턴스의 클래스 타입과 참조하는 레퍼런스 변수의  상속 관계를 고려해서 명시적 형변환을 수행해야한다!

⇒ 결론! 이전에 이미 업캐스팅 된 레퍼런스를 다시 다운캐스팅하는 경우에만 안전! (그 외의 다운캐스팅은 인정되지 않는다!)    

 

p. 254

  • 오류가 안뜬다! (우리 기본형 형변환 할 때 자동형변환이랑 비슷한거 = 업캐스팅)

  • 업캐스팅

- 서브클래스에서 정의한 메서드 ⇒ 접근 불가!

 

------

배운 거 연습할 수 있게

======== Test.java 파일 만듬

------

 

< Ex.java >

 

  • 문법적 오류는 없으나 실행 시 오류가 뜸
  • c2.parentPrn();
  • c2.childPrn();
  • 이 코드를 적기도 전에 문제 생길 거란걸 미리 알려주는거!

- Child에서 접근 가능 한 메서드 : 2개

  • 근데 Parent 의 메서드를 받아 왔기 때문에 ChildPrn()은 사용할 수 없음!
  • 문법적 오류는 없으나 실행할 때 오류가 뜸! (없기 때문에!)

  • 마우스 갖다대면 Add cast to ‘Child’ ⇒ 강제 형변환 가능! (=다운 캐스팅)

 

> 업캐스팅 후 다운캐스팅 해줘야 문법적/논리적 오류가 안생김

  • 다운캐스팅은 이렇게 쓰는 거 말고는 허용 안됨

  • 업캐스팅 후 다운캐스팅 해줘서 실행 잘 됨!



728x90