Post

[Java] Polymorphism

[Java] Polymorphism

πŸ’‘ 이 κ²Œμ‹œκΈ€μ€ κΉ€μ˜ν•œ κ°•μ‚¬λ‹˜μ˜ μžλ°” κ°•μ˜λ₯Ό μˆ˜κ°•ν•˜λ©° ν•™μŠ΅ν•œ λ‚΄μš©μ„ μ€‘μš”ν•œ ν‚€μ›Œλ“œ μ€‘μ‹¬μœΌλ‘œ μ •λ¦¬ν•œ 개인 ν•™μŠ΅ κΈ°λ‘μž…λ‹ˆλ‹€. 였직 κΈ°μ–΅ 볡기λ₯Ό μœ„ν•œ λͺ©μ μœΌλ‘œ μž‘μ„±λ˜μ—ˆμœΌλ©°, λͺ¨λ“  λ‚΄μš©μ„ ν¬ν•¨ν•˜μ§€ μ•ŠμœΌλ―€λ‘œ 체계적인 ν•™μŠ΅ μžλ£Œλ‘œλŠ” μ ν•©ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

μž„μ‹œ μ €μž₯본이 λ‚ μ•„κ°€λŠ” κ²½μš°κ°€ μžˆμ–΄ demo둜 μ—…λ‘œλ“œ

Section12 (λ‹€ν˜•μ„±2)

μΆ”μƒν΄λž˜μŠ€

동물(Animal )κ³Ό 같이 λΆ€λͺ¨ ν΄λž˜μŠ€λŠ” μ œκ³΅ν•˜μ§€λ§Œ, μ‹€μ œ μƒμ„±λ˜λ©΄ μ•ˆλ˜λŠ” 클래슀λ₯Ό 좔상 클래슀라 ν•œλ‹€.

μΆ”μƒν΄λž˜μŠ€λŠ” 좔상적인 κ°œλ…μ„ μ œκ³΅ν•˜λŠ” 클래슀.
λ”°λΌμ„œ μΈμŠ€ν„΄μŠ€κ°€ μ‘΄μž¬ν•˜μ§€ μ•ŠμœΌλ©° 상속을 λͺ©μ μœΌλ‘œ μƒμš©λ˜κ³ , λΆ€λͺ¨ 클래슀 역할을 λ‹΄λ‹Ήν•œλ‹€.

좔상 ν΄λž˜μŠ€λŠ” 클래슀λ₯Ό μ„ μ–Έν•  λ•Œ μ•žμ— μΆ”μƒμ΄λΌλŠ” 의미의 abstract ν‚€μ›Œλ“œλ₯Ό λΆ™μ—¬μ£Όλ©΄ λœλ‹€.

1
abstract class AbstractAnimal {...}

μΆ”μƒλ©”μ„œλ“œ

λΆ€λͺ¨ 클래슀λ₯Ό 상속 λ°›λŠ” μžμ‹ ν΄λž˜μŠ€κ°€ λ°˜λ“œμ‹œ μ˜€λ²„λΌμ΄λ”© ν•΄μ•Ό ν•˜λŠ” λ©”μ„œλ“œλ₯Ό λΆ€λͺ¨ ν΄λž˜μŠ€μ— μ •μ˜ν•  수 μžˆλ‹€.

좔상 λ©”μ„œλ“œλŠ” 이름 κ·ΈλŒ€λ‘œ 좔상적인 κ°œλ…μ„ μ œκ³΅ν•˜λŠ” λ©”μ„œλ“œμ΄λ‹€. λ”°λΌμ„œ 싀체가 μ‘΄μž¬ν•˜μ§€ μ•Šκ³ ,
λ©”μ„œλ“œ λ°”λ””κ°€ μ—†λ‹€.

1
public abstract void sound();

🌱 좔상 λ©”μ„œλ“œκ°€ ν•˜λ‚˜λΌλ„ μžˆλŠ” ν΄λž˜μŠ€λŠ” 좔상 클래슀둜 μ„ μ–Έν•΄μ•Ό ν•œλ‹€.

🌱 좔상 λ©”μ„œλ“œλŠ” 상속 λ°›λŠ” μžμ‹ ν΄λž˜μŠ€κ°€ λ°˜λ“œμ‹œ μ˜€λ²„λΌμ΄λ”© ν•΄μ„œ μ‚¬μš©ν•΄μ•Ό ν•œλ‹€.

(순수 좔상 클래슀)

1
2
3
4
public abstract class AbstractAnimal {
	public abstract void sound();
	public abstract void move();
}

μƒμ†ν•˜λŠ” ν΄λž˜μŠ€λŠ” λͺ¨λ“  λ©”μ„œλ“œλ₯Ό κ΅¬ν˜„ν•΄μ•Ό ν•œλ‹€.
μžλ°”λŠ” 순수 좔상 클래슀λ₯Ό 더 νŽΈλ¦¬ν•˜κ²Œ μ‚¬μš©ν• 
수 μžˆλ„λ‘ μΈν„°νŽ˜μ΄μŠ€λΌλŠ” κ°œλ…μ„ μ œκ³΅ν•œλ‹€.

μΈν„°νŽ˜μ΄μŠ€

μΈν„°νŽ˜μ΄μŠ€λŠ” 닀쀑 κ΅¬ν˜„(닀쀑 상속)을 μ§€μ›ν•œλ‹€.
λ©”μ„œλ“œμ— public abstract λ₯Ό μƒλž΅ν•  수 μžˆλ‹€. 참고둜 μƒλž΅μ΄ ꢌμž₯λœλ‹€.

μΈν„°νŽ˜μ΄μŠ€μ—μ„œ 멀버 λ³€μˆ˜λŠ” public , static , final 이 λͺ¨λ‘ ν¬ν•¨λ˜μ—ˆλ‹€κ³  κ°„μ£Όλœλ‹€. final 은 λ³€μˆ˜μ˜ 값을 ν•œ
번 μ„€μ •ν•˜λ©΄ μˆ˜μ •ν•  수 μ—†λ‹€λŠ” λœ»μ΄λ‹€

1
2
3
4
public interface InterfaceAnimal {
	public abstract void sound();
	public abstract void move();
}

μ œμ•½ μΈν„°νŽ˜μ΄μŠ€λ₯Ό λ§Œλ“œλŠ” μ΄μœ λŠ” μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•˜λŠ” κ³³μ—μ„œ μΈν„°νŽ˜μ΄μŠ€μ˜ λ©”μ„œλ“œλ₯Ό λ°˜λ“œμ‹œ κ΅¬ν˜„ν•΄λΌλŠ” κ·œμ•½(μ œμ•½)을 μ£ΌλŠ” 것.
λ‹€μ€‘κ΅¬ν˜„ μΈν„°νŽ˜μ΄μŠ€λŠ” λΆ€λͺ¨λ₯Ό μ—¬λŸ¬λͺ… λ‘λŠ” 닀쀑
κ΅¬ν˜„(닀쀑 상속)이 κ°€λŠ₯ν•˜λ‹€.

μΈν„°νŽ˜μ΄μŠ€ λ‹€μ€‘κ΅¬ν˜„

1
2
3
4
5
6
7
8
9
10
11
12
package diamond;

public class Child implements InterfaceA, InterfaceB {
    @Override
    public void methodA() {}

    @Override
    public void methodB() {}

    @Override
    public void methodCommon() {}
}
1
public class Bird extends AbstractAnimal implements Fly, Swim {

extends λ₯Ό ν†΅ν•œ 상속은 ν•˜λ‚˜λ§Œ ν•  수 있고 implements λ₯Ό ν†΅ν•œ μΈν„°νŽ˜μ΄μŠ€λŠ” 닀쀑 κ΅¬ν˜„ ν•  수 있기 λ•Œλ¬Έμ— λ‘˜μ΄ 함
께 λ‚˜μ˜¨ 경우 extends κ°€ λ¨Όμ € λ‚˜μ™€μ•Ό ν•œλ‹€.

OCP (Open-Closed Principle)

Open for extension μƒˆλ‘œμš΄ κΈ°λŠ₯의 μΆ”κ°€λ‚˜ λ³€κ²½ 사항이 생겼을 λ•Œ, κΈ°μ‘΄ μ½”λ“œλŠ” ν™•μž₯ν•  수 μžˆμ–΄μ•Ό ν•œλ‹€.
Closed for modification 기쑴의 μ½”λ“œλŠ” μˆ˜μ •λ˜μ§€ μ•Šμ•„μ•Ό ν•œλ‹€.

기쑴의 μ½”λ“œ μˆ˜μ •μ—†μ΄ μƒˆλ‘œμš΄ κΈ°λŠ₯을 μΆ”κ°€ν•  수 μžˆμ–΄μ•Ό ν•œλ‹€.
ν™•μž₯μ—λŠ” μ—΄λ €μžˆκ³ , λ³€κ²½μ—λŠ” λ‹«ν˜€ μžˆλ‹€λŠ” 의미.
즉, 핡심 ν΄λΌμ΄μ–ΈνŠΈμ˜ μ½”λ“œλ₯Ό λ³€κ²½ν•˜μ§€ μ•Šλ„λ‘ ν•˜λŠ” 것.

main() 은 전체 ν”„λ‘œκ·Έλž¨μ„ μ„€μ •ν•˜κ³  μ‘°μœ¨ν•˜λŠ” 역할을 ν•œλ‹€. 이런 뢀뢄은 OCPλ₯Ό μ§€μΌœλ„ 변경이 ν•„μš”ν•˜λ‹€.

This post is licensed under CC BY 4.0 by the author.