다형성
- 여러 상황에서 코드를 더 유연하게 만들고 관리하기 위해서
- 타입불일치 (참조변수타입 = 인스턴스 타입과 일치하는 것이 보통이나[TV t = new TV( );], 불일치(다형성)도 가능)
ex) TV t = new SmartTV( ); ← 불일치- 한개의 부모타입 참조 변수로 여러개의 자식타입 객체를 다루는 것
① 부모 → 자식 (Upcasting 가능) / 자식 → 부모 (불가능)
② 있는 기능 5개 < 7개 (안쓰는건 가능) - 장점이 되기도 함 / 7개 > 5개 (없는걸 호출하면 에러남)- 여러가지 형태를 가질 수 있는 것
- 참조변수의 타입에 따라 사용할 수 있는 멤버의 개수가 달라짐
- 메서드 오버라이딩(Method Overriding)과 함께 다형성 사용
→ 오버라이딩 ? 부모의 메서드를 자식메서드에서 같은 이름의 메서드로 [메서드이름(매개변수)]을 쓰되, 내용이 마음에 안들어서 내용을 재정의 하는 것.
ex) myAnimal.makeSound()를 호출하면 실제로는 Dog 클래스에서 오버라이딩한 makeSound() 메서드가 호출됩니다.
📌 Note Code
interface 이동할_수_있는 {
void 이동();
}
class 자전거 implements 이동할_수_있는 {
void 이동() {
System.out.println("페달을 밟고 이동합니다.");
}
}
class 자동차 implements 이동할_수_있는 {
void 이동() {
System.out.println("엔진을 가동하고 이동합니다.");
}
}
class 비행기 implements 이동할_수_있는 {
void 이동() {
System.out.println("비행기 엔진을 가동하고 이동합니다.");
}
}
void 교통수단_사용(이동할_수_있는 교통수단) {
교통수단.이동();
}
// 다양한 교통수단 사용
이동할_수_있는 내자전거 = new 자전거();
이동할_수_있는 내자동차 = new 자동차();
이동할_수_있는 내비행기 = new 비행기();
교통수단_사용(내자전거);
교통수단_사용(내자동차);
교통수단_사용(내비행기);
다형성 장점
① 다형적 매개변수
: (부모타입객체)하나의 메서드로 여러개를 간단히 처리가능
💻 입력 (예시)
class 부모
class 자식1
class 자식2
class 자식3
void live(행위) 메서드 (자식 변수)
House h = new House();
부모 b = new 자식1();//다형성
부모 b = new 자식2();
h.live(자식1);
h.live(자식2);
② 하나의 배열에 여러 종류 객체를 배열하는 것 (원래 : 같은 타입만 저장가능)
💻 입력 (예시)
Product p[ ] = new Product[3];
p[0] = new Tv( );
p[1] = new Computer( );
p[2] = new Audio( );
형변환 : 데이터 타입의 변환
- 기본형 : 기본 데이터끼리 형변환
- 참조형 : 상속관계에 있는 클래스들끼리 형변환
참조변수의 형변환 (상속관계에 있는 클래스끼리)
- 기본형의 형변환 ex) 3.6 ----int로 형변환----> 3
- 사용할 수 있는 멤버의 개수 조절 ex) 자바의정석 리모콘 생각 4->5->4 왔다갔다 개수조절할 수 있음
- 객체 타입간의 관계 조절
- 부모 <-> 자식 간에 가능 (단, 형제일땐 불가능)
① 형변환 연산자 사용해야 함
② 자식 → 부모 : Upcasting
③ 부모 → 자식 : Downcasting
instanceof 연산자
① 반드시! 참조변수 형변환(부모 <-> 자식) 가능여부에 대한 확인 → 가능 : [true] 반환 / 값: null : [false] 반환
② 형변환 진행
💻 입력 (예시)
FireEngine f = new FireEngine( );
//(부모 <-> 자식) 형변환 서로 가능
System.out.println(fe instaceof Object); //true
System.out.println(fe instaceof Car); //true
System.out.println(fe instaceof FireEngine); //true
//( )타입으로 변환
Object obj = (Object)fe;
Car c = (Car)fe;
💻 입력
FireEngine f = new FireEngine( );
Car c = (Car)f; // Car = 부모 , f = 자식 (형변환 가능) , (생략가능)
FireEngine f2 = (FireEngine)c; // f = 자식, c = 부모 (형변환 가능) , (생략불가)
Ambulance a = (Ambulance)f; // 자식간엔 불가능