컴퓨터는 잘못이 없다..

[JAVA]다형성2_업캐스팅과 다운캐스팅(상속/다형성/업캐스팅과 타운캐스팅) 본문

공부/JAVA

[JAVA]다형성2_업캐스팅과 다운캐스팅(상속/다형성/업캐스팅과 타운캐스팅)

도토리까꿍v 2020. 12. 6. 18:18
Contents 접기

 

 

[예제코드]

 

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클래스의 필드와 메소드에만 접근 가능하다. 

 

 

Comments