[Java] 형변환(Type Casting) - 업캐스팅/다운캐스팅
2022. 10. 5. 14:51ㆍDev.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
'Dev.Program > Java & Spring' 카테고리의 다른 글
[Java] static (0) | 2022.10.05 |
---|---|
[Java] instanceof 연산자/다형성/자바프로그램실행과정/static (0) | 2022.10.05 |
[Java] 메서드 오버라이딩(Overriding) (1) | 2022.10.05 |
[Java] 상속(Inheritance) (1) | 2022.10.05 |
[Java] 패키지(package) / import (0) | 2021.01.23 |