728x90

여러 가지 형태를 가질 수 있는 능력

조상 타입의 참조 변수로 자손 타입의 객체를 다루는 것

자손 타입의 참조 변수로 조상 타입의 객체를 다루는 것은 불가능

class Tv {
	boolean power;
    int channel;
    
    void power() { power = !power; }
    void channelUp() { ++channel; }
    void channelDown() { --channel; }
}

class SmartTv extends Tv {
	String text;
    void caption() {  }
}

조상타입 참조변수명 = new 자손타입(); // 다형성은 조상 타입 Tv의 참조 변수 t가
Tv t = new SmartTv(); // 자손 타입 SmartTv 객체를 다루는 것
//즉, 타입이 일치하지 않아도 상관없음

SmartTv s = new SmartTv(); // 참조변수의 형변환 방법
Tv t = (Tv)s; // 자손타입을 조상타입으로 형변환(타입생략가능). 변수의 강제형변환과 같음
SmartTv s2 = (SmartTv)t; //자손 타입으로 형변환 하는 경우에는 타입 생략 불가능

void doCheck(Car c) {
	if(참조변수c instanceof 타입) { //참조변수가 해당타입으로 형변환이 가능한지
		//확인 후 형변환
	}
}

객체와 참조변수 타입의 일치/불일치의 차이

일치하는 경우 해당 인스턴스의 모든 멤버 사용 가능

일치하지 않는 경우 조상 타입에만 속한 멤버 사용 가능 (다형성)

참조변수의 형변환

사용할 수 있는 멤버의 수를 조절

멤버의 수 이외의 어떠한 값도 바뀌지 않음

조상 - 자손 관계만 형변환 가능

조상 > 자손 (다운캐스팅) / 자손 > 조상 (업캐스팅)

instanceof

참조변수의 형변환이 가능한지 여부를 확인할 때 사용 (가능하면 true)

형변환 전에 반드시 확인해야 함

형변환을 하는 이유는 인스턴스의 원래 기능을 모두 사용해야할 때

조상타입이면 모두 true 반환

다형성의 장점

// 부모 클래스
class Product {
	int price;
    int bonusPoint;
}
// 자손 클래스
class Tv extends Product { }
class Computer extends Product { }
class Audio extends Product { }
// 구매자 정보
class Buyer {
	int money = 1000;
    int bonusPoint = 0;
    void buy(Product p) { // 매개변수의 다형성을 이용할 메소드
        money -= p.price;
        bonus += p.bonusPoint;
	}
}
// 인스턴스 생성
Buyer b = new Buyer();
// 매개변수의 다형성을 이용하기
b.buy(new Tv()); // buy(Product p) 와 같은 코드
b.buy(new Computer());

// 객체의 다형성
Product p[] = new Product[3];
p[0] = new Tv();
p[1] = new Computer();
p[2] = new Audio();

매개변수의 다형성

참조형 매개변수는 메서드 호출 시, 자신과 같은 타입 또는 자손타입의 인스턴스를 넘겨줄 수 있음

즉, 하나의 메소드로 여러 타입의 매개변수를 받을 수 있음

배열의 다형성

하나의 배열(조상타입의 배열)로 여러 종류의 자손들의 객체를 담을 수 있음

 

'Java > Notion' 카테고리의 다른 글

인터페이스  (0) 2023.04.25
추상화  (0) 2023.04.25
제어자와 캡슐화  (0) 2023.04.24
import / static import  (0) 2023.04.24
패키지 (package)  (0) 2023.04.24

+ Recent posts