컴퓨터는 잘못이 없다..
[JAVA]다형성2_업캐스팅과 다운캐스팅(상속/다형성/업캐스팅과 타운캐스팅) 본문
[예제코드]
Phone.java
package test.mypac;
//extends는 어떤 클래스를 상속 받을 때 사용하는 예약어이다.
//어떤 클래스도 extends 하지 않으면 자동으로 Object 클래스를 상속받게 된다.
//따라서 Ojbect 클래스를 상속받을 거라면 생략이 가능하다.
public class Phone{
//디폴트 생성자
public Phone() {
System.out.println("Phone 생성자 호출됨");
}
//전화거는 non-static 메소드
public void call() {
System.out.println("전화를 걸어요!");
}
}
HandPhone.java
package test.mypac;
public class HandPhone extends Phone{
//디폴트 생성자
public HandPhone() {
System.out.println("HandPhone() 생성자 호출됨");
}
//이동중에 전화를 걸어요
public void mobileCall() {
System.out.println("이동중에 전화를 걸어요");
}
//사진을 찍어요
public void takePicture() {
System.out.println("30만 화소의 사진을 찍어요!");
}
}
MainClass03.java
package test.main;
import test.mypac.HandPhone;
import test.mypac.Phone;
public class MainClass03 {
public static void main(String[] args) {
//업캐스팅(형변환 생략가능)
//HandPhone 객체를 생성해서 참조값을 부모 type 지역변수에 대입
Object p1 = new HandPhone();
System.out.println("---------");
//다운캐스팅(형변환 생략불가능)
//대입연산자의 우측을 Phone type으로 casting(형변환)해서
//p1안에 있는 참조값을 Phone type변수 p2에 대입
Phone p2 = (Phone)p1; //p1은 Object타입(부모)이라 형변환이 필요함!
System.out.println("---------");
p2.call();
System.out.println("---------");
//다운캐스팅(형변환 생략불가능)
//p1에 있는 값을 HandPhone type으로 casting해서
//HandPhone type 변수 p3에 대입
HandPhone p3 = (HandPhone)p1; //p1는 Object타입(부모)이라 형변환이 필요함!
System.out.println("---------");
p3.call();
p3.takePicture();
}
}
▲MainClass03 실행결과
Phone 생성자 호출됨
HandPhone() 생성자 호출됨
---------
---------
전화를 걸어요!
---------
---------
전화를 걸어요!
30만 화소의 사진을 찍어요!
[예제코드 설명]
1. 예제 코드 상속관계 파악하기
2. 예제에서 쓰인 업캐스팅과 다운캐스팅
①MainClass03.java 실행과정을 그림으로 표현해보았다!
②업캐스팅과 다운캐스팅이란?
조상타입 <- 자손타입 (Up-casting) : 형변환 생략 가능
자손타입 <- 조상타입 (Down-casting) : 형변환 생략 불가능
Object p1=new HandPhone(); --> 업캐스팅
Phone p2=(Phone)p1; --> 다운캐스팅
HandPhone p3=(HandPhone)p1; --> 다운캐스팅
이렇게 외우면 쉽다~!
③코드 설명
*new HandPhone()을 하면 HandPhone 클래스의 부모클래스들 모두 생성되며 하나의 참조값으로 관리된다.
Object p1=new HandPhone();
--> 여기서 p1은 조상타입, new HandPhone()은 자손타입 따라서 업캐스팅!
--> p1은 Object타입! 따라서 p1.~으로 Object의 필드와 메소드에 접근 가능하다.
Phone p2=(Phone)p1;
--> 여기서 p2는 자손타입 p1은 조상타입 따라서 다운캐스팅!
--> p2는 Phone타입! p2.~으로 Object, Phone의 필드와 메소드에 접근 가능하다.
HandPhone p3=(HandPhone)p1;
--> 여기서 p3는 자손타입 p1은 조상타입 따라서 다운캐스팅!
--> p3는 HandPhone타입! p3.~으로 Object, Phone, HandPhone의 필드와 메소드에 접근 가능하다.
3. 실행결과 분석해보기
4. 퀴즈!
Object p1=new Phone(); 에서
p1.~ 으로는 Phone클래스의 calll()메소드, HandPhone()클래스의 takePicture() 메소드를 호출할 수 있을까?
▼호출할 수 없다.
아래 그림과 같이 에러가 난다. p1은 Object타입이므로 Object클래스의 필드와 메소드에만 접근 가능하다.
'공부 > JAVA' 카테고리의 다른 글
[JAVA]다형성3_다운캐스팅 주의할 점 (0) | 2020.12.07 |
---|---|
[JAVA]다형성1_다형성이란?(상속과 다형성) (0) | 2020.12.05 |
[JAVA]최상위 클래스인 Object클래스 (상속은 extends, 상속관계에서 생성자호출, 다중상속은 불가능하다) (0) | 2020.11.29 |