Reference



  • UpCasting
  • DownCasting


레퍼런스 형 변환

상속,인터페이스 부모 자식간에 레퍼런스 타입의 형변환


1. UpCasting

부모는 자식객체의 멤버에 접근할 수 없었지만 Upcasting을 통해 부모의 객체로 자식 객체의 멤버를 사용할 수 있게 됨 단, 부모가 갖고 있는 멤버 한정


UpCasting 첫번째 방법

childClass ch = new childClass();
Parents pa = ch;  // 업캐스팅 , 자식 객체명 앞에 (부모타입) 붙어야하나 생략가능


UpCasting 두번째 방법

parents pa = new childClass();  // 부모타입 객체명 = new 자식타입


예제

class Animal { // super 클래스
	String name;

	public void name() {
		name = "동물";
		System.out.println("Animal = " + name);
	}
}
//=======================================================
class Dog extends Animal { // Animal 클래스 상속
	public void name() { // 오버라이딩
		name = "강아지";
		System.out.println("Dog = " + name);
	}

	public void dMethod() { // Dog 메소드
		System.out.println("반려동물");
	}
}
//=======================================================
class Lion extends Animal { // Animal 클래스 상속
	public void name() { // 오버라이딩
		name = "사자";
		System.out.println("Lion= " + name);
	}
}
//=======================================================
class Yorkshire extends Dog { // Dog 클래스 상속
	public void name() { // 오버라이딩
		name = "요크셔테리어";
		System.out.println("Yorkshire = " + name);
	}
}
//=======================================================
public class RefCasting {

	public static void main(String[] args) {
		Dog d1 = new Dog();
		Animal a1 = (Animal) d1; // 업캐스팅 / 부모타입 생략 가능
		a1.name(); // 출력 : 강아지
		// a1.dMethod(); // 자식 클래스에만 있는 메소드로, 부모 객체로 호출 불가

		Lion l1 = new Lion();
		Animal a2 = l1; // 업 캐스팅
		a2.name(); // 출력 : 사자

		Animal a3 = new Yorkshire(); // 업 캐스팅
		a3.name(); // 출력 : 요크셔테리어
	}
}
//=======================================================
// <!-- [출처] [JAVA/자바] 레퍼런스(reference) 형 변환(업 캐스팅, 다운 캐스팅)|작성자 JOKER -->


2. DownCasting

부모 타입을 자식 타입으로 변환하는 것을 의미한다
업 캐스팅시에 부모타입에 없는 멤버의 경우 사용이 불가능했다 자식타입의 멤버가 필요할 경우 다운캐스팅을 통해 자식타입 멤버를 사용해준다
자주 사용되지는 않으나, 조건은 부모타입으로 업캐스팅 한 후 다시 자식타입으로 다운캐스팅 해야한다
다운캐스팅의 경우 자료형 생략 불가능

 Parents pa = ch;   // 1. 선행조건 업캐스팅
 Child Ch = Child(pa);  //2. 다운캐스팅  //자료형 생략불가 //자식타입 자식객체 = 자식타입(부모객체);


예제

class SmartPhone { // 슈퍼 클래스
	public void name(){
		System.out.println("스마트폰");
	}
}

class Apple extends SmartPhone { // 서브 클래스
	public void name() { // 오버라이딩
		System.out.println("회사명 : 애플");
	}
	public void iPhone(){
		System.out.println("모델 : 아이폰");
	}
}

class Samsung extends SmartPhone{ // 서브 클래스
	public void name() { // 오버라이딩
		System.out.println("회사명 : 삼성");
	}
	public void galaxy(){
		System.out.println("모델 : 갤럭시");
	}
}

public class RefCastingEx02 {

	public static void main(String[] args) {
		Apple a1 = new Apple();
		SmartPhone sp1 = a1; // 업캐스팅
		sp1.name();
//		sp1.iPhone(); // 자식 메소드 사용 불가
		a1 = (Apple)sp1; // 다운 캐스팅
		a1.iPhone();

		SmartPhone sp2 = new Samsung(); // 업캐스팅
		sp2.name();
//		sp2.galaxy(); // 자식 메소드 사용 불가
		Samsung s1 = (Samsung)sp2; // 다운 캐스팅
		s1.galaxy();

		Apple a2 = (Apple) new SmartPhone(); // 다운 캐스팅
		a2.name(); // 예외 발생(다운 캐스팅을 하기 위해서는 업 캐스팅이 선행 되어야 함.)
	}
}

// [출처] [JAVA/자바] 레퍼런스(reference) 형 변환(업 캐스팅, 다운 캐스팅)|작성자 JOKER