포슀트

πŸŒ’ SOLID 원칙

πŸ’« The SOLID principles


  • S : Single Responsibility Principle (λ‹¨μΌμ±…μž„μ›μΉ™)
  • O : Open-Closed Principle (개방-νμ‡„μ˜ 원칙)
  • L : Liskov Substitution Principle (λ¦¬μŠ€μ½”ν”„ μΉ˜ν™˜ 원칙)
  • I : Interface Segregation Principle (μΈν„°νŽ˜μ΄μŠ€ 뢄리 원칙)
  • D : Dependency Inversion Principle (μ˜μ‘΄κ΄€κ³„ μ—­μ „ 원칙)

πŸ’« S : Single Responsibility Principle (λ‹¨μΌμ±…μž„μ›μΉ™)


🫧 ν•˜λ‚˜μ˜ ν΄λž˜μŠ€λŠ” ν•˜λ‚˜μ˜ μ±…μž„λ§Œμ„ 가진닀.

Like μœ λ‹ˆν‹° μ»΄ν¬λ„ŒνŠΈ, 각 μ»΄ν¬λ„ŒνŠΈλŠ” ν•˜λ‚˜μ˜ κΈ°λŠ₯만 가진닀.

ν”Œλ ˆμ΄μ–΄μ˜ Audio, Input, Movement κΈ°λŠ₯을 PlayerλΌλŠ” ν•˜λ‚˜μ˜ 클래슀둜 ν•©μ³μ„œ λ§Œλ“€μ§€ μ•ŠλŠ”λ‹€.
PlayerAudio, PlayerInput, PlayerMovement 각각의 클래슀둜 λΆ„λ¦¬ν•˜μ—¬ 단일 μ±…μž„μ„ κ°€μ§€κ²Œ ν•œλ‹€.

ν΄λž˜μŠ€κ°€ μ œκ³΅ν•˜λŠ” λͺ¨λ“  κΈ°λŠ₯은 이 μ±…μž„κ³Ό λΆ€ν•©ν•œλ‹€.

🫧 ν΄λž˜μŠ€λŠ” κ·Έ μ±…μž„μ„ μ™„μ „νžˆ μΊ‘μŠν™”ν•΄μ•Ό ν•œλ‹€.

클래슀λ₯Ό μˆ˜μ •ν•˜λŠ” μ΄μœ λ„ 단 ν•˜λ‚˜μ˜ μ΄μœ μ—¬μ•Όν•œλ‹€.
클래슀λ₯Ό μˆ˜μ •ν•  λ•Œ λ‹€λ₯Έ ν΄λž˜μŠ€μ— 영ν–₯을 주지 μ•Šλ„λ‘, 클래슀의 μ±…μž„μ„ λΆ„λ¦¬ν•΄μ•Όν•œλ‹€.

🫧 S : Memo

  • 클래슀 λ‹Ή μ½”λ“œ κ°μ†Œ
    • 클래슀λ₯Ό λ‚˜λˆ„κΈ° λ•Œλ¬Έμ—, ν•œ 클래슀의 길이가 짧아진닀.
  • 클래슀 μ˜μ‘΄μ„± κ°μ†Œ
    • ν΄λž˜μŠ€κ°€ μˆ˜μ •λ˜μ–΄λ„ λ‹€λ₯Έ ν΄λž˜μŠ€μ— 영ν–₯을 주지 μ•ŠλŠ”λ‹€.

=>

  • Readability (가독성)
    • 짧은 ν΄λž˜μŠ€κ°€ 읽기 쉽닀.
  • Extensibility (ν™•μž₯μ„±)
    • μž‘μ€ ν΄λž˜μŠ€λ‘œλΆ€ν„° 상속이 쉽닀.
  • Reusability (μž¬μ‚¬μš©μ„±)
    • λΆ€λΆ„μ—μ„œ μž¬μ‚¬μš©ν•  수 μžˆλ„λ‘ μž‘κ³  λͺ¨λ“ˆμ‹μœΌλ‘œ 섀계
  • μœ μ§€λ³΄μˆ˜μ„± ν–₯상

πŸ’« O : Open-Closed Principle (개방-νμ‡„μ˜ 원칙)


🫧 ν™•μž₯μ—λŠ” μ—΄λŸ¬μžˆκ³ ,

  • λͺ¨λ“ˆμ˜ λ™μž‘μ„ ν™•μž₯ν•  수 μžˆλ‹€λŠ” 것을 의미
  • μš”κ΅¬ 사항이 변경될 λ•Œ, μƒˆλ‘œμš΄ λ™μž‘μ„ μΆ”κ°€ν•΄ λͺ¨λ“ˆμ„ ν™•μž₯
  • 즉, λͺ¨λ“ˆμ΄ ν•˜λŠ” 일을 λ³€κ²½ν•  수 있음

🫧 μˆ˜μ •μ—λŠ” λ‹«ν˜€μžˆμ–΄μ•Όν•œλ‹€.

  • μ½”λ“œλ₯Ό μˆ˜μ •ν•˜μ§€ μ•Šμ•„λ„ λͺ¨λ“ˆμ˜ κΈ°λŠ₯을 ν™•μž₯ν•˜κ±°λ‚˜ λ³€κ²½ κ°€λŠ₯
  • λͺ¨λ“ˆμ˜ 라이브러리 (ex:DLL) 의 μˆ˜μ •μ΄ ν•„μš” μ—†μŒ

🫧 O : Memo

AreaCalculator μ•ˆμ— μ‚Όκ°ν˜•, μ‚¬κ°ν˜•μ˜ 넓이λ₯Ό κ³„μ‚°ν•˜λŠ” μ½”λ“œλ₯Ό 직접 λ„£κ²Œ 되면,
λ‚˜μ€‘μ— μ˜€κ°ν˜•, μœ‘κ°ν˜• 을 μΆ”κ°€ν•  λ•Œ AreaCalculator 클래슀λ₯Ό 직접 μˆ˜μ •ν•΄μ•Όν•œλ‹€.

λŒ€μ‹  CalculateArea() 좔상 λ©”μ„œλ“œλ₯Ό 가진 Shape 좔상 클래슀λ₯Ό λ§Œλ“€κ³ ,
μ‚Όκ°ν˜•, μ‚¬κ°ν˜•, μ˜€κ°ν˜• λ“±μ˜ ν΄λž˜μŠ€μ—μ„œ 이λ₯Ό 상속받아 κ΅¬ν˜„ν•œλ‹€.

μ΄λ ‡κ²Œ ν•˜λ©΄ AreaCalculator ν΄λž˜μŠ€λŠ” Shape.CalculateArea()λ₯Ό μ΄μš©ν•΄ 넓이λ₯Ό κ³„μ‚°ν•˜λ―€λ‘œ,
μƒˆλ‘œμš΄ λ„ν˜•μ΄ μΆ”κ°€λ˜μ–΄λ„ AreaCalculator 클래슀λ₯Ό 직접 μˆ˜μ •ν•  ν•„μš”κ°€ μ—†λ‹€.

=> μ½”λ“œλ₯Ό 직접 μˆ˜μ •ν•˜μ§€ μ•Šκ³ λ„ μƒˆλ‘œμš΄ κΈ°λŠ₯을 μΆ”κ°€ν•  수 μžˆλ‹€.

πŸ’« L : Liskov Substitution Principle (λ¦¬μŠ€μ½”ν”„ μΉ˜ν™˜ 원칙)


🫧 νŒŒμƒ ν΄λž˜μŠ€λŠ” κΈ°λ³Έ 클래슀λ₯Ό λŒ€μ²΄ν•  수 μžˆμ–΄μ•Ό ν•œλ‹€.

= 상속받은 ν΄λž˜μŠ€λŠ” λΆ€λͺ¨ 클래슀의 λ°©ν–₯성을 μœ μ§€ν•΄μ•Όν•œλ‹€.
= (μƒμœ„ νƒ€μž…μ˜ 객체λ₯Ό ν•˜μœ„ νƒ€μž…μœΌλ‘œ 바꾸어도 λ™μΌν•˜κ²Œ λ™μž‘ν•΄μ•Όν•œλ‹€.)

  • ν•˜μœ„ 클래슀λ₯Ό κ°•λ ₯ν•˜κ³  μœ μ—°ν•˜κ²Œ λ§Œλ“œλŠ” 원칙
  • OOP의 상속을 μ‚¬μš©ν•˜λ©΄ ν•˜μœ„ 클래슀λ₯Ό 톡해 κΈ°λŠ₯을 μΆ”κ°€ν•  수 있음
    • κ·ΈλŸ¬λ‚˜, μ£Όμ˜ν•˜μ§€ μ•ŠμœΌλ©΄ λΆˆν•„μš”ν•œ λ³΅μž‘μ„±μ΄ λ°œμƒ

🫧 μƒμ†λ³΄λ‹€λŠ” ꡬ성

= μƒμ†λ³΄λ‹€λŠ” μΈν„°νŽ˜μ΄μŠ€
= is-a λ³΄λ‹€λŠ” has-a

  • 클래슀 계측 ꡬ쑰λ₯Ό μ„€μ •ν•˜κΈ° 전에 클래슀 APIλ₯Ό κ³ λ €
    • ν˜„μ‹€μ˜ λΆ„λ₯˜κ°€ 항상 클래슀 계측 ꡬ쑰둜 λ³€ν™˜λ˜λŠ” 것은 μ•„λ‹˜
    • Ex: Car와 Train이 λ³„λ„μ˜ μƒμœ„ ν΄λž˜μŠ€μ—μ„œ μƒμ†λ°›λŠ” 것이 더 합리적
      • X : Vehicle (GoFoward, Reverse, TurnRight, TurnLeft) -> Car, Train
        • κΈ°μ°¨λŠ” 길을 따라 움직이기 λ•Œλ¬Έμ— TurnRight, TurnLeftκ°€ ν•„μš”ν•˜μ§€ μ•ŠμŒ
      • O : IMovable (GoFoward, Reverse), ITurnable (TurnRight, TurnLeft)
        • RoadVehicle (IMovable, ITurnable) -> Car
        • RailVehicle (IMovable) -> Train

🫧 L : Memo

  • 좔상화λ₯Ό λ‹¨μˆœν•˜κ²Œ μœ μ§€

  • ν•˜μœ„ ν΄λž˜μŠ€μ—λŠ” κΈ°λ³Έ 클래슀의 퍼블릭 멀버 쑴재
  • μ„œλΈŒν΄λž˜μ‹±ν•  λ•Œ κΈ°λŠ₯을 μ œκ±°ν•˜λŠ” 경우 λ¦¬μŠ€μ½”ν”„μΉ˜ν™˜μ›μΉ™ μœ„λ°°
    • λΆ€λͺ¨ 클래슀의 λ°©ν–₯성을 λ”°λ₯΄μ§€ μ•ŠλŠ” κ²ƒμ΄λ―€λ‘œ

πŸ’« I : Interface Segregation Principle (μΈν„°νŽ˜μ΄μŠ€ 뢄리 원칙)


β€œνŠΉμ • ν΄λΌμ΄μ–ΈνŠΈλ₯Ό μœ„ν•œ μΈν„°νŽ˜μ΄μŠ€ μ—¬λŸ¬ κ°œκ°€ λ²”μš© μΈν„°νŽ˜μ΄μŠ€ ν•˜λ‚˜λ³΄λ‹€ λ‚«λ‹€.”

  • ν΄λΌμ΄μ–ΈνŠΈκ°€ μžμ‹ μ΄ μ΄μš©ν•˜μ§€ μ•ŠλŠ” λ©”μ†Œλ“œμ— μ˜μ‘΄ν•˜μ§€ μ•Šμ•„μ•Ό ν•œλ‹€λŠ” 원칙
  • 큰 λ©μ–΄λ¦¬μ˜ μΈν„°νŽ˜μ΄μŠ€λ“€μ„ ꡬ체적이고 μž‘μ€ λ‹¨μœ„λ‘œ 뢄리
    • ν΄λΌμ΄μ–ΈνŠΈλ“€μ΄ κΌ­ ν•„μš”ν•œ λ©”μ„œλ“œλ“€λ§Œ μ΄μš©ν•  수 있게 μΈν„°νŽ˜μ΄μŠ€λ₯Ό 뢄리해야 ν•œλ‹€.
  • μ‹œμŠ€ν…œ λ‚΄λΆ€ μ˜μ‘΄μ„±μ„ μ•½ν™”ν•˜κ³  μœ μ—°μ„±μ„ κ°•ν™”

πŸ’« D : Dependency Inversion Principle (μ˜μ‘΄κ΄€κ³„ μ—­μ „ 원칙)


ν”„λ‘œκ·Έλž˜λ¨ΈλŠ” β€œμΆ”μƒν™”μ— μ˜μ‘΄ν•΄μ•Όμ§€, ꡬ체화에 μ˜μ‘΄ν•˜λ©΄ μ•ˆλœλ‹€.”
μ˜μ‘΄μ„± μ£Όμž…μ€ 이 원칙을 λ”°λ₯΄λŠ” 방법 쀑 ν•˜λ‚˜λ‹€.

  • μ†Œν”„νŠΈμ›¨μ–΄ λͺ¨λ“ˆλ“€μ„ λΆ„λ¦¬ν•˜λŠ” νŠΉμ • ν˜•μ‹
  • μƒμœ„(High-level) λͺ¨λ“ˆμ€ ν•˜μœ„(Low-level) λͺ¨λ“ˆμ˜ 것을 직접 κ°€μ Έμ˜€λ©΄ μ•ˆλ¨
    • λ‘˜ λ‹€ 좔상화에 μ˜μ‘΄ν•΄μ•Ό 함
  • μΆ”μƒν™”λŠ” μ„ΈλΆ€ 사항에 μ˜μ‘΄ν•΄μ„œλŠ” μ•ˆλ¨.
    • μ„ΈλΆ€ 사항이 좔상화에 μ˜μ‘΄ν•΄μ•Ό 함.
  • ν΄λž˜μŠ€κ°€ λ‹€λ₯Έ ν΄λž˜μŠ€μ™€ 관계가 있으면 μ•ˆλ¨
    • ν΄λž˜μŠ€κ°€ λ‹€λ₯Έ 클래슀의 μž‘λ™ 방식을 많이 μ•Œκ³  있으면 μ•ˆλ¨
    • 쒅속성(dependency) λ˜λŠ” κ²°ν•©(coupling) λ°œμƒ
    • 쒅속성은 μ–΄λŠ 잠재적인 μœ„ν—˜
  • X : Switchκ°€ Door, Light, Fan을 λͺ¨λ‘ 직접 μ œμ–΄ (의쑴)
    • λ‹€λ₯Έ κΈ°κΈ°κ°€ μΆ”κ°€λ˜λ©΄ Switchλ₯Ό μˆ˜μ •ν•΄μ•Ό 함
  • O : Swtichκ°€ ISwitchable을 μ œμ–΄
    • Door, Light, Fan은 각각 ISwitchable을 κ΅¬ν˜„

πŸ’« Ref


μ°Έκ³  : β€˜SOLID (객체 지ν–₯ 섀계)’

이 κΈ°μ‚¬λŠ” μ €μž‘κΆŒμžμ˜ CC BY 4.0 λΌμ΄μ„ΌμŠ€λ₯Ό λ”°λ¦…λ‹ˆλ‹€.