다형성 응용(매개변수, 배열 등)

김설영·2022년 3월 31일
0

다형성

  1. 조상 참조변수로 자손 객체 다루기
    • ex: Tv t = new SmartTv();
  2. 참조변수의 형변환 (리모콘 바꾸기)
    • 사용할 수 있는 멤버 갯수 조절
  3. instanceof 연산자
    • 형변환 가능 여부 체크

매개변수 다형성

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

// 부모
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;

// 1. 매개 변수를 자손의 참조 변수를 이용할 경우, 여러개를 만들어야 함 
// -> 오버로딩. 메서드 이름은 같고, 매개변수만 다른 것.
void buy(Tv t) {
	money -= t.price;
    bonusPoint += t.bonusPoint;
}
void buy(Computer c) {
	money -= t.price;
    bonusPoint += t.bonusPoint;
}
void buy(Audio a) {
	money -= t.price;
    bonusPoint += t.bonusPoint;
}

// 2. 매개 변수를 조상의 참조 변수를 이용할 경우, 한개로 가능
// 다형성에 의해, 이 메서드 하나로 여러 물건 구매 가능
//         ▽ new Tv();, new Computer();, new Audio(); 모두 사용 가능
void buy(Product p) {
	money -= p.price;
    bonusPoint += p.bonusPoint;
}

// ex
Tv tv = new Tv();
Computer com = new Computer();

b.buy(tv);
b.buy(com);
}

배열 다형성

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

// 참조변수에 직접 자손객체 대입
Product p1 = new Tv();
Product p2 = new Computer();
Product p3 = new Audio();

// 배열을 이용한 자손객체 대입 
Product p[] = new Product[3];
p[0] = new Tv();
p[1] = new Compupter();
p[3] = new Audio();		// 배열 p에는 여러 종류의 객체가 들어가있다.

// ex
class Buyer {
	int money = 1000;
    int bonusPoint = 0;
    
    Product[] cart = new Product[10];	// 처음엔 참조형 기본값 null로 초기화
    
    int i = 0;
    
    void buy(Product p) {
    	if(money < p.price) {
        	System.out.println("잔액 부족");
            return;
        }
        
        money -= p.price;
        bonusPoint += p.bonusPoint;
        cart[i++] = p;	// 배열에 차곡 차곡 저장!
        // 해당 코드는 아래 코드와 동일하다	
        // cart[i] = p;
        // i++; 
    }
}

// Vector class : 가변 배열 기능을 가진 class
// protected Object elementData[]; 라는 "Object 배열"을 갖고있다.
// 최고 조상인 Object[] 배열에는 모든 종류의 객체를 저장할 수 있다.

// 원래는 우리가 배열의 "길이"를 "직접 관리"해주어야 한다. 
// 배열의 단점, "한번 만들면 크기를 변경할 수 없다"

// Vector class는 알아서 다 해준다. 신경 쓸 필요가 없다~~!
// add() 메서드로 객체 추가 가능! (배열의 길이 및 메모리 자동 관리)
profile
블로그 이동하였습니당! -> https://kimsy8979.tistory.com/

0개의 댓글