A A
[Design Pattern] Object-Oriented Programming (OOP)

Object-Oriented Programming (객체지ν–₯ ν”„λ‘œκ·Έλž˜λ°, OOP)의 이해

객체지ν–₯ ν”„λ‘œκ·Έλž˜λ°(Object-Oriented Programming, OOP)은 μ‹€μ„Έκ³„μ˜ μ‚¬λ¬Όμ΄λ‚˜ κ°œλ…μ„ 객체둜 λͺ¨λΈλ§ν•˜μ—¬ μ†Œν”„νŠΈμ›¨μ–΄λ₯Ό κ°œλ°œν•˜λŠ” ν”„λ‘œκ·Έλž˜λ° νŒ¨λŸ¬λ‹€μž„μž…λ‹ˆλ‹€.
  • 이 μ ‘κ·Ό 방식은 데이터(속성)와 κ·Έ 데이터λ₯Ό μ²˜λ¦¬ν•˜λŠ” 데 ν•„μš”ν•œ κΈ°λŠ₯(ν•¨μˆ˜ λ˜λŠ” λ©”μ†Œλ“œ)을 ν•˜λ‚˜μ˜ λ‹¨μœ„λ‘œ λ¬Άμ–΄μ„œ μƒκ°ν•©λ‹ˆλ‹€.
  • 예λ₯Ό λ“€μ–΄μ„œ CarλΌλŠ” 객체가 μžˆμ„λ•Œ?
속성: fuel: μ°¨λŸ‰μ˜ μ—°λ£Œ μ–‘, speed: μ°¨λŸ‰μ˜ ν˜„μž¬ 속도, steering wheel: ν•Έλ“€μ˜ μœ„μΉ˜, coordinate: μ°¨λŸ‰μ˜ ν˜„μž¬ μœ„μΉ˜
ν•¨μˆ˜: accelerate(): μ°¨λŸ‰μ˜ 속도λ₯Ό μ¦κ°€μ‹œν‚΅λ‹ˆλ‹€. takeLeft(): μ°¨λŸ‰μ„ μ™Όμͺ½μœΌλ‘œ μ‘°ν–₯ν•©λ‹ˆλ‹€. takeRight(): μ°¨λŸ‰μ„ 였λ₯Έμͺ½μœΌλ‘œ μ‘°ν–₯ν•©λ‹ˆλ‹€.

Object-Oriented Programming (객체지ν–₯ ν”„λ‘œκ·Έλž˜λ°)

Object(객체)

객체(object)λŠ” ν”„λ‘œκ·Έλž¨μ„ κ΅¬μ„±ν•˜λŠ” κΈ°λ³Έ λ‹¨μœ„λ‘œ, μ‹€μ„Έκ³„μ˜ μ‚¬λ¬Όμ΄λ‚˜ κ°œλ…μ„ μΆ”μƒν™”ν•˜μ—¬ ν‘œν˜„ν•©λ‹ˆλ‹€.
  • 각 κ°μ²΄λŠ” κ·Έ 객체만의 속성(μƒνƒœ)κ³Ό ν–‰μœ„(λ©”μ†Œλ“œ)λ₯Ό 가지며, ν”„λ‘œκ·Έλž¨μ€ μ΄λŸ¬ν•œ κ°μ²΄λ“€μ˜ μƒν˜Έ μž‘μš©μ„ 톡해 μ›ν•˜λŠ” κΈ°λŠ₯을 μˆ˜ν–‰ν•©λ‹ˆλ‹€.
  • λ˜ν•œ κ°μ²΄λŠ” λ‹€λ₯Έ 객체와 μƒν˜Έ μž‘μš©μ„ ν•˜λ©° λͺ©μ μ„ λ‹¬μ„±ν•©λ‹ˆλ‹€.
  • 예λ₯Ό λ“€μ–΄ 객체 Personκ³Ό CarλŠ” ν”„λ‘œκ·Έλž¨ λ‚΄ 각각의 κ°μ²΄μ§€λ§Œ Person은 Carλ₯Ό μ΄μš©ν• μˆ˜ μžˆμŠ΅λ‹ˆλ‹€.
  • ν”„λ‘œκ·Έλž¨μœΌλ‘œ 무언가λ₯Ό κ΅¬ν˜„ν•  λ•Œ κ·Έ 세계관 λ‚΄λΆ€μ˜ 의미 μžˆλŠ” μ •λ³΄μ˜ λ‹¨μœ„λ“€, 이런 κ°œλ…μž…λ‹ˆλ‹€.

Example: Object-Oriented Programming (객체지ν–₯ ν”„λ‘œκ·Έλž˜λ°):

  • 예λ₯Ό λ“€μ–΄ OOP둜 IoT기반의 μ²¨λ‹¨μ»€ν”Όμˆ μš΄μ˜μ— λŒ€ν•œ Scopeλ₯Ό κ΅¬ν˜„ν•œλ‹€κ³  생각해 λ³΄κ² μŠ΅λ‹ˆλ‹€.
  • ν…Œμ΄λΈ”, μž₯λΉ„(에어컨, 냉μž₯κ³ , TVλ“±), μƒν’ˆ, μž¬κ³ κ΄€λ¦¬, κ³„μ‚°λŒ€μ™€ 같은 것듀이 객체둜 ν‘œν˜„ν•  수 μžˆλŠ” λ‹¨μœ„λ‘œ 생각할 수 μžˆμŠ΅λ‹ˆλ‹€.
  • 좔상화 ν•  λ•ŒλŠ” μ‹€μ œ λˆˆμ— λ³΄μ΄λŠ” 물리적인 객체가 μ•„λ‹Œ 좔상적인 객체둜 생각해야 ν•©λ‹ˆλ‹€.


Class(클래슀)

ν΄λž˜μŠ€λŠ” 객체지ν–₯ ν”„λ‘œκ·Έλž˜λ°(OOP)μ—μ„œ 쀑심적인 역할을 ν•˜λŠ” κ°œλ…μž…λ‹ˆλ‹€
  • ν΄λž˜μŠ€λŠ” 객체λ₯Ό μƒμ„±ν•˜κΈ° μœ„ν•œ 'ν‹€' λ˜λŠ” '섀계도'λ‘œμ„œ, νŠΉμ • μœ ν˜•μ˜ 객체듀이 κ³΅ν†΅μ μœΌλ‘œ κ°€μ Έμ•Ό ν•  속성(Attributes)κ³Ό 행동(Methods)을 μ •μ˜ν•©λ‹ˆλ‹€.
  • ν΄λž˜μŠ€λŠ” 속성과 행동을 ν¬ν•¨ν•˜λŠ” 객체λ₯Ό μ •μ˜ν•©λ‹ˆλ‹€.

Attributes(속성)

  • 클래슀 λ‚΄μ—μ„œ μ •μ˜λœ λ³€μˆ˜λ“€λ‘œ, 객체의 μƒνƒœλ₯Ό λ‚˜νƒ€λ‚΄λŠ” 데이터λ₯Ό μ €μž₯ν•©λ‹ˆλ‹€. λ˜ν•œ 속성은 λ°μ΄ν„°μ˜ μš”μ†Œμ΄κ³  ν•¨μˆ˜λŠ” νŠΉμ • μž‘μ—…μ„ μˆ˜ν–‰ν•©λ‹ˆλ‹€.
  • 예λ₯Ό λ“€μ–΄, Personν΄λž˜μŠ€μ—λŠ” name, age, gender와 같은 속성을 포함될 수 μžˆμŠ΅λ‹ˆλ‹€.

Method(λ©”μ†Œλ“œ)

  • 클래슀 λ‚΄μ—μ„œ μ •μ˜λœ ν•¨μˆ˜λ“€λ‘œ, 객체의 행동(ν–‰μœ„)λ₯Ό λ‚˜νƒ€λƒ…λ‹ˆλ‹€.
  • λ©”μ†Œλ“œλŠ” 클래슀의 속성을 μ‚¬μš©ν•˜κ±°λ‚˜ μˆ˜μ •ν•˜λŠ” 역할을 ν•˜λ©°, 객체 κ°„μ˜ μƒν˜Έμž‘μš©μ„ κ΅¬ν˜„ν•˜μ—¬ Taskλ₯Ό μˆ˜ν–‰ν•˜λŠ”λ° μ‚¬μš©λ©λ‹ˆλ‹€.

Object-Oriented Programming, OOP의 μ£Όμš”κΈ°λŠ₯

μΊ‘μŠν™”

μΊ‘μŠν™”λŠ” 객체의 μƒνƒœ(데이터)와 ν–‰μœ„(λ©”μ†Œλ“œ)λ₯Ό ν•˜λ‚˜λ‘œ λ¬Άκ³ , 객체의 일뢀 κ΅¬ν˜„ μ„ΈλΆ€ 사항을 μ™ΈλΆ€λ‘œλΆ€ν„° μˆ¨κΈ°λŠ” κ²ƒμž…λ‹ˆλ‹€.
  • μΊ‘μŠν™”μ˜ 주된 λͺ©μ μ€ 객체의 λ‚΄λΆ€ κ΅¬ν˜„μ„ λ³΄ν˜Έν•˜κ³ , μ™ΈλΆ€μ˜ λΆˆν•„μš”ν•œ μ ‘κ·ΌμœΌλ‘œλΆ€ν„° 객체λ₯Ό λ³΄ν˜Έν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.
  • μ‚¬μš©μžλŠ” 객체의 λ‚΄λΆ€ ꡬ쑰 및 μƒνƒœλ₯Ό 직접 μˆ˜μ •ν•  수 μ—†κ³  λŒ€μ‹  μˆ˜μ •μ„ μš”μ²­ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • μš”μ²­μ˜ μ’…λ₯˜μ— 따라 κ°μ²΄λŠ” getter, setter와 같은 특수 ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ λ‚΄λΆ€ μƒνƒœλ₯Ό λ³€κ²½ν•©λ‹ˆλ‹€.
  • pythonμ—λŠ” public, private, protected(C++, Java)와 같은 μΊ‘μŠν™”μ— ν•„μš”ν•œ μ ‘κ·Ό μ œμ–΄ ν‚€μ›Œλ“œκ°€ μ—†κΈ° λ•Œλ¬Έμ— μΊ‘μŠν™” κ°œλ…μ΄ μ‘΄μž¬ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

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

λ‹€ν˜•μ„±μ€ λ™μΌν•œ μΈν„°νŽ˜μ΄μŠ€λ‚˜ λ©”μ†Œλ“œ 호좜이 λ‹€μ–‘ν•œ 객체듀에 μ˜ν•΄ μ„œλ‘œ λ‹€λ₯Έ λ°©μ‹μœΌλ‘œ 응닡할 수 있게 ν•˜λŠ” κΈ°λŠ₯μž…λ‹ˆλ‹€
  • λ‹€ν˜•μ„±(Polymerphism)μ—λŠ” 2가지 μ˜λ―Έκ°€ μžˆμŠ΅λ‹ˆλ‹€.
    • κ°μ²΄λŠ” ν•¨μˆ˜ μΈμžμ— 따라 λ‹€λ₯Έ κΈ°λŠ₯을 μˆ˜ν–‰ν•©λ‹ˆλ‹€.
    • λ™μΌν•œ μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ—¬λŸ¬ ν˜•μ‹μ˜ 객체듀이 κ³΅μœ ν•©λ‹ˆλ‹€.
  • Python은 λ‹€ν˜•μ„±μ„ μ§€μ›ν•˜λŠ” 언어이며, 예λ₯Ό λ“€μ–΄ + μ—°μ‚°μžλŠ” 두 μ •μˆ˜λ₯Ό λ”ν•˜λŠ” 것도 κ°€λŠ₯ν•©λ‹ˆλ‹€.
  • λ‹€λ§Œ, λ¬Έμžμ—΄μ„ ν”Όμ—°μ‚°μžλ‘œ μ‚¬μš©ν•˜λ©΄ λ¬Έμžμ—΄μ΄ ν•©μ³μ§€λŠ” κΈ°λŠ₯이 μˆ˜ν–‰λ©λ‹ˆλ‹€.

상속(Inheritance)

상속은 ν•œ 클래슀(λΆ€λͺ¨ 클래슀)의 속성과 λ©”μ†Œλ“œλ₯Ό λ‹€λ₯Έ 클래슀(μžμ‹ 클래슀)κ°€ λ°›μ•„ μ‚¬μš©ν•  수 있게 ν•˜λŠ” κΈ°λŠ₯μž…λ‹ˆλ‹€.
  • μ–΄λ–€ 클래슀의 κΈ°λŠ₯이 λΆ€λͺ¨ ν΄λž˜μŠ€λ‘œλΆ€ν„° νŒŒμƒλ˜λŠ”κ²ƒμ„ μ˜λ―Έν•©λ‹ˆλ‹€.
  • 그리고, λΆ€λͺ¨ ν΄λž˜μŠ€μ—μ„œ μ •μ˜λœ ν•¨μˆ˜λ₯Ό μž¬μ‚¬μš© ν•  수 있고, κΈ°λ³ΈκΈ°λŠ₯을 ν™•μž₯ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • λ˜ν•œ Pythonμ—μ„œλŠ” 닀쀑 상속을 μ§€μ›ν•˜λ©°, ν΄λž˜μŠ€κ°„ 계측 ꡬ쑰λ₯Ό ν˜•μ„±ν•˜λ©°, μ½”λ“œλ₯Ό μž¬μ‚¬μš© ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
# 상속 μ˜ˆμ‹œ μ½”λ“œ
class A():
    def a1(self):
        print('a1')

class B(A):
    def b1(self):
        print('B')

b = B()
b.a1()

좔상화 (Abstraction)

좔상화(Abstraction)λŠ” 객체지ν–₯ ν”„λ‘œκ·Έλž˜λ°(OOP)의 또 λ‹€λ₯Έ 핡심 κ°œλ…μž…λ‹ˆλ‹€.
μ΄λŠ” λ³΅μž‘ν•œ ν˜„μ‹€ 세계λ₯Ό 더 κ°„λ‹¨ν•˜κ²Œ ν‘œν˜„ν•˜κΈ° μœ„ν•΄ ν•„μˆ˜μ μΈ μ†μ„±μ΄λ‚˜ ν–‰λ™λ§Œμ„ μΆ”μΆœν•˜μ—¬ λͺ¨λΈλ§ν•˜λŠ” 과정을 λ§ν•©λ‹ˆλ‹€.
  • μš”μ•½ν•˜λ©΄, 곡톡적인 속성을 λ¬Άμ–΄μ„œ μ •μ˜ ν•˜λŠ” 것을 좔상화(abstraction)라고 ν•©λ‹ˆλ‹€.
  • 그리고 곡톡적인 속성을 λ”°λ‘œ λ§Œλ“€κ³ , μƒμœ„μ˜ κ°œλ…μœΌλ‘œ μ •μ˜κ°€ κ°€λŠ₯ν•©λ‹ˆλ‹€.
  • 그리고 각 기기에 μ˜μ‘΄λ˜λŠ” 속성듀에 μ˜ν•΄ λ‹€λ₯Έ 클래슀둜 μ •μ˜ ν•˜λŠ”κ²ƒμ΄ μ’‹μŠ΅λ‹ˆλ‹€.


μ»΄ν¬μ§€μ…˜ (Composition)

ν•œ ν΄λž˜μŠ€κ°€ λ‹€λ₯Έ 클래슀의 μΈμŠ€ν„΄μŠ€λ₯Ό ν¬ν•¨ν•˜μ—¬ κ·Έ κΈ°λŠ₯을 ν™œμš©ν•˜λŠ” 방식을 λ§ν•©λ‹ˆλ‹€.
  • κ°μ²΄λ‚˜ 클래슀λ₯Ό 더 λ³΅μž‘ν•œ 자료 κ΅¬μ‘°λ‚˜ λͺ¨λ“ˆλ‘œ λ¬ΆλŠ” ν–‰μœ„μž…λ‹ˆλ‹€.
  • μ»΄ν¬μ§€μ…˜μ„ 톡해 νŠΉμ • κ°μ²΄λŠ” λ‹€λ₯Έ λͺ¨λ“ˆμ˜ ν•¨μˆ˜λ₯Ό 호좜 ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • 즉, 상속 없이 μ™ΈλΆ€ κΈ°λŠ₯을 μ‚¬μš© κ°€λŠ₯ ν•©λ‹ˆλ‹€.
Loose Coupling(λŠμŠ¨ν•œ κ²°ν•©): μ‹œμŠ€ν…œ λ‚΄ μ—¬λŸ¬ 뢀뢄이 λ…λ¦½μ μœΌλ‘œ μ‘΄μž¬ν•˜λ©°, 변경사항이 ν•œ 뢀뢄에 영ν–₯을 λ―ΈμΉ˜μ§€ μ•ŠμŒ