[Java] 객체지향개념 - 다형성(Polymorphism)

miyeon·2023년 3월 19일
0

Java

목록 보기
8/10
post-thumbnail

다형성

  • 조상 타입 참조 변수로 자손 타입 객체를 다루는 것
    👉 타입 불일치 OK!
    예) Tv t = new SmartTv();
  • 자손 타입의 참조 변수로 조상 타입 객체를 다룰 수 없다. (∵ 조상 타입의 멤버개수가 더 적기 때문)

참조변수의 형변환

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

FireEngine f = new Fireengine();
Car c = (Car) f;
// 실제 인스턴스 : 자손, 자손의 참조변수를 형변환하여 조상의 참조변수에 대입
  • 조상, 자손 관계의 참조변수는 서로 형변환 가능 (형제 관계끼리는 안됨)
  • 형 변환시, 실제 인스턴스가 무엇인지가 중요!
    (그 인스턴스를 가지고 리모컨(참조변수)을 바꿔가면서 사용)
  • 자손 -> 조상 : 형변환 생략 가능, 조상 -> 자손 : 형변환 생략 불가
  • 형변환 전에 반드시 instanceof로 형변환 가능여부를 확인해야 함

instanceof 연산자

참조변수의 형변환 가능여부 확인에 사용
- 가능하면 true 반환 (상속 계층도의 조상은 true)



다형성의 장점

1. 매개변수의 다형성 (다형적 매개변수)

메서드의 매개변수로 조상타입의 참조변수를 매개변수로 사용하여, 하나의 메서드로 여러타입의 객체를 받을 수 있다.

예시

void buy (Product p) { }

매개변수 Product p에는 아래의 3문장이 모두 가능하다.

Product p = new Tv();
Product p = new Computer();
Product p = new Audio();
b.buy(new Tv());
//아래코드와 동일한 내용

Product p = new Product;
b.buy(p);

2. 여러종류의 객체를 배열로 다루기

조상타입의 배열에 자손들의 객체를 담을 수 있다.

Ex7_9

class Buyer2 {			  // 고객, 물건을 사는 사람
	int money = 1000;	  // 소유금액
	int bonusPoint = 0; // 보너스점수
	Product2[] cart = new Product2[10];   // 구입한 제품을 저장하기 위한 배열
	int i =0;			  // Product배열에 사용될 카운터

	void buy(Product2 p) {
		if(money < p.price) {
			System.out.println("잔액이 부족하여 물건을 살 수 없습니다.");
			return;
		}

		money -= p.price;             // 가진 돈에서 구입한 제품의 가격을 뺀다.
		bonusPoint += p.bonusPoint;   // 제품의 보너스 점수를 추가한다.
		cart[i++] = p;                // 제품을 Product[] cart에 저장한다.
		System.out.println(p + "을/를 구입하셨습니다.");
	}
}

class Ex7_9 {
	public static void main(String args[]) {
		Buyer2 b = new Buyer2();

		b.buy(new Tv2());
		b.buy(new Computer2());
		b.buy(new Audio2());
		b.summary();
	}
}

👉 조상타입 배열 cart에 다형적 매개변수를 통해 자손들의 객체인 Tv2(), Computer2(), Audio2()를 담을 수 있다.



참고 📑

profile
내가 보려고 기록하는 블로그

0개의 댓글