타입캐스팅(형변환)

Mia Lee·2021년 12월 23일
0

JAVA

목록 보기
78/98
package ex_type_casting;

public class Ex1 {

	public static void main(String[] args) {

		// 업캐스팅 연습
		// 1. 서브클래스 타입 인스턴스 생성
		SmartPhone 내폰 = new SmartPhone();
		
		// 서브클래스 타입으로 접근 가능한 메서드 : 4개
		내폰.call(); // 상속받은 메서드
		내폰.sms(); // 상속받은 메서드
		내폰.kakaoTalk(); // 서브클래스에서 직접 정의한 메서드
		내폰.youtube(); // 서브클래스에서 직접 정의한 메서드
		
		System.out.println("==================================");
		
		// 2. 슈퍼클래스 타입 변수 선언 및 서브클래스의 인스턴스 전달
		HandPhone 엄마폰 = 내폰; // 서브클래스타입 -> 슈퍼클래스타입(업캐스팅, 자동형변환)
		// => 참조변수 내폰이 가진 데이터(주소값)을 전달
		
		// 슈퍼클래스 타입으로 접근 가능한 메서드 : 2개
		엄마폰.call(); // 상속받은 메서드
		엄마폰.sms(); // 상속받은 메서드
		// 업캐스팅 시 참조 가능한 영역의 축소가 일어나므로
		// 슈퍼클래스 타입으로 접근 가능한 메서드 갯수가 줄어들게 됨
		// => 즉, 슈퍼클래스 내의 멤버와 동일한 멤버에만 접근 가능하게 됨
//		엄마폰.kakaTalk(); // 에러 발생! 서브클래스에서 직접 정의한 메서드
//		엄마폰.youtube(); // 에러 발생! 서브클래스에서 직접 정의한 메서드
		
		System.out.println("==================================");
		
		// 또 다른 서브클래스 타입 인스턴스 생성
		SmartPhone 동생폰 = new SmartPhone();
		
		엄마폰 = 동생폰; // 서브클래스타입 -> 슈퍼클래스타입으로 업캐스팅
		엄마폰.call(); // 상속받은 메서드
		엄마폰.sms(); // 상속받은 메서드
		
		System.out.println("==================================");
		
		// 다운캐스팅 연습(허용되지 않는 경우)
		// 1. 슈퍼클래스의 인스턴스 생성
		HandPhone 엄마폰2 = new HandPhone();
		
		// 슈퍼클래스 타입으로 접근 가능한 메서드 : 2개
		엄마폰2.call();
		엄마폰2.sms();
		
		// 2. 서브클래스 타입 변수에 슈퍼클래스 인스턴스 전달
		// => 다운캐스팅 수행
//		SmartPhone 내폰2 = (SmartPhone) 엄마폰2; // 다운캐스팅 수행 (오류 발생!)
//		내폰2.call();
//		내폰2.sms();
//		내폰2.kakaoTalk();
//		내폰2.youtube();
		
		System.out.println("==================================");
		
		// 다운캐스팅 연습(허용되는 경우)
		// 1. 서브클래스의 인스턴스 생성(업캐스팅 수행 포함)
		HandPhone 엄마폰3 = new SmartPhone(); // 업캐스팅
		
		// 슈퍼클래스 타입으로 호출 가능한 메서드 : 2개 
		엄마폰3.call();
		엄마폰3.sms();
		
		// 2. 서브클래스 타입으로 다운캐스팅
		SmartPhone 내폰3 = (SmartPhone) 엄마폰3; // 다운캐스팅
		
		// 서브클래스 타입으로 호출 가능한 메서드 : 4개
		내폰3.call();
		내폰3.sms();
		내폰3.kakaoTalk();
		내폰3.youtube();
		
	}

}

class HandPhone {
	
	public void call() {
		System.out.println("HandPhone의 전화 기능!");
		
	}
	
	public void sms() {
		System.out.println("HandPhone의 문자 기능!");
		
	}
	
}

// SmartPhone 클래스 정의 - HandPhone 클래스 상속
class SmartPhone extends HandPhone {
	
	public void kakaoTalk() {
		System.out.println("SmartPhone의 카톡 기능!");
		
	}
	
	public void youtube() {
		System.out.println("SmartPhone의 유튜브 기능!");
		
	}
	
}







연습

package ex_type_casting;

public class Test1 {

	public static void main(String[] args) {
		Unit u = new GroundUnit();
		Tank t = new Tank();
		AirCraft ac = new AirCraft();
		/*
		 * a. u = (Unit) ac;
		 * b. u = ac;
		 * c. GroundUnit gu = (GroundUnit) u;
		 * d. AirUnit au = ac;
		 * e. t = (Tank) u;
		 * f. GroundUnit gu = t;
		 */
		
		t = (Tank) u;
		
		System.out.println("끝!");
		
	}
}
class Unit {}
class AirUnit extends Unit {}
class GroundUnit extends Unit {}
class Tank extends GroundUnit {}
class AirCraft extends AirUnit {}

0개의 댓글