포슀트

λ‹€ν˜•μ„±(Polymorphism)

λ‹€ν˜•μ„±(Polymorphism)

πŸ”Ž λ‹€ν˜•μ„±

λ‹€ν˜•μ„±μ΄λž€?

  • μ—¬λŸ¬ κ°€μ§€ ν˜•νƒœλ₯Ό κ°€μ§ˆ 수 μžˆλŠ” λŠ₯λ ₯.

  • ν•˜λ‚˜μ˜ μ°Έμ‘°λ³€μˆ˜λ‘œ μ—¬λŸ¬ νƒ€μž…μ˜ 객체λ₯Ό μ°Έμ‘°ν•  수 μžˆλŠ” 것.

즉, μ‘°μƒνƒ€μž…μ˜ μ°Έμ‘°λ³€μˆ˜λ‘œ μžμ†νƒ€μž…μ˜ 객체λ₯Ό λ‹€λ£° 수 μžˆλŠ” 것이 λ‹€ν˜•μ„±μ΄λ‹€.

1
2
3
4
5
6
7
8
9
10
11
12
class Tv {
    boolean power;
    int channel;

    void method1() {}
}

class CaptionTv extends Tv {
    String text;

    void caption() {}
}
1
2
3
4
CaptionTv C = new CaptionTv();

// μ‘°μƒν΄λž˜μŠ€μ˜ μ°Έμ‘°λ³€μˆ˜λ‘œ μžμ†νƒ€μž…μ˜ 객체λ₯Ό 생성
Tv t = new CaptionTv();

λ°˜λŒ€λ‘œ μžμ†νƒ€μž…μ˜ μ°Έμ‘°λ³€μˆ˜λ‘œ μ‘°μƒνƒ€μž…μ˜ μΈμŠ€ν„΄μŠ€λ₯Ό μ°Έμ‘°ν•  μˆ˜λŠ” μ—†λ‹€.



πŸ”Ž μ°Έμ‘° λ³€μˆ˜μ˜ ν˜•λ³€ν™˜

πŸ”₯ μ°Έμ‘° λ³€μˆ˜μ˜ ν˜•λ³€ν™˜μ„ μ™œ ν• κΉŒ? πŸ”₯

β†’ μ°Έμ‘°λ³€μˆ˜(리λͺ¨μ½˜)을 λ³€κ²½ν•¨μœΌλ‘œμ¨ μ‚¬μš©ν•  수 μžˆλŠ” λ©€λ²„μ˜ 갯수λ₯Ό μ‘°μ ˆν•˜κΈ° μœ„ν•΄

  • μ„œλ‘œ 상속관계에 μžˆλŠ” νƒ€μž…κ°„μ˜ ν˜•λ³€ν™˜λ§Œ κ°€λŠ₯ν•˜λ‹€.

  • μžμ†νƒ€μž…μ—μ„œ μ‘°μƒνƒ€μž…μœΌλ‘œ ν˜•λ³€ν™˜ ν•˜λŠ” 경우, ν˜• λ³€ν™˜ μƒλž΅κ°€λŠ₯

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
class Car {
    String color;
    int door;

    void drive() {
        System.out.println("뢀릉뢀릉");
    }
}

class SportsCar {
    String price;

    void SportsMode() {
        Sytem.out.println("슀포츠 λͺ¨λ“œ ON");
    }
}

public static void main(Strin[] args) {
    Car car = null;
    SportsCar sc = new SportsCar();
    SportsCar sc2 = null;

    sc.SportsMode();
    car = (Car)sc 
    /* 
    <μžμ† β†’ 쑰상> ν˜•λ³€ν™˜
    (Car)μƒλž΅ κ°€λŠ₯
    car.SportsMode(); μ—λŸ¬λ°œμƒ 
    */

    sc2 = (SprotsCar)car; // <쑰상 β†’ μžμ†> ν˜•λ³€ν™˜
    sc2.SportsMode();
}


πŸ”Ž instanceof μ—°μ‚°μž

πŸ”₯ μ°Έμ‘° λ³€μˆ˜μ˜ ν˜•λ³€ν™˜μ„ μ™œ ν• κΉŒ? πŸ”₯

β†’ μ°Έμ‘°λ³€μˆ˜λ₯Ό ν˜•λ³€ν™˜ν•˜κΈ° 전에 κ°€λŠ₯μ—¬λΆ€λ₯Ό 확인할 λ•Œ

  • μ°Έμ‘°λ³€μˆ˜μ˜ ν˜•λ³€ν™˜ κ°€λŠ₯μ—¬λΆ€ 확인에 μ‚¬μš©. κ°€λŠ₯ν•˜λ©΄ trueλ₯Ό λ°˜ν™˜ν•œλ‹€.

  • ν˜•λ³€ν™˜ 전에 λ°˜λ“œμ‹œ instanceof λ©”μ„œλ“œλ‘œ 확인해야 ν•œλ‹€.

1
2
3
4
5
6
void myCar(Car c) {
    if (c instanceof SportsCar) {
        SportsCar sc = new SportsCar();
        sc.SportsMode();
    }
}


πŸ”Ž λ§€κ°œλ³€μˆ˜μ˜ λ‹€ν˜•μ„±

μ°Έμ‘°ν˜• λ§€κ°œλ³€μˆ˜λŠ” λ©”μ„œλ“œ ν˜ΈμΆœμ‹œ,

μžμ‹ κ³Ό 같은 νƒ€μž… λ˜λŠ” μžμ†νƒ€μž…μ˜ μΈμŠ€ν„΄μŠ€λ₯Ό λ„˜κ²¨μ€„ 수 μžˆλ‹€.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
/* Product 클래슀 */
class Product {
	int price;			// μ œν’ˆκ°€κ²© 
	int bonusPoint;	    // μ œν’ˆκ΅¬λ§€ μ‹œ μ œκ³΅ν•˜λŠ” λ³΄λ„ˆμŠ€ 점수 

	Product(int price) {
		this.price = price;
		bonusPoint = (int)(price/10.0);	// λ³΄λ„ˆμŠ€ μ μˆ˜λŠ” μ œν’ˆκ°€κ²©μ˜ 10%
	}
}

/* Tv1 클래슀 */
class Tv1 extends Product {
	Tv1() {
		// μ‘°μƒν΄λž˜μŠ€μ˜ μƒμ„±μž product(int price)λ₯Ό ν˜ΈμΆœν•œλ‹€  
		super(100);		// TV가격을 100λ§Œμ›μœΌλ‘œ ν•œλ‹€.
	}

	// Object클래슀 toString()을 μ˜€λ²„λΌμ΄λ”©ν•œλ‹€. 
	public String toString() { return "Tv"; }
}

/* Computer 클래슀 */
class Computer extends Product {
	Computer() { super(200); }

	public String toString() { return "Computer"; }
}

/* Buyer 클래슀 */
class Buyer {	            // 고객, 물건을 μ‚¬λŠ”μ‚¬λžŒ 
	int money = 1000;	    // μ†Œμœ  κΈˆμ•‘ 
	int bonusPoint = 0;     // λ³΄λ„ˆμŠ€ 포인트 

    // buy λ©”μ„œλ“œμ˜ λ§€κ°œλ³€μˆ˜λ‘œ, Productνƒ€μž…μ˜ μ°Έμ‘°λ³€μˆ˜ p μ„ μ–Έ
	void buy(Product p) {
		if(money < p.price) {
			System.out.println("μž”μ•‘μ΄ λΆ€μ‘±ν•˜μ—¬ 물건을 μ‚΄ 수 μ—†μŠ΅λ‹ˆλ‹€.");
			return;
		}

		money -= p.price;            //  - κ΅¬μž…ν•œ 가격 
		bonusPoint += p.bonusPoint;  //  + λ³΄λ„ˆμŠ€ 포인트 
		System.out.println(p + "을 κ΅¬μž…ν•˜μ…¨μŠ΅λ‹ˆλ‹€.");
	}
}

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

		b.buy(new Tv1());		// buy(Product p)
		b.buy(new Computer());	// buy(Product p)

		System.out.println("ν˜„μž¬ 남은 λˆμ€" + b.money + "λ§Œμ›μž…λ‹ˆλ‹€.");
		System.out.println("ν˜„μž¬ λ³΄λ„ˆμŠ€ μ μˆ˜λŠ”" + b.bonusPoint + "μ μž…λ‹ˆλ‹€.");
	}
}
이 κΈ°μ‚¬λŠ” μ €μž‘κΆŒμžμ˜ CC BY 4.0 λΌμ΄μ„ΌμŠ€λ₯Ό λ”°λ¦…λ‹ˆλ‹€.