< 클래스 형변환 >
- 상속 구조일 경우에만 클래스 간의 형변환이 가능
- 업캐스팅(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();
}
}
'개발 > Java' 카테고리의 다른 글
[Java] 자바 - 인터페이스 ( 예약어 implements ) (0) | 2022.09.20 |
---|---|
[Java] 자바 - 추상 메소드 / 추상 클래스 ( 예약어 abstract ) (0) | 2022.09.20 |
[Java] 자바 - 상속(Inheritance) / super / 오버라이딩(Overrding) (0) | 2022.09.18 |
[Java] 자바 - 객체배열(Object Array) (0) | 2022.09.14 |
[Java] 자바 - 오버로딩(Overloading) (0) | 2022.09.14 |