E D R , A S I H C RSS

Parametric Polymorphism


1. μ†Œκ°œ

μš”μ¦˜ μ‹¬μ‹¬ν•˜λ©΄ μ΄μƒν•œ 책듀을 λ³΄λŠ”λ° 이런 이야기가 λ‚˜μ™€μ„œ μ†Œκ°œν• λ§Œν•œ κ°€μΉ˜κ°€ λŠκ»΄μ§€λ€λ‘œ 적음.
(μ‹¬μ‹¬ν•˜λ©΄ μ•„λž˜λΌ μ½μ„ 것 -_-; μ˜€λ‘œμ§€ μ½”λ“œμ—λ§Œ κ΄€μ‹¬μžˆλŠ” μ‚¬λžŒμ΄λΌλ©΄ BACK λ²„νŠΌμ„~ λ³„λ‘œ 재λΈμ—†λŠ” λ‚΄μš©μœΌλ‘œ μ΄μ–΄μ§ˆ κ²ƒμœΌλ‘œ λ³΄μž„)

객체 지ν–₯μ—μ„œ κ°€μž₯ μ€‘μš”ν•œ κ°œλ…μ„ 꼽으라면 λ¬΄μ—‡μ„κΌ½μ„κΉŒ?
닀름 μ•„λ‹Œ λ‹€ν˜•μ„±(Polymorphism)이라고 ν•˜μ§€ μ•Šμ„κΉŒ μ‹Άλ‹€.

이 λ‹€ν˜•μ„±μ—λ„ μ’…λ₯˜κ°€ μžˆλ‹€λŠ” 것을 μ•Œλ €λŠ”μ§€ λͺ¨λ₯΄κ² λ‹€.
μ²«μ§ΈλŠ” 졜초둜 μ œμ•ˆλœ λ‹€ν˜•μ„±μΈ ParametricPolymorphism, λ‘˜μ§ΈλŠ” μ–΄μ©Œλ‹€ μƒκ²¨λ‚˜ 버린 Ad-hocPolymorphism μ΄λ ‡κ²Œ 두가지가 μ‘΄μž¬ν•œλ‹€.
ν•œλ²ˆ κ°œλ…μ˜ μ°¨μ΄λΌ μ΄ν•΄ν•˜κ³  μžλ°”5μ—μ„œ μ§€μ›ν•˜κΈ° μ‹œμž‘ν•œ generic의 λ„μž…μ˜ 의λΈμ— λŒ€ν•΄μ„œ μƒκ°ν•΄λ³΄λŠ” μ‹œκ°„μ΄ 될 것이닀.

그리고 λ‚΄μš©μ΄ λŒ€λΆ€λΆ„ 책에 μžˆλŠ” λ‚΄μš©μ—μ„œ ν•„μš”ν•œ λΆ€λΆ„λ§Œ κ°„μΆ”λ¦° λ‚΄μš©μ΄λΌ μƒλž΅λœ 뢀뢄이 μ‘΄μž¬ν•˜λ‹ˆ
읽어보고 싢은 μ‚¬λžŒμ€ λ„μ„œκ΄€μ—μ„œ μ°Ύμ•„μ„œ 읽어보면됨. (λͺ‡μž₯μ•ˆλ¨)

ps. γ…‘.γ…‘;; μš°λ¦¬λŠ” μ €κ±°κΉŒμ§€ λ°°μš°μ§€λ„ μ•Šμ•˜λŠ”λ°... μ—­μ‹œ ν•™κ΅μˆ˜μ—…μ΄λž€ γ…‰γ…‰

2. λ‹€ν˜•μ„±?

μ°¨λΌ μƒκ°ν•΄λ³΄μž. 우리 μ£Όλ³€μ˜ μ°¨λŠ” μ •λ§λ‘œ λ§Žλ‹€.

그쀑 차듀을 μΆ”μƒν™”ν•˜μ—¬ ν‘œν˜„ν•œ λͺ…사 Car, κ·Έκ²ƒμ˜ ν•˜μœ„μ˜ 것듀은 sportCar, luxuryCar μ΄λ ‡κ²Œ 3개의 κ°μ²΄λΌ μƒκ°ν•΄λ³΄μž.

λ‹Ήμ—°νžˆ ν›„μžμ˜ 2개의 κ°μ²΄λŠ” μ „μžμ˜ 2개의 κ°μ²΄λΌ μƒμ†ν•œλ‹€.

λ‹Ήμ—°νžˆ Car 와 sportCar, luxuryCar λŠ” μ„œλ‘œ λ™μΌν•œ μ›λ¦¬λ‘œ μ›€μ§μ΄κ² μ§€λ§Œ λ™μΌν•˜μ§€λŠ” μ•Šλ‹€.

getCar(:String):Car λΌλŠ” λ©”μ†Œλ“œλΌ μƒκ°ν•΄λ³΄μž.

~cpp 
public Car getCar(String clientType)
{
	if("young man".equals(clientType))
	{
		return new SportCar();
	}
	else if("old man".equals(clientType))
	{
		return new LuxuryCar();
	}
	else
	{
		//Error!
		return null;
	}
}
상기 λ©”μ†Œλ“œλΌ ν†΅ν•΄μ„œ
~cpp 
Car sportCar = getCar("young man");
Car luxuryCar = getCar("old man");
의 식을 μ“Έ 수 μžˆλ‹€.

SportCar, LuxuryCarλŠ” CarλΌ μƒμ†λ°›λŠ” 클래슀 이λ€λ‘œ IS-A의 관계라고 ν•  수 μžˆλ‹€.

λ”°λΌμ„œ SportCar, LuxuryCar의 μΈμŠ€ν„΄μŠ€(instance)κ°€ Car객체 λ³€μˆ˜μΈ sportCar, luxuryCar에 λŒ€μž…μ΄ κ°€λŠ₯ν•˜λ‹€.

그리고 μœ„μ™€ 같은 κ²ƒμœΌλ‘œ ν˜„μž¬ λ‹€ν˜•μ„±μ΄λΌκ³  ν•˜λŠ” 방식이 κ΅¬ν˜„λ˜μ–΄μ Έ μžˆλ‹€.

λ™μΌν•œ Carμ΄κΈ°λŠ” ν•˜μ§€λ§Œ run()μ΄λΌλŠ” λ©”μ‹œμ§€λΌ 2개의 각기 λ‹€λ₯Έ 차에 μ£Όλ©΄ λ‹Ήμ—°νžˆ ν•œμ°¨λŠ”

μ—„μ²­λ‚œ κ°€μ†λ„λ‘œ 속도가 λΆ™μ–΄μ„œ λ‹¬λ¦¬κΈ°κ² μ§€λ§Œ λ‹€λ₯Έ μ°¨λŠ” κ°€μ†λ„λ³΄λ‹€λŠ” μŠΉμ°¨κ°μ΄λΌλ“ κ°€ 그외적 μš”μ†Œμ— λ”μš±

신경을 μ“΄ run()μ΄λΌλŠ” λ°©μ‹μœΌλ‘œ λ‹¬λ¦¬κ²Œ 될 것이닀.

λŒ€λž΅ 이것이 λ‹€ν˜•μ„±μ΄λΌλŠ” κ²ƒμœΌλ‘œ ν‘œν˜„λœλ‹€.

3. Parametric Polymorphism

λ³Έλ”” 폴리λͺ¨ν”Όμ¦˜μ—μ„œ μΆ”κ΅¬ν•œ 방식 즉 νŒŒλΌλ©”νŠΈλ¦­ 방식에 μ˜ν•˜λ©΄ μƒκΈ°μ˜ 식을 μ μš©ν•  λ•Œ 동적 μΊμŠ€νŒ…μ΄ ν•„μš”κ°€ μ—†μ–΄μ•Όν•œλ‹€.

자 슀포츠 카에 터보엔진이 λ‹¬λ Έλ‹€λŠ” λ°œμƒμ„ ν•΄λ³΄μž.
~cpp 
Car sportCar = getCar("young man");
sportCar.startTurboEngine();
μ–΄λ–¨κΉŒ?

λ‹Ήμ—°νžˆ μ—λŸ¬κ°€ λ‚œλ‹€. 터보엔진은 슀포츠 카에 달린 것이지 CarλΌλŠ” κ°μ²΄μ—λŠ” μ‘΄μž¬ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ΄λ‹€.

κ·Έλ ‡λ‹€λ©΄ λ‹€μŒμ€?
~cpp 
SportCar sportCar = getCar("young man");
sportCar.startTurboEngine();
μ—­μ‹œ μ—λŸ¬κ°€ λ‚œλ‹€. SportCar에 λŒ€μž…λ˜λŠ” getCar():CarλŠ” SportCar보닀 μƒμœ„μ˜ κ°œλ…μ€ Car이기 λ•Œλ¬Έμ΄λ‹€.

μ΄λΌ ν•΄κ²°ν•œ μ½”λ“œλŠ” λ‹€μŒκ³Ό κ°™λ‹€.
~cpp 
SportCar sportCar = (SportCar) getCar("young man");
sportCar.startTurboEngine();
μ—λŸ¬λŠ” ν”Όν–ˆλ‹€. ν•˜μ§€λ§Œ μš°λ¦¬κ°€ 그리도 λ°”λΌλ§ˆμ§€ μ•Šλ˜ ν’ˆκ²©μ˜ 객체지ν–₯ μ–Έμ–΄κ°€ λ„ˆλœλ„ˆλœν•œ ν‘œν˜„λ²•μ„ μ“΄λ‹€.

λ³Έλ”” νŒŒλΌλ©”νŠΈλ¦­ 폴리λͺ°ν”Όμ¦˜μ€ 상기와 같은 문제의 해결을 μœ„ν•΄μ„œ 방어적 μˆ˜λ‹¨μ„ μ œκ³΅ν•œλ‹€.

무엇인고 ν•˜λ‹ˆ, λ°”λ‘œ 리턴해야할 객체의 νƒ€μž…μ„ 인수둜 μ€λ‹€λŠ” κ°œλ…μ΄λ‹€. (C++의 ν…œν”Œλ¦Ώ 같지?)

μœ„μ™€ 같은 κ°œλ…μ˜ μ½”λ“œλ‘œ μž‘μ„±μ΄ 되면 동적 μΊμŠ€νŒ…μ΄ ν•„μš” μ—†μ„λΏλ§Œμ•„λ‹ˆλΌ 잘λͺ»λœ νƒ€μž… μΊμŠ€νŒ…μœΌλ‘œ μΈν•œ

μ—λŸ¬μ—­μ‹œ 방지할 수 μž‡λ‹€.

졜근 μžλ°” 5 μ—μ„œλŠ” generics λΌλŠ” κΈ°λŠ₯을 λ„μž…ν•¨μœΌλ‘œμ„œ νŒŒλΌλ©”νŠΈλ¦­ 폴리λͺ¨ν”Όμ¦˜μ„ μ§€μ›ν•˜κΈ° μ‹œμž‘ν–ˆλ‹€.

generics에 λŒ€ν•œ 예제

~cpp 
class Pair<SomeObjectType>
{
    SomeObjectType x, y;
    
    Pair(SomeObjectType x, SomeObjectType y)
    {
        this.x = x;
        this.y = y;
    }
    
    SomeObjectType getFirstObject (Pair<SomeObjectType> p)
    {
        return p.x;
    }
}
상기와 같은 λ°©μ‹μœΌλ‘œ μž‘μ„±ν•˜κ²Œ 되면 λ‹€μŒκ³Ό 같이 νŠΉμ •ν•œ 데이터 ν˜•μ— ꡬ애 받지 μ•ŠλŠ”

둜직이 μž‘μ„±λœλ‹€.
~cpp 
Pair<Integer> p;
p = new Pair<Integer>(new Integer(0), new Integer(1));
Integer x = p.getFirstObject(p);

Pair<Boolean> p;
p = new Pair<Boolean>(new Boolean(0), new Boolean(1));
Boolean x = p.getFirstObject(p);

.
.
.
.

μ΄λ ‡κ²Œ νŒŒλΌλ©”νŠΈλ¦­ 폴리λͺ¨ν”Όμ¦˜μ„ λ„μž…ν•¨μœΌλ‘œμ„œ μ€λ” μš°μ•„ν•œ μ½”λ“œκ°€ μ™„μ„±λœλ‹€.

Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2021-02-07 05:24:00
Processing time 0.0246 sec