πŸ“• [Object] 13μž₯. μ„œλΈŒν΄λž˜μ‹±κ³Ό μ„œλΈŒνƒ€μ΄ν•‘

박상민·2024λ…„ 3μ›” 24일

Book

λͺ©λ‘ 보기
19/22
post-thumbnail

μƒμ†μ˜ 첫 번째 μš©λ„λŠ” νƒ€μž… 계측을 κ΅¬ν˜„ν•˜λŠ” 것이닀. νƒ€μž… κ³„μΈ΅μ˜ κ΄€μ μ—μ„œ λΆ€λͺ¨ ν΄λž˜μŠ€λŠ” μžμ‹ 클래슀의 μΌλ°˜ν™”(generalization)이고 μžμ‹ ν΄λž˜μŠ€λŠ” λΆ€λͺ¨ 클래슀의 νŠΉμˆ˜ν™”(specialization)λ‹€.

μƒμ†μ˜ 두 번째 μš©λ„λŠ” μ½”λ“œ μž¬μ‚¬μš©μ΄λ‹€. ν•˜μ§€λ§Œ μž¬μ‚¬μš©μ„ μœ„ν•΄ 상속을 μ‚¬μš©ν•  경우 λΆ€λͺ¨ ν΄λž˜μŠ€μ™€ μžμ‹ ν΄λž˜μŠ€κ°€ κ°•ν•˜κ²Œ κ²°ν•©λ˜κΈ° λ•Œλ¬Έμ— λ³€κ²½ν•˜κΈ° μ–΄λ €μš΄ μ½”λ“œλ₯Ό μ–»κ²Œ 될 ν™•λ₯ μ΄ λ†’λ‹€.

상속을 μ‚¬μš©ν•˜λŠ” 일차적인 λͺ©ν‘œλŠ” μ½”λ“œ μž¬μ‚¬μš©μ΄ μ•„λ‹ˆλΌ νƒ€μž… 계측을 κ΅¬ν˜„ν•˜λŠ” 것이어야 ν•œλ‹€. 반면 νƒ€μž… 계측을 λͺ©ν‘œλ‘œ 상속을 μ‚¬μš©ν•˜λ©΄ λ‹€ν˜•μ μœΌλ‘œ λ™μž‘ν•˜λŠ” κ°μ²΄λ“€μ˜ 관계에 κΈ°λ°˜ν•΄ ν™•μž₯ κ°€λŠ₯ν•˜κ³  μœ μ—°ν•œ 섀계λ₯Ό 얻을 수 있게 λœλ‹€.

κ·Έλ ‡λ‹€λ©΄ νƒ€μž… κ³„μΈ΅μ΄λž€ 무엇인가? 상속을 μ΄μš©ν•΄ νƒ€μž… 계측을 κ΅¬ν˜„ν•œλ‹€λŠ” 것이 무엇을 μ˜λ―Έν•˜λŠ”κ°€?

πŸ“Œ νƒ€μž…

객체지ν–₯ νŒ¨λŸ¬λ‹€μž„ κ΄€μ μ˜ νƒ€μž…
νƒ€μž…μ„ λ‹€μŒκ³Ό 같은 두가지 κ΄€μ μ—μ„œ μ •μ˜ν•  수 μžˆλ‹€.

  • κ°œλ… κ΄€μ μ—μ„œ νƒ€μž…μ΄λž€ κ³΅ν†΅μ˜ νŠΉμ§•μ„ κ³΅μœ ν•˜λŠ” λŒ€μƒλ“€μ˜ λΆ„λ₯˜λ‹€.
  • ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄ κ΄€μ μ—μ„œ νƒ€μž…μ΄λž€ λ™μΌν•œ μ˜€νΌλ ˆμ΄μ…˜μ„ μ μš©ν•  수 μžˆλŠ” μΈμŠ€ν„΄μŠ€λ“€μ˜ 집합이닀.

객체지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ—μ„œ μ˜€νΌλ ˆμ΄μ…˜μ€ 객체가 μˆ˜μ‹ ν•  수 μžˆλŠ” λ©”μ‹œμ§€λ₯Ό μ˜λ―Έν•œλ‹€. λ”°λΌμ„œ 객체의 νƒ€μž…μ΄λž€ 객체가 μˆ˜μ‹ ν•  수 μžˆλŠ” λ©”μ‹œμ§€μ˜ μ’…λ₯˜λ₯Ό μ •μ˜ν•˜λŠ” 것이닀.

객체가 μˆ˜μ‹ ν•  수 μžˆλŠ” λ©”μ‹œμ§€λ₯Ό κΈ°μ€€μœΌλ‘œ νƒ€μž…μ„ λΆ„λ₯˜ν•˜κΈ° λ•Œλ¬Έμ— λ™μΌν•œ 퍼블릭 μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ°€μ§€λŠ” 객체듀은 λ™μΌν•œ νƒ€μž…μœΌλ‘œ λΆ„λ₯˜ν•  수 μžˆλ‹€.

⭐️ μ„œλΈŒν΄λž˜μ‹±κ³Ό μ„œλΈŒνƒ€μ΄ν•‘

πŸ“Œ μ–Έμ œ 상속을 μ‚¬μš©ν•΄μ•Ό ν•˜λŠ”κ°€?

κ·Έλ ‡λ‹€λ©΄ μ–΄λ–€ 쑰건을 λ§Œμ‘±μ‹œμΌœμ•Όλ§Œ νƒ€μž… 계측을 μœ„ν•΄ μ˜¬λ°”λ₯΄κ²Œ 상속을 μ‚¬μš©ν–ˆλ‹€κ³  말할 수 μžˆμ„κΉŒ?

  • 상속 관계가 is-a 관계λ₯Ό λͺ¨λΈλ§ν•˜λŠ”κ°€?
    일반적으둜 "[μžμ‹ 클래슀]λŠ” [λΆ€λͺ¨ 클래슀]λ‹€"라고 말해도 μ΄μƒν•˜μ§€ μ•Šλ‹€λ©΄ 상속을 μ‚¬μš©ν•  ν›„λ³΄λ‘œ κ°„μ£Όν•  수 μžˆλ‹€.

  • ν΄λΌμ΄μ–ΈνŠΈ μž…μž₯μ—μ„œ λΆ€λͺ¨ 클래슀의 νƒ€μž…μœΌλ‘œ μžμ‹ 클래슀λ₯Ό μ‚¬μš©ν•΄λ„ λ¬΄λ°©ν•œκ°€?
    상속 계측을 μ‚¬μš©ν•˜λŠ” ν΄λΌμ΄μ–ΈνŠΈμ˜ μž…μž₯μ—μ„œ λΆ€λͺ¨ ν΄λž˜μŠ€μ™€ μžμ‹ 클래슀의 차이점을 λͺ°λΌμ•Ό ν•œλ‹€. 이λ₯Ό μžμ‹ ν΄λž˜μŠ€μ™€ λΆ€λͺ¨ 클래슀 μ‚¬μ΄μ˜ 행동 ν˜Έν™˜μ„±μ΄λΌκ³  λΆ€λ₯Έλ‹€.

πŸ“Œ 행동 ν˜Έν™˜μ„±

행동이 ν˜Έν™˜λœλ‹€λŠ” 것은 무슨 의미일까? λ‹¨μˆœνžˆ λ™μΌν•œ λ©”μ„œλ“œλ₯Ό κ΅¬ν˜„ν•˜κ³  있으면 행동이 ν˜Έν™˜λ˜λŠ” κ²ƒμΌκΉŒ?

μ—¬κΈ°μ„œ μ€‘μš”ν•œ 것은 ν–‰λ™μ˜ ν˜Έν™˜ μ—¬λΆ€λ₯Ό νŒλ‹¨ν•˜λŠ” 기쀀은 ν΄λΌμ΄μ–ΈνŠΈμ˜ κ΄€μ μ΄λΌλŠ” 것이닀.

public void flyBird(Bird bird) {
    // 인자둜 μ „λ‹¬λœ λͺ¨λ“  birdλŠ” λ‚  수 μžˆμ–΄μ•Ό ν•œλ‹€. 
    bird.fly();
}

ν•˜μ§€λ§Œ Bird 클래슀λ₯Ό 상속 받은 Penguin ν΄λž˜μŠ€κ°€ μžˆλ‹€κ³  μƒκ°ν•΄λ³΄μž. νŽ­κ·„μ€ μƒˆ μ΄μ§€λ§Œ λ‚ μˆ˜λŠ” μ—†λ‹€. μ΄λŠ” 잘λͺ»λœ 잘λͺ»λœ μƒμ†μœΌλ‘œ μΈν•œ 행동 ν˜Έν™˜μ„±μ— 였λ₯˜κ°€ λ°œμƒν•˜λŠ” λŒ€ν‘œμ μΈ 사둀이닀.

ν΄λΌμ΄μ–ΈνŠΈμ˜ κΈ°λŒ€μ— 따라 계측 λΆ„λ¦¬ν•˜κΈ°
문제λ₯Ό ν•΄κ²°ν•  수 μžˆλŠ” 방법은 ν΄λΌμ΄μ–ΈνŠΈμ˜ κΈ°λŒ€μ— 맞게 상속 계측을 λΆ„λ¦¬ν•˜λŠ” 것뿐이닀. λ”°λΌμ„œ λ‚  수 μžˆλŠ” μƒˆμ™€ λ‚  수 μ—†λŠ” μƒˆλ₯Ό λͺ…ν™•ν•˜κ²Œ ꡬ뢄할 수 있게 상속 계측을 λΆ„λ¦¬ν•˜λ©΄ μ„œλ‘œ λ‹€λ₯Έ μš”κ΅¬μ‚¬ν•­μ„ κ°€μ§„ ν΄λΌμ΄μ–ΈνŠΈλ₯Ό λ§Œμ‘±μ‹œν‚¬ 수 μžˆμ„ 것이닀.

public class Bird {
...
}

public class FlyingBird extends Bird {
public void fly() { ... }
...
}

public class Penguin extends Bird {
...
}

이제 flyBird λ©”μ„œλ“œλŠ” FlyingBird νƒ€μž…μ„ μ΄μš©ν•΄ λ‚  수 μžˆλŠ” μƒˆλ§Œ 인자둜 전달 될 것이닀.

```java
public void flyBird(FlyingBird bird) {
    bird.fly();
}

ν•˜λ‚˜μ˜ ν΄λΌμ΄μ–ΈνŠΈκ°€ 였직 fly λ©”μ‹œμ§€λ§Œ μ „μ†‘ν•˜κΈ°λ₯Ό μ›ν•œλ‹€λ©΄ 이 ν΄λΌμ΄μ–ΈνŠΈμ—κ²ŒλŠ” fly λ©”μ‹œμ§€λ§Œ 보여야 ν•œλ‹€. λ‹€λ₯Έ ν΄λΌμ΄μ–ΈνŠΈκ°€ 였직 walk λ©”μ‹œμ§€λ§Œ μ „μ†‘ν•˜κΈ°λ₯Ό μ›ν•œλ‹€λ©΄ 이 ν΄λΌμ΄μ–ΈνŠΈμ—κ²ŒλŠ” walk λ©”μ‹œμ§€λ§Œ 보여야 ν•œλ‹€.


ν΄λΌμ΄μ–ΈνŠΈμ— 따라 μΈν„°νŽ˜μ΄μŠ€λ₯Ό λΆ„λ¦¬ν•˜λ©΄ 각 ν΄λΌμ΄μ–ΈνŠΈμ˜ μš”κ΅¬κ°€ λ°”λ€Œλ”λΌλ„ 영ν–₯의 νŒŒκΈ‰ 효과λ₯Ό 효과적으둜 μ œμ–΄ν•  수 있게 λœλ‹€. 이처럼 μΈν„°νŽ˜μ΄μŠ€λ₯Ό ν΄λΌμ΄μ–ΈνŠΈμ˜ κΈ°λŒ€μ— 따라 λΆ„λ¦¬ν•¨μœΌλ‘œμ¨ 변경에 μ˜ν•΄ 영ν–₯을 μ œμ–΄ν•˜λŠ” 섀계 원칙을 μΈν„°νŽ˜μ΄μŠ€ 뢄리 원칙(Integerface Segrefation Principle, ISP)이라고 λΆ€λ₯Έλ‹€.

κ·Έλž˜μ„œ μ–Έμ œ 상속을 μ‚¬μš©ν•΄μ•Ό ν•˜λŠ”κ°€?
행동 ν˜Έν™˜μ„±μ„ λ§Œμ‘±ν•˜λŠ” 상속 κ΄€κ³„λŠ” λΆ€λͺ¨ 클래슀λ₯Ό μƒˆλ‘œμš΄ μžμ‹ 클래슀둜 λŒ€μ²΄ ν•˜λ”λΌλ„ μ‹œμŠ€ν…œμ΄ 문제 없이 λ™μž‘ν•  κ²ƒμ΄λΌλŠ” 것을 보μž₯ν•΄μ•Ό ν•œλ‹€. λ‹€μ‹œ λ§ν•΄μ„œ μžμ‹ ν΄λž˜μŠ€μ™€ λΆ€λͺ¨ 클래슀 μ‚¬μ΄μ˜ 행동 ν˜Έν™˜μ„±μ€ λΆ€λͺ¨ ν΄λž˜μŠ€μ— λŒ€ν•œ μžμ‹ 클래슀의 λŒ€μ²΄ κ°€λŠ₯성을 ν¬ν•¨ν•œλ‹€.

행동 ν˜Έν™˜μ„±κ³Ό λŒ€μ²΄ κ°€λŠ₯성은 μ˜¬λ°”λ₯Έ 상속 관계λ₯Ό κ΅¬μΆ•ν•˜κΈ° μœ„ν•΄ 따라야 ν•  지침이라고 ν•  수 μžˆλ‹€.

πŸ“Œ λ¦¬μŠ€μ½”ν”„ μΉ˜ν™˜ 원칙

λ¦¬μŠ€μ½”ν”„ μΉ˜μ™„ 원칙은

  • "μ„œλΈŒ νƒ€μž…μ€ κ·Έκ²ƒμ˜ 기반 νƒ€μž…μ— λŒ€ν•΄ λŒ€μ²΄ κ°€λŠ₯ν•΄μ•Ό ν•œλ‹€"λŠ” κ²ƒμœΌλ‘œ
  • ν΄λΌμ΄μ–ΈνŠΈκ°€ "차이점을 μΈμ‹ν•˜μ§€ λͺ»ν•œ 채 νŒŒμƒ 클래슀의 μΈν„°νŽ˜μ΄μŠ€λ₯Ό 톡해 μ„œλΈŒ 클래슀λ₯Ό μ‚¬μš©ν•  수 μžˆμ–΄μ•Ό ν•œλ‹€"λŠ” 것이닀.

πŸ“Œ 계약에 μ˜ν•œ 섀계와 μ„œλΈŒνƒ€μ΄ν•‘

ν΄λΌμ΄μ–ΈνŠΈμ™€ μ„œλ²„ μ‚¬μ΄μ˜ ν˜‘λ ₯을 의무(obligation)와 이읡(benefit)으둜 κ΅¬μ„±λœ κ³„μ•½μ˜ κ΄€μ μ—μ„œ ν‘œν˜„ν•˜λŠ” 것을 계약에 μ˜ν•œ 섀계라고 λΆ€λ₯Έλ‹€. 계약에 μ˜ν•œ μ„€κ³„λŠ” ν΄λΌμ΄μ–ΈνŠΈκ°€ μ •μƒμ μœΌλ‘œ λ©”μ„œλ“œλ₯Ό μ‹€ν–‰ν•˜κΈ° μœ„ν•΄ λ§Œμ‘±μ‹œμΌœμ•Ό ν•˜λŠ” 사전 쑰건(precondition)κ³Ό λ©”μ„œλ“œκ°€ μ‹€ν–‰λœ 후에 μ„œλ²„κ°€ ν΄λΌμ΄μ–ΈνŠΈμ—κ²Œ 보μž₯ν•΄μ•Ό ν•˜λŠ” 사후 쑰건(postcondirion)κ³Ό λ©”μ„œλ“œ μ‹€ν–‰ μ „κ³Ό 싀행후에 μΈμŠ€ν„΄μŠ€κ°€ λ§Œμ‘±μ‹œμΌœμ•Ό ν•˜λŠ” 클래슀 λΆˆλ³€μ‹(class invariant)의 μ„Έ κ°€μ§€ μš”μ†Œλ‘œ κ΅¬μ„±λœλ‹€.

μ–΄λ–€ νƒ€μž…μ΄ 슈퍼 νƒ€μž…μ—μ„œ μ •μ˜ν•œ 사전 쑰건보닀 더 μ•½ν•œ 사전 쑰건을 μ •μ˜ν•˜κ³  μžˆλ‹€λ©΄ κ·Έ νƒ€μž…μ€ μ„œλΈŒ νƒ€μž…μ΄ 될 수 μžˆμ§€λ§Œ 더 κ°•ν•œ 사전 쑰건을 μ •μ˜ν•œλ‹€λ©΄ μ„œλΈŒ νƒ€μž…μ΄ 될 수 μ—†λ‹€. μ–΄λ–€ νƒ€μž…μ΄ 슈퍼 νƒ€μž…μ—μ„œ μ •μ˜ν•œ 사후 쑰건보닀 더 κ°•ν•œ 사후 쑰건을 μ •μ˜ ν•˜λ”λΌλ„ κ·Έ νƒ€μž…μ€ μ—¬μ „νžˆ μ„œλΈŒ νƒ€μž…μ΄μ§€λ§Œ 더 μ•½ν•œ 사후 쑰건을 μ •μ˜ν•œλ‹€λ©΄ μ„œλΈŒ νƒ€μž…μ˜ 쑰건이 κΉ¨μ§€κ³  말 것이닀.


좜처
였브젝트 - μ½”λ“œλ‘œ μ΄ν•΄ν•˜λŠ” 객체지ν–₯ 섀계
https://github.com/eternity-oop/object

0개의 λŒ“κΈ€