본문 바로가기

개발/Java

[Java] 자바 - 다형성(Polymorphism) / 업캐스팅(Upcasting) / 다운캐스팅(Downcasting) / 동적바인딩 / instanceof 연산자

 

< 클래스 형변환 >

 

- 상속 구조일 경우에만 클래스 간의 형변환이 가능

- 업캐스팅(UpCasting) : 자식클래스 타입 → 부모클래스 타입 (캐스팅연산자 생략 가능)

- 다운캐스팅(DownCasting) : 부모클래스 타입 → 자식클래스 타입 (캐스팅연산자 생략 불가)

 [ 표현법 ] ((자식클래스)부모클래스).자식메소드(); // (괄호)로 우선순위 맞춰줌

// Parent : 부모클래스 / Child1 : 자식클래스

// 업캐스팅(Upcasting)
Parent p2 = /* (Parent) */new Child1(); // 자동형변환으로 생각

// 다운캐스팅(Downcasting)
((Child1)p2).printChild1(); // 자식클래스의 메소드를 호출하기 위해서는
                            // 부모클래스를 자식클래스로 형변환
                            // 이때, 자동형변환은 불가능!
                            
Child1 c2 = (Child1)new Parent(); // 강제형변환해서 생성하면, 
                                  // 없는 필드 또는 메소드 사용시 오류발생(ClassCastException)

 

 

< 다형성 (Polymorphism) >

 

- 상속에서 이어지는 개념 - 상속 : 자식클래스에 부모클래스의 '타입(자료형)'을 물려줌

- 부모클래스의 타입(자료형)으로 자식클래스를 다루는 기술

 

[ 장점 ]

- 메소드 개수가 줄어듬 => 코드가 줄어듬 => 효율성이 높아짐

- 부모타입의 객체배열로 자식객체들 사용 가능 => 반복문 사용 가능

 

// 다형성을 적용한 객체배열

// Book : 부모클래스 --------------------------------
public class Book {
	
	// 필드부
	private String title;		// 도서명
	private String author;		// 저자명
	private String publisher;	// 출판사명

	// 생성자부
	public Book() {} // 기본생성자

	public Book(String title, String author, String publisher) {
		this.title = title;
		this.author = author;
		this.publisher = publisher;
	}
}

// CookBook : 자식클래스 ----------------------------
public class CookBook extends Book {
	// 필드부
	// String title, String author, String publisher
	private boolean coupon; // 요리학원 쿠폰 유무
}

// AniBook : 자식클래스 ------------------------------
public class AniBook extends Book {
	// 필드부
	// String title, String author, String publisher
	private int accessAge; // 제한 나이
}

// LibraryController 클래스 --------------------------
import com.kh.ploy.model.vo.AniBook;
import com.kh.ploy.model.vo.Book;
import com.kh.ploy.model.vo.CookBook;

public class LibraryController {
	// 필드부
	private Book[] bList = new Book[5];
	{
		// 다형성 : 부모클래스타입으로 자식클래스를 다룸
		// 하나의 배열로 다른 자식클래스 타입을 한꺼번에 관리할 수 있음
		// 자식클래스 타입 → 부모클래스 타입(업캐스팅)
		bList[0] = new CookBook("백종원의 집밥", "백종원", "tvN", true);
		bList[1] = new AniBook("한번 더 해요", "미티", "원모어", 19);
		bList[2] = new AniBook("루피의 원피스", "루피", "japan", 12);
		bList[3] = new CookBook("이혜정의 얼마나 맛있게요", "이혜정", "문학", false);
		bList[4] = new CookBook("최현석 날 따라해봐", "최현석", "소금책", true);
	}
}

 

 

< 동적바인딩 >

 

- 정적바인딩 : 프로그램 실행 전 컴파일

- 실질적으로 참조하는 자식클래스에 해당 메소드가 오버라이딩 되어있다면,

  프로그램 실행 시, 동적으로 자식클래스에 오버라이딩 된 메소드를 찾아서 실행

  (자식클래스의 오버라이딩된 메소드의 우선순위가 더 높음)

 

 

< instanceof 연산자 >

 

- 현재 참조변수가 어떤 클래스형의 객체 주소를 참조하고 있는지 확인할 때 사용

- 클래스 타입이 맞으면 true, 맞지 않으면 false 반환 => 조건식에 사용

[ 표현법 ] 

레퍼런스 instanceof 클래스타입 (결과값 : true/false)

 

for (int i = 0; i < arr.length; i++) {			
    if(arr[i] instanceof Child1) { // arr[i]가 Child1클래스타입을 참조하면
        ((Child1)arr[i]).printChild1();
    } else { // 그렇지 않으면
        ((Child2)arr[i]).printChild2();
    }
}