πŸ“š μŠ€ν„°λ””/파이썬 μŠ€ν„°λ”” κ°•μ˜μžλ£Œ

[3νŒ€/김경은] 8μ£Όμ°¨ 파이썬 μŠ€ν„°λ”” - 객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ°

경은 2023. 5. 19. 08:33

데이터 과학을 μœ„ν•œ 파이썬 ν”„λ‘œκ·Έλž˜λ° κ΅μž¬λ₯Ό μ‚¬μš©ν•˜μ—¬ μž‘μ„±ν•œ κ°•μ˜μžλ£Œμž…λ‹ˆλ‹€.

8μ°¨μ‹œ_객체지ν–₯_κ°•μ˜μ•ˆ.pdf
0.94MB
8μ°¨μ‹œ_객체지ν–₯_과제.pdf
3.02MB

  • (객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ°Object Oriented Programming, OOP)의 κ°œλ…μ„ 배우기 전에 μ΄λŸ¬ν•œ κ°œλ…μ„ μ™œ μ‚¬μš©ν•˜λŠ”μ§€μ— λŒ€ν•œ 고민이 ν•„μš”ν•˜λ‹€. 이것은 μ•žμ—μ„œ ν•¨μˆ˜λ₯Ό 배울 λ•Œμ²˜λŸΌ μ—¬λŸ¬ μ‚¬λžŒμ΄ ν”„λ‘œκ·Έλž¨μ„ κ°œλ°œν•  λ•Œ μ–΄λ–€ 방법이 쒋은지에 λŒ€ν•œ κ³ λ―Όκ³Ό κ°™λ‹€. 쑰금 더 λ„“κ²Œ μƒκ°ν•˜λ©΄

πŸ’‘ λ‹€λ₯Έ μ‚¬λžŒμ΄ μž‘μ„±ν•œ μ½”λ“œλ₯Ό μ–΄λ–»κ²Œ μ‚¬μš©ν•˜λ©΄ 쒋을지에 λŒ€ν•œ 닡이 λ°”λ‘œ 객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ΄λ‹€.

  • 객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ€ λ‚΄κ°€ μ•„λ‹ˆλΌ 남이 λ§Œλ“  μ½”λ“œλ₯Ό μž¬μ‚¬μš©ν•˜κ³  싢을 λ•Œ μ‚¬μš©ν•˜λŠ” λŒ€ν‘œμ μΈ 방법이 λ‹€. ν•¨μˆ˜μ²˜λŸΌ μ–΄λ–€ κΈ°λŠ₯을 ν•¨μˆ˜ μ½”λ“œλ‘œ λ¬Άμ–΄ λ‘λŠ” 것이 μ•„λ‹ˆλΌ, μ–΄λ–€ κΈ°λŠ₯을 μˆ˜ν–‰ν•˜λŠ” ν•˜λ‚˜μ˜ 단일 ν”„λ‘œκ·Έλž¨μ„ 객체라고 ν•˜λŠ” μ½”λ“œλ‘œ λ§Œλ“€μ–΄ λ‹€λ₯Έ ν”„λ‘œκ·Έλž˜λ¨Έκ°€ μž¬μ‚¬μš©ν•  수 μžˆλ„λ‘ ν•œλ‹€. 이것은 μ»΄ν“¨ν„°κ³΅ν•™μ˜ 였래된 ν”„λ‘œκ·Έλž˜λ° 기법 쀑 ν•˜λ‚˜μ΄λ‹€.
  • 객체와 클래슀
    • 객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ„ μ΄ν•΄ν•˜κΈ° μœ„ν•΄μ„œλŠ” 객체(object)와 클래슀(class)의 κ°œλ…μ„ μ•Œμ•„μ•Ό ν•œλ‹€.
    • κ°μ²΄λŠ” μ‹€μƒν™œμ— μ‘΄μž¬ν•˜λŠ” μ‹€μ œμ μΈ 물건 λ˜λŠ” κ°œλ…μ„ λœ»ν•˜λ©°, 속성 (attribute)κ³Ό 행동(action)으둜 κ΅¬μ„±λœλ‹€. 객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ€ μ΄λŸ¬ν•œ 객체의 κ°œλ…μ„ ν™œμš©ν•˜μ—¬ ν”„λ‘œκ·Έλž¨μœΌλ‘œ ν‘œν˜„ν•˜λŠ” 기법이닀. 속성은 λ³€μˆ˜(variable)둜, 행동은 ν•¨μˆ˜(function)둜 μ •μ˜λœλ‹€.
    • 예λ₯Ό λ“€μ–΄. 인곡지λŠ₯ 좕ꡬ ν”„λ‘œκ·Έλž¨μ„ λ§Œλ“ λ‹€κ³  κ°€μ •ν•˜μž. 이 ν”„λ‘œκ·Έλž¨μ„ λ§Œλ“€κΈ° μœ„ν•΄μ„œλŠ” μ–΄ λ–€ μ’…λ₯˜μ˜ 객체가 ν•„μš”ν•œμ§€ 생각해야 ν•œλ‹€. κ°„λ‹¨ν•˜κ²Œ EA슀포츠의 FIFA μ‹œλ¦¬μ¦ˆμ™€ 같은 κ²Œμž„μ„ μƒκ°ν•΄λ³΄μž. 이 κ²Œμž„μ„ κ΅¬μ„±ν•˜λŠ” λ‹¨μœ„λ‘œ μ‹¬νŒ, μ„ μˆ˜, νŒ€μ΄ 있으며, μ΄λŸ¬ν•œ κ°œλ…μ„ 객체라고 ν•  수 μžˆλ‹€. ‘μ„ μˆ˜’ λΌλŠ” 객체의 경우 μ„ μˆ˜, 이름. ν¬μ§€μ…˜, μ†Œμ†νŒ€ 등이 ν•˜λ‚˜μ˜ 속성이라고 ν•  수 있고, ‘곡을 μ°¨λ‹€’, ‘νŒ¨μŠ€ν•˜λ‹€’와 같은 κ°œλ…μ€ ν–‰λ™μœΌλ‘œ 생각할 수 μžˆλ‹€.
    κ°œλ… μ„€λͺ… μ˜ˆμ‹œ
    객체 (object) μ‹€μƒν™œμ— μ‘΄μž¬ν•˜λŠ” μ‹€μ œμ μΈ 물건 λ˜λŠ” κ°œλ… μ‹¬νŒ, μ„ μˆ˜, νŒ€
    속성 (attribute) 객체가 가지고 μžˆλŠ” λ³€μˆ˜ μ„ μˆ˜μ˜ 이름, ν¬μ§€μ…˜. μ†Œμ†νŒ€
    행동 (action) 객체가 μ‹€μ œλ‘œ μž‘λ™μ‹œν‚€λŠ” ν•¨μˆ˜, λ©”μ„œλ“œ 곡을 μ°¨λ‹€, νŒ¨μŠ€ν•˜λ‹€
  • 사싀 κ°μ²΄λŠ” ν•˜λ‚˜μ˜ ν”„λ‘œκ·Έλž¨μ—μ„œ μ—¬λŸ¬ κ°œκ°€ μ‚¬μš©λ  μˆ˜λ„ μžˆλ‹€. λ”°λΌμ„œ 객체듀을 μœ„ν•œ 섀계도λ₯Ό λ§Œλ“€μ–΄μ•Ό ν•œλ‹€.
  • 이λ₯Ό ν”„λ‘œκ·Έλž¨μ—μ„œλŠ” 클래슀(class)라고 ν•œλ‹€. ν΄λž˜μŠ€λŠ” 객체가 κ°€μ Έμ•Ό ν•  κΈ°λ³Έ 정보λ₯Ό 담은 μ½”λ“œλ‘œ μΌμ’…μ˜ 섀계도 μ½”λ“œλΌκ³  μƒκ°ν•˜λ©΄ λœλ‹€.
  • 예λ₯Ό λ“€μ–΄, 좕ꡬ μ„ μˆ˜λΌλŠ” 객체λ₯Ό λ§Œλ“ λ‹€λ©΄ μ„ μˆ˜μ˜ 이름, ν¬μ§€μ…˜, μ†Œμ†νŒ€ 등은 기본적으둜 가지고 μžˆμ–΄μ•Ό ν•  속성이닀. μ΄λŸ¬ν•œ 정보λ₯Ό ν΄λž˜μŠ€μ— λ‹΄κ³  μ‹€μ œ μƒμ„±λ˜λŠ” 객체에 λŠ” 이동ꡭ, 손ν₯λ―Ό 같은 μ„ μˆ˜ 이름을 ν• λ‹Ήν•œλ‹€.
  • μ΄λ ‡κ²Œ ν•΄μ„œ μ‹€μ œλ‘œ μƒμ„±λ˜λŠ” 객체λ₯Ό μΈμŠ€ν„΄μŠ€(instance)라고 ν•œλ‹€.

λΆ•μ–΄λΉ΅ν‹€κ³Ό λΆ•μ–΄λΉ΅

  • λΆ•μ–΄λΉ΅ κ°€κ²Œμ—λŠ” 뢕어빡틀이 있고, 이λ₯Ό μ΄μš©ν•΄ μ—¬λŸ¬ μ’…λ₯˜μ˜ 뢕어빡을 λ§Œλ“€ 수 μžˆλ‹€. μ΄μ „μ—λŠ” 주둜 νŒ₯λΉ΅κ³Ό 크림빡 두 μ’…λ₯˜μ˜€λ‹€λ©΄ μ΅œκ·Όμ—λŠ” μ»€μŠ€ν„°λ“œλ‚˜ 블루베리 같은 λ‹€μ–‘ν•œ μ’…λ₯˜μ˜ 뢕어빡이 λ§Œλ“€μ–΄μ§€κ³  μžˆλ‹€.
  • 즉, 잘 λ§Œλ“  뢕어빡틀이 μžˆλ‹€λ©΄ μƒˆλ‘œμš΄ μ’…λ₯˜μ˜ λ‹€μ–‘ν•œ 뢕어빡을 λ§Œλ“œλŠ” 것은 어렡지 μ•Šλ‹€.
  • λ‹€μ‹œ 말해, 잘 λ§Œλ“  클래슀 μ½”λ“œκ°€ μžˆλ‹€λ©΄ 이 μ½”λ“œλ‘œ λ‹€μ–‘ν•œ μ’…λ₯˜μ˜ μΈμŠ€ν„΄μŠ€λ₯Ό 생성할 수 μžˆλ‹€λŠ” 것이닀. μ‰¬μš΄ κ°œλ…μ΄μ§€λ§Œ μ½”λ“œλ₯Ό 보기 μ „μ—λŠ” 잘 μ΄ν•΄λ˜μ§€ μ•Šμ„ 수 μžˆλ‹€.

파이썬의 객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ°

  • 클래슀 κ΅¬ν˜„ν•˜κΈ°
  • 이전 μ ˆμ—μ„œλŠ” 인곡지λŠ₯ 좕ꡬ ν”„λ‘œκ·Έλž¨μ„ 예둜 λ“€μ–΄ 객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ˜ μš©μ–΄λ₯Ό μ„€λͺ…ν•˜μ˜€λ‹€. μ‹€μ œλ‘œ 좕ꡬ μ„ μˆ˜ 클래슀λ₯Ό νŒŒμ΄μ¬μ—μ„œ κ΅¬ν˜„ν•˜λŠ” μ˜ˆμ œλΆ€ν„° μ‹œμž‘ν•˜λ €κ³  ν•œλ‹€.

  1. μ˜ˆμ•½μ–΄μΈ classλ₯Ό μ½”λ“œμ˜ 맨 μ•žμ— μž…λ ₯ν•˜κ³ , λ§Œλ“€κ³ μž ν•˜λŠ” 클래슀 이름을 μž‘μ„±ν•œλ‹€.
  2. κ·Έλ‹€μŒμœΌλ‘œ 상속받아야 ν•˜λŠ” λ‹€λ₯Έ 클래슀의 이름을 κ΄„ν˜Έ μ•ˆμ— λ„£λŠ”λ‹€.

[μ°Έκ³ ]

상속은 기쑴에 λ§Œλ“  클래슀의 νŠΉμ§•μ„ κ·ΈλŒ€λ‘œ 이어받아 μ‚¬μš©ν•˜λŠ” 것을 λ§ν•œλ‹€. 객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ˜ μž₯점 쀑 ν•˜λ‚˜λŠ” μž¬μ‚¬μš©μ„±μ΄κ³ , 이λ₯Ό μ†μ‰½κ²Œ ν•˜λŠ” 것이 λ°”λ‘œ 상속이닀.

νŒŒμ΄μ¬μ—μ„œ 자주 μ‚¬μš©ν•˜λŠ” μž‘λͺ… 기법

클래슀의 이름을 μ„ μ–Έν•  λ•Œ ν•œ 가지 νŠΉμ΄ν•œ 점은 κΈ°μ‘΄κ³Ό λ‹€λ₯΄κ²Œ 첫 κΈ€μžμ™€ 쀑간 κΈ€μžκ°€ λŒ€λ¬ΈμžλΌλŠ” 것이닀. 이것은 클래슀λ₯Ό μ„ μ–Έν•  λ•Œ μ‚¬μš©ν•˜λŠ” μž‘λͺ… 기법에 μ˜ν•œ 것이닀. 파이썬뿐만 μ•„λ‹ˆλΌ λͺ¨λ“  컴퓨터 ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄μ—μ„œ λ³€μˆ˜, 클래슀, ν•¨μˆ˜λͺ…을 μ§“λŠ” μž‘λͺ… 기법이 μžˆλ‹€.

μž‘λͺ… 기법 μ„€λͺ…

snake_case 띄어쓰기 뢀뢄에 λ₯Ό μΆ”κ°€ν•˜μ—¬ λ³€μˆ˜μ˜ 이름을 μ§€μ •ν•œλ‹€. 파이썬 ν•¨μˆ˜λ‚˜ λ³€μˆ˜λͺ…에 μ‚¬μš©λœλ‹€.
CamelCase 띄어쓰기 뢀뢄에 λŒ€λ¬Έμžλ₯Ό μ‚¬μš©ν•˜μ—¬ λ³€μˆ˜μ˜ 이름을 μ§€μ •ν•œλ‹€. λ‚™νƒ€μ˜ 혹처럼 생겼닀 ν•˜μ—¬ Camel이라고 λΆ€λ₯΄κ³ , 주둜 파이썬 클래슀λͺ…에 μ‚¬μš©λœλ‹€.
  • μ†μ„±μ˜ μ„ μ–Έ
    • λ¨Όμ € 클래슀의 속성을 μΆ”κ°€ν•˜λŠ” 선언에 λŒ€ν•΄ μ•Œμ•„λ³΄μž.
    • 속성에 λŒ€ν•œ 정보λ₯Ό μ„ μ–Έν•˜κΈ° μœ„ν•΄μ„œλŠ” _ init_()λΌλŠ” μ˜ˆμ•½ ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•œλ‹€.
    • 파이썬 ν΄λž˜μŠ€μ—μ„œλŠ” λͺ‡ 개의 μ˜ˆμ•½ ν•¨μˆ˜κ°€ μžˆλŠ”λ°. λŒ€ν‘œμ μΈ 것이 init()이고, 이 외에 __ str __, __ add __등이 μžˆλ‹€. μ΄λŸ¬ν•œ ν•¨μˆ˜λ“€μ€ μ•½μ†λœ ν˜•νƒœμ˜ μž‘μ—…μ„ μˆ˜ν–‰μ‹œμΌœ μ€€λ‹€.
    class SoccerPlayer(object):
        def__init__(self, name, position, back_number):
        self.name = name
        self.position = position
        self.back_number = back_number
    
    • __ init() __ν•¨μˆ˜λŠ” 이 ν΄λž˜μŠ€μ—μ„œ μ‚¬μš©ν•  λ³€μˆ˜λ₯Ό μ •μ˜ν•˜λŠ” ν•¨μˆ˜μ΄λ‹€.
    • __ init() __ν•¨μˆ˜μ˜ 첫 번째 λ§€κ°œλ³€μˆ˜λŠ” λ°˜λ“œμ‹œ self λ³€μˆ˜λ₯Ό μ‚¬μš©ν•΄μ•Ό ν•œλ‹€. self λ³€μˆ˜λŠ” ν΄λž˜μŠ€μ—μ„œ μƒμ„±λœ μΈμŠ€ν„΄μŠ€μ— μ ‘κ·Όν•˜λŠ” μ˜ˆμ•½μ–΄μ΄λ‹€. μƒμ„±λœ μΈμŠ€ν„΄μŠ€λ₯Ό μ§€μ •ν•˜λŠ” λ³€μˆ˜λΌκ³  μƒκ°ν•˜λ©΄ λœλ‹€.
    • self λ’€μ˜ λ§€κ°œλ³€μˆ˜λ“€μ€ μ‹€μ œλ‘œ ν΄λž˜μŠ€κ°€ 가진 μ†μ„±μœΌλ‘œ 좕ꡬ μ„ μˆ˜μ˜ 이름, ν¬μ§€μ…˜, λ“± 번호 λ“± 이닀. 이 값듀은 μ‹€μ œλ‘œ μƒμ„±λ˜λŠ” μΈμŠ€ν„΄μŠ€μ— ν• λ‹Ήλœλ‹€.
    • ν• λ‹Ήλ˜λŠ” μ½”λ“œλŠ” self.name = name 이닀. μ΄λŠ” λ”•μ…”λ„ˆλ¦¬ν˜•κ³Ό λΉ„μŠ·ν•œλ°, μƒμ„±λœ μΈμŠ€ν„΄μŠ€μ— μžˆλŠ” name λ³€μˆ˜μ— λ§€κ°œλ³€μˆ˜λ‘œ μž…λ ₯된 nameμ΄λΌλŠ” 값을 ν• λ‹Ήν•œλ‹€λŠ” λœ»μ΄λ‹€. 클래슀의 λ³€μˆ˜λŠ” ‘self.λ³€μˆ˜μ΄λ¦„’으둜 __ init() __ ν•¨μˆ˜μ—μ„œ 자유둭게 생성할 수 μžˆλ‹€.
    • λ¬Όλ‘  νŒŒμ΄μ¬μ€ 인터프리터 언어이고 동적 타이핑 μ–Έμ–΄ μ΄λ―€λ‘œ, 클래슀 λ‚΄ λ‹€λ₯Έ ν•¨μˆ˜μ—μ„œλ„ 이와 같은 μ†μ„±μ˜ 생성이 κ°€λŠ₯ν•˜λ‹€. κ·ΈλŸ¬λ‚˜ 일반적으둜 __ init() __ λ‚΄μ—μ„œλ§Œ μƒˆλ‘œμš΄ 속성을 μƒμ„±ν•΄μ•Όλ§Œ λ‹€λ₯Έ ν”„λ‘œκ·Έλž˜λ¨Έκ°€ 이 클래슀λ₯Ό μ‚¬μš©ν•  λ•Œ ν—·κ°ˆλ¦¬μ§€ μ•Šμ„ 것이닀.

ν•¨μˆ˜μ˜ μ„ μ–Έ

  • ν•¨μˆ˜λŠ” 이 ν΄λž˜μŠ€κ°€ ν•  수 μžˆλŠ” λ‹€μ–‘ν•œ λ™μž‘μ„ μ •μ˜ν•  수 μžˆλ‹€. 예λ₯Ό λ“€μ–΄ 좕ꡬ μ„ μˆ˜λΌλ©΄ λ“±λ²ˆν˜Έ κ΅μ²΄λΌλŠ” 행동을 ν•  수 μžˆλ‹€.
class SoccerPlayer(object):
    def change_back_number(self, new_number):
        print("μ„ μˆ˜μ˜ λ“±λ²ˆν˜Έλ₯Ό λ³€κ²½ν•œλ‹€: From %d to %d" % (self .back_number, new_number)) 
        self.back_number = new_number
  • 클래슀 λ‚΄μ—μ„œμ˜ ν•¨μˆ˜λ„ κΈ°μ‘΄ ν•¨μˆ˜μ™€ 크게 λ‹€λ₯΄μ§€ μ•Šλ‹€. ν•¨μˆ˜μ˜ 이름을 μ“°κ³  λ§€κ°œλ³€μˆ˜λ₯Ό μ‚¬μš©ν•˜λ©΄ λœλ‹€.
  • μ—¬κΈ°μ„œ κ°€μž₯ 큰 차이점은 λ°”λ‘œ selfλ₯Ό λ§€κ°œλ³€μˆ˜μ— λ°˜λ“œμ‹œ λ„£μ–΄μ•Ό ν•œλ‹€λŠ” 것이닀. selfκ°€ μžˆμ–΄μ•Όλ§Œ μ‹€μ œλ‘œ μΈμŠ€ν„΄μŠ€κ°€ μ‚¬μš©ν•  수 μžˆλŠ” ν•¨μˆ˜λ‘œ μ„ μ–Έλœλ‹€.

_의 μ“°μž„

  • 일반적으둜 νŒŒμ΄μ¬μ—μ„œ _의 μ“°μž„μ€ κ°œμˆ˜μ— 따라 μ—¬λŸ¬ κ°€μ§€λ‘œ λ‚˜λˆŒ 수 μžˆλ‹€. 예λ₯Ό λ“€μ–΄ _ 1κ°œλŠ” μ΄ν›„λ‘œ 쓰이지 μ•Šμ„ λ³€μˆ˜μ— νŠΉλ³„ν•œ 이름을 λΆ€μ—¬ν•˜κ³  싢지 μ•Šμ„ λ•Œ μ‚¬μš©ν•œλ‹€.
for _ in range(10):
print("Hello, World")
#좜λ ₯ κ²°κ³Ό

Hello, World 
Hello, World 
Hello, World
Hello, World 
Hello, World 
Hello, World
Hello, World 
Hello, World 
Hello, World
Hello, World 
  • μœ„ μ½”λ“œλŠ” ‘Hello, World’λ₯Ό 화면에 10번 좜λ ₯ν•˜λŠ” ν•¨μˆ˜μ΄λ‹€. 횟수λ₯Ό μ„ΈλŠ” _ λ³€μˆ˜λŠ” νŠΉλ³„ν•œ μš©λ„κ°€ μ—†μœΌλ―€λ‘œ λ’€μ—μ„œ μ‚¬μš©λ˜μ§€ μ•ŠλŠ”λ‹€. λ”°λΌμ„œ _λ₯Ό μž„μ˜μ˜ λ³€μˆ˜λͺ… λŒ€μ‹ μ— μ‚¬μš©ν•œλ‹€.
  • 또 λ‹€λ₯Έ μš©λ„λ‘œ _ 2개λ₯Ό μ‚¬μš©ν•˜λ©΄ νŠΉμˆ˜ν•œ μ˜ˆμ•½ ν•¨μˆ˜λ‚˜ λ³€μˆ˜λ₯Ό μ˜λ―Έν•œλ‹€. λŒ€ν‘œμ μœΌλ‘œ __ str() __ μ΄λ‚˜ __ init() __ 같은 ν•¨μˆ˜μ΄λ‹€. __ str() __ ν•¨μˆ˜λŠ” 클래슀둜 μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν–ˆμ„ λ•Œ, κ·Έ μΈμŠ€ν„΄μŠ€ 자체λ₯Ό print() ν•¨μˆ˜λ‘œ 화면에 좜λ ₯ν•˜λ©΄ λ‚˜μ˜€λŠ” 값을 λœ»ν•œλ‹€.

μΈμŠ€ν„΄μŠ€ μ‚¬μš©ν•˜κΈ°

μƒμ„±λœ 클래슀λ₯Ό μΈμŠ€ν„΄μŠ€λ‘œ ν˜ΈμΆœν•΄ μ‚¬μš©ν•˜λŠ” 방법

  • μΈμŠ€ν„΄μŠ€λŠ” ν΄λž˜μŠ€μ—μ„œ μ‹€μ œμ μΈ 데이터가 μž…λ ₯λ˜μ–΄ μ‚¬μš©ν•  수 μžˆλŠ” ν˜•νƒœμ˜ 객체λ₯Ό λœ»ν•œλ‹€. μ•žμ—μ„œ λΆ•μ–΄λΉ΅ 틀을 ν΄λž˜μŠ€μ—, 뢕어빡을 μΈμŠ€ν„΄μŠ€μ— λΉ„μœ ν–ˆλŠ”λ°, μΈμŠ€ν„΄μŠ€λŠ” μ—¬λŸ¬ 가지 μž¬λ£Œκ°€ λ“€μ–΄κ°„ λΆ•μ–΄λΉ΅ μžμ²΄μ— λΉ„μœ ν•  수 μžˆλ‹€.
  • μ•žμ—μ„œ 클래슀λ₯Ό κ΅¬ν˜„ν•  λ•Œ SoccerPlayerλΌλŠ” μ΄λ¦„μœΌλ‘œ μƒμ„±ν•˜μ˜€λ‹€. 이 ν΄λž˜μŠ€λŠ” κΈ°λ³Έ μ„€κ³„λ„μ΄λ―€λ‘œ μ„ μˆ˜μ˜ μ΄λ¦„μ΄λ‚˜ λ“±λ²ˆν˜Έκ°€ 아직 ν• λ‹Ήλ˜μ§€ μ•Šμ•˜λ‹€. μ‹€μ œλ‘œ μΈμŠ€ν„΄μŠ€λ₯Ό μ‚¬μš©ν•˜κΈ° μœ„ν•΄μ„œλŠ” μ΄λŸ¬ν•œ 정보λ₯Ό ν• λ‹Ήν•œ μƒνƒœλ‘œ μ‚¬μš©ν•΄μ•Ό ν•œλ‹€.

  • ν΄λž˜μŠ€μ—μ„œ μΈμŠ€ν„΄μŠ€λ₯Ό ν˜ΈμΆœν•˜λŠ” 방법은 μœ„μ˜ 사진과 κ°™λ‹€. λ¨Όμ € 클래슀 이름을 ν˜ΈμΆœν•˜κ³ , μ•žμ—μ„œ μ •μ˜ν–ˆλ˜ __ init() __ ν•¨μˆ˜μ˜ λ§€κ°œλ³€μˆ˜μ— λ§žμΆ”μ–΄ 값을 μž…λ ₯ν•œλ‹€.
  • 이것은 ν•¨μˆ˜μ—μ„œ 배운 μ΄ˆκΉƒκ°’ 지정과 같은 κ°œλ…μ΄λ‹€. μ—¬κΈ°μ„œ self λ³€μˆ˜μ—λŠ” μ•„λ¬΄λŸ° 값도 ν• λ‹Ήν•˜μ§€ μ•ŠλŠ”λ‹€.
  • jinhyunμ΄λΌλŠ” μ΄λ¦„μ˜ μΈμŠ€ν„΄μŠ€κ°€ SoccerPlayerλΌλŠ” 클래슀λ₯Ό 기반으둜 μƒμ„±λ˜λŠ” 것을 확인할 수 μžˆλ‹€. 이 jinhyunμ΄λΌλŠ” μΈμŠ€ν„΄μŠ€ μžμ²΄κ°€ SoccerPlayer ν΄λž˜μŠ€μ—μ„œ self에 ν• λ‹Ήλœλ‹€.

μ‹€μ œ μ½”λ“œ

# 전체 SoccerPlayer μ½”λ“œ
class SoccerPlayer(object):
    def __init__(self, name, position, back_number):
        self.name = name
        self.position = position
        self.back_number = back_number
    def change_back_number(self, new_number):
        print("μ„ μˆ˜μ˜ λ“±λ²ˆν˜Έλ₯Ό λ³€κ²½ν•œλ‹€: From %d to %d" % (self.back_number, new_
number))
        self.back_number = new_number
    def __str__(self):
        return "Hello, My name is %s. I play in %s in center." % (self.name,
self.position) 

# SoccerPlayerλ₯Ό μ‚¬μš©ν•˜λŠ” instance μ½”λ“œ 
jinhyun = SoccerPlayer("Jinhyun", "MF", 10)

print("ν˜„μž¬ μ„ μˆ˜μ˜ λ“±λ²ˆν˜ΈλŠ”:", jinhyun.back_number)
jinhyun.change_back_number(5)
print("ν˜„μž¬ μ„ μˆ˜μ˜ λ“±λ²ˆν˜ΈλŠ”:", jinhyun.back_number)
#μ‹€ν–‰ κ²°κ³Ό

ν˜„μž¬ μ„ μˆ˜μ˜ λ“±λ²ˆν˜ΈλŠ”: 10                    #16ν–‰ μ‹€ν–‰ κ²°κ³Ό
μ„ μˆ˜μ˜ λ“±λ²ˆν˜Έλ₯Ό λ³€κ²½ν•œλ‹€: From 10 to 5      #17ν–‰ μ‹€ν–‰ κ²°κ³Ό
ν˜„μž¬ μ„ μˆ˜μ˜ λ“±λ²ˆν˜ΈλŠ”: 5                     #18ν–‰ μ‹€ν–‰ κ²°κ³Ό
  • jinhyun = SoccerPlayer("Jinhyun", "MF", 10) μ½”λ“œλ‘œ μΈμŠ€ν„΄μŠ€λ₯Ό μƒˆλ‘­κ²Œ λ§Œλ“€μ—ˆλ‹€. λ§Œλ“€μ–΄μ§„ μΈμŠ€ν„΄μŠ€μΈ jinhyun은 name, position, back_number에 각각 Jinhyun, MF, 10이 ν• λ‹Ήλ˜μ—ˆλ‹€. ν• λ‹Ήλœ 값을 λ§Œλ“€μ–΄μ§„ μΈμŠ€ν„΄μŠ€μ—μ„œ μ‚¬μš©ν•˜κΈ° μœ„ν•΄μ„œ jinhyun.back_number ν˜•μ‹μœΌλ‘œ μΈμŠ€ν„΄μŠ€ λ‚΄μ˜ 값을 ν˜ΈμΆœν•˜κ³  μžˆλ‹€.
  • μ—¬κΈ°μ„œ μ€‘μš”ν•œ 것은 μΈμŠ€ν„΄μŠ€κ°€ μƒμ„±λœ ν›„μ—λŠ” ν•΄λ‹Ή μΈμŠ€ν„΄μŠ€μ˜ μ΄λ¦„μœΌλ‘œ 값을 ν• λ‹Ήν•˜κ±°λ‚˜ ν•¨μˆ˜λ₯Ό λΆ€λ₯΄λ©΄ λ˜μ§€λ§Œ, 클래슀 λ‚΄μ—μ„œλŠ” self둜 ν˜ΈμΆœλœλ‹€. 즉, μƒμ„±λœ μΈμŠ€ν„΄μŠ€μΈ jinhyunκ³Ό 클래슀 λ‚΄ selfκ°€ 같은 역할을 ν•˜λŠ” 것이닀.
  • ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•  λ•Œλ„ μΈμŠ€ν„΄μŠ€μ˜ 이름과 ν•¨μˆ˜λͺ…을 μ‚¬μš©ν•œλ‹€. μ—¬κΈ°μ„œλŠ” jinhyun. change_back_number(5) λ₯Ό μ‚¬μš©ν•΄ 클래슀 λ‚΄μ˜ ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ˜€λ‹€. μœ„μ˜ μ½”λ“œμ— μ΄μ–΄μ„œ 19ν–‰μœΌλ‘œ print( jinhyun)을 μž…λ ₯ν•˜λ©΄ λ‹€μŒκ³Ό 같은 κ²°κ³Όκ°€ 좜λ ₯λœλ‹€.
Hello, My name is Jinhyun. I play in MF in center.
  • μƒμ„±λœ μΈμŠ€ν„΄μŠ€μΈ jinhyun을 print() ν•¨μˆ˜μ—μ„œ μ‚¬μš©ν–ˆμ„ λ•Œ λ‚˜νƒ€λ‚˜λŠ” 결과이닀.
  • μ΄λŠ” μœ„μ˜ μ½”λ“œμ˜ 10 , 11ν–‰μ—μ„œ 클래슀 λ‚΄ ν•¨μˆ˜λ‘œ μ„ μ–Έλ˜μ—ˆκΈ° λ•Œλ¬Έμ΄λ‹€. 10ν–‰μ—μ„œ __ str() __ ν•¨μˆ˜λ‘œ μ„ μ–Έλœ 뢀뢄이 print() ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜λ©΄ λ°˜ν™˜λ˜λŠ” ν•¨μˆ˜μ΄λ‹€.
  • μΈμŠ€ν„΄μŠ€μ˜ 정보λ₯Ό ν‘œμ‹œν•˜κ±°λ‚˜ ꡬ뢄할 λ•Œ __srt__문을 μ‚¬μš©ν•˜λ©΄ λœλ‹€.
  • 이처럼 μ˜ˆμ•½ ν•¨μˆ˜λŠ” νŠΉμ • μ‘°κ±΄μ—μ„œ μž‘λ™ν•˜λŠ” ν•¨μˆ˜λ‘œ μœ μš©ν•˜λ‹€.

클래슀λ₯Ό μ‚¬μš©ν•˜λŠ” 이유

  • 핡심은 μžμ‹ μ˜ μ½”λ“œλ₯Ό λ‹€λ₯Έ μ‚¬λžŒμ΄ μ†μ‰½κ²Œ μ‚¬μš©ν•  수 μžˆλ„λ‘ μ„€κ³„ν•˜κΈ° μœ„ν•¨μ΄λ‹€. λ§Œμ•½ λ‹¨μˆœνžˆ 데이터λ₯Ό μ €μž₯ν•˜κΈ° μœ„ν•œ μˆ˜λ‹¨μœΌλ‘œ μ‚¬μš©ν•œλ‹€λ©΄ 이차원 λ¦¬μŠ€νŠΈλ‚˜ Namedtuple ν˜•νƒœλ₯Ό μ‚¬μš©ν•΄λ„ λ¬Έμ œλŠ” μ—†λ‹€. κ·ΈλŸ¬λ‚˜ λ•Œλ‘œλŠ” μžμ‹ μ΄ λ§Œλ“  μ½”λ“œκ°€ 데이터 μ €μž₯뿐 μ•„λ‹ˆλΌ λ‹€λ₯Έ 역할을 ν•΄μ•Ό ν•  λ•Œλ„ μžˆλ‹€.
  • 즉, 데이터λ₯Ό λ³€ν™˜ν•˜κ±°λ‚˜ λ°μ΄ν„°λ² μ΄μŠ€μ— μ €μž₯ν•˜λŠ” λ“±μ˜ 역할이 ν•„μš”ν•  λ•Œκ°€ μžˆλ‹€. 이것을 λ¦¬μŠ€νŠΈμ™€ ν•¨μˆ˜λ‘œ 각각 λ§Œλ“€μ–΄ κ³΅μœ ν•˜λŠ” 것보닀 ν•˜λ‚˜μ˜ 객체둜 생성해 λ‹€λ₯Έ μ‚¬λžŒλ“€μ—κ²Œ λ°°ν¬ν•œ λ‹€λ©΄ μž‘μ—…μ΄ 훨씬 더 μ‰¬μ›Œμ§„λ‹€.
# 데이터
names = ["Messi", "Ramos", "Ronaldo", "Park", "Buffon"] 
positions = ["MF", "DF", "CF", "WF", "GK"]
numbers = [10, 4, 7, 13, 1]

# 이차원 리슀트
players = [[name, position, number] for name, position, number in zip(names, 
positions, numbers)]
print(players) 
print(players[0])

# 전체 SoccerPlayer μ½”λ“œ
class SoccerPlayer(object):
    def __init__(self, name, position, back_number):
         self.name = name
         self.position = position
         self .back_number = back_number
    def change_back_number(self, new_number):
         print("μ„ μˆ˜μ˜ λ“±λ²ˆν˜Έλ₯Ό λ³€κ²½ν•œλ‹€: From %d to %d" % (self .back_number, new_
number))
         self .back_number = new_number
    def __str__(self):
         return "Hello, My name is %s. I play in %s in center." % (self .name,
self.position)
  • λ˜ν•œ, μ½”λ“œλ₯Ό μ’€ 더 μ†μ‰½κ²Œ μ„ μ–Έν•  수 μžˆλ‹€λŠ” μž₯점도 μžˆλ‹€.
  • λ‹¨μˆœνžˆ 이차원 리슀트둜 μ„ μ–Έν•  수 μžˆλŠ” 것을 객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ˜ κ°œλ…μ„ μ μš©μ‹œμΌœ μ’€ 더 λͺ…ν™•ν•˜κ²Œ μ €μž₯된 데이터λ₯Ό 확인할 수 μžˆλ‹€. 특히 λ‹€λ₯Έ μ‚¬λžŒλ“€μ΄ κ²°κ³Όλ₯Ό μ‚¬μš©ν•  λ•Œ 이 데이터가 무엇을 μœ„ν•œ 데이터인지λ₯Ό λͺ…ν™•νžˆ μ•Œ 수 μžˆλ‹€.
# 클래슀-μΈμŠ€ν„΄μŠ€
player_objects = [SoccerPlayer(name, position, number) for name, position,
number in zip(names, positions, numbers)] 
print(player_objects[0])
[['Messi', 'MF', 10], ['Ramos’, ’DF', 4], ['Ronaldo', 'CF', 7], ['Park', 'WF', 13], 
['Buffon', 'GK', 1]]                     # 8ν–‰ μ‹€ν–‰ κ²°κ³Ό
['Messi', 'MF', 10]                      # 9ν–‰ μ‹€ν–‰ κ²°κ³Ό
Hello, My name is Messi. I play in MF in center. # 25ν–‰ μ‹€ν–‰ κ²°κ³Ό

 

μ‹€μŠ΅

λ…ΈνŠΈλΆ ν”„λ‘œκ·Έλž¨ λ§Œλ“€κΈ° 섀계

  • λ…ΈνŠΈλΆ ν”„λ‘œκ·Έλž¨ → 컴퓨터 ν˜•νƒœμ˜ λ…ΈνŠΈλΆμ„ λœ»ν•˜λŠ” 것이 μ•„λ‹ˆλΌ ν”νžˆ κ³΅μ±…μ˜ κΈ°λŠ₯으둜 μ‚¬μš©ν•˜λŠ” λ…ΈνŠΈ 앱을 λ§ν•œλ‹€.
  • 객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ„ μ΄μš©ν•˜μ—¬ ν”„λ‘œκ·Έλž¨μ„ λ§Œλ“€κΈ° μœ„ν•΄ κ°€μž₯ λ¨Όμ € ν•΄μ•Ό ν•  일은 ν”„λ‘œκ·Έλž¨ 섀계이닀.
    • 이 ν”„λ‘œκ·Έλž¨μ€ μ–΄λ–€ 객체가 ν•„μš”ν• κΉŒ?
    • μ–΄λ–€ κΈ°λŠ₯을 μ–΄λ–»κ²Œ μ •μ˜ν•΄ μ‚¬μš©ν•΄μ•Ό ν• κΉŒ?
    • μ–΄λ–€ 데이터λ₯Ό μ €μž₯ν•΄μ•Ό ν• κΉŒ?

μ‚¬μš©μžμ˜ μš”κ΅¬ 사항

  • λ…ΈνŠΈ(note)λ₯Ό μ •λ¦¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ΄λ‹€.
  • μ‚¬μš©μžλŠ” λ…ΈνŠΈμ— μ½˜ν…μΈ λ₯Ό 적을 수 μžˆλ‹€.
  • λ…ΈνŠΈλŠ” λ…ΈνŠΈλΆ(notebook)에 μ‚½μž…λœλ‹€.
  • λ…ΈνŠΈλΆμ€νƒ€μ΄ν‹€(title)μ΄μžˆλ‹€.
  • λ…ΈνŠΈλΆμ€ λ…ΈνŠΈκ°€ μ‚½μž…λ  λ•Œ νŽ˜μ΄μ§€λ₯Ό μƒμ„±ν•˜λ©°, μ΅œλŒ€ 300νŽ˜μ΄μ§€κΉŒμ§€ μ €μž₯ν•  수 μžˆλ‹€.
  • 300νŽ˜μ΄μ§€λ₯Ό λ„˜κΈ°λ©΄ λ…ΈνŠΈλ₯Ό 더이상 μ‚½μž…ν•˜μ§€ λͺ»ν•œλ‹€.

μš°λ¦¬κ°€ λ§Œλ“€μ–΄μ•Ό ν•˜λŠ” 객체에 λŒ€ν•œ 정보가 μžˆλŠ”λ°, μ‚¬μš©μž, λ…ΈνŠΈ, λ…ΈνŠΈλΆ 등이 객체가 λœλ‹€.

μ €μž₯ν•˜λŠ” 데이터, 즉 λ³€μˆ˜ μ •μ˜

  • κ°€μž₯ 기본적인 것은 μž…λ ₯ν•΄μ•Ό ν•  μ½˜ν…μΈ κ°€ 있고, λ…ΈνŠΈλ§ˆλ‹€ 페 이지가 μƒμ„±λ˜μ–΄μ•Ό ν•œλ‹€. 또 λ…ΈνŠΈλΆμ€ λ…ΈνŠΈλΌκ³  ν•˜λŠ” 객체와 타이틀을 포함해야 ν•œλ‹€.

κΈ°λŠ₯function에 λŒ€ν•œ μ •μ˜

  • λ…ΈνŠΈλΆμ˜ μž…μž₯κ³Ό λ…ΈνŠΈμ˜ μž…μž₯
  • 즉 각각의 κ°μ²΄λ³„λ‘œ κΈ°λŠ₯을 μ •μ˜ν•΄μ•Ό ν•œλ‹€. λ…ΈνŠΈλŠ” λ‚΄μš©μ„ μž…λ ₯ν•˜λŠ” ν•¨μˆ˜μ™€ μ§€μš°λŠ” ν•¨μˆ˜κ°€ ν•„μš”ν•˜λ‹€. 그리고 λ…ΈνŠΈλΆμ€ λ…ΈνŠΈλ₯Ό μΆ”κ°€ν•˜κ±°λ‚˜ μ§€μš°λŠ” λ“±μ˜ ν•¨μˆ˜κ°€ ν•„μš”ν•˜λ‹€.
  • κ·Έ μ™Έ 300νŽ˜μ΄μ§€ 등에 λŒ€ν•œ λ‘œμ§μ„ λ”°λ‘œ μ •μ˜ν•˜μ—¬ ν•¨μˆ˜ μ•ˆμ— λ„£μ–΄μ•Ό ν•œ λ‹€.

ꡬ뢄 Notebook Note

λ©”μ„œλ“œ add_note , remove_note get_number_of_pages write_content, remove_all
λ³€μˆ˜ title  
page_number    
notes contents  

μƒˆλ‘œμš΄ Notebook을 μƒμ„±ν•˜λŠ” μ½”λ“œ

>>> wise_saying_notebook = NoteBook("λͺ…μ–Έ λ…ΈνŠΈ") 
>>> wise_saying_notebook.add_note(note_1)
>>> wise_saying_notebook.add_note(note_2)
>>> wise_saying_notebook.add_note(note_3)
>>> wise_saying_notebook.add_note(note_4)
  • μƒˆλ‘œμš΄ λ…ΈνŠΈλΆμ„ μƒμ„±ν•œ ν›„ 기쑴의 Note듀을 add_note() ν•¨μˆ˜λ‘œ μΆ”κ°€ν•œλ‹€.
>>> wise_saying_notebook = NoteBook("λͺ…μ–Έ λ…ΈνŠΈ") 
>>> wise_saying_notebook.add_note(note_1)
>>> wise_saying_notebook.add_note(note_2)
>>> wise_saying_notebook.add_note(note_3)
>>> wise_saying_notebook.add_note(note_4)
>>> print(wise_saying_notebook.get_number_of_all_pages())
4
>>> print(wise_saying_notebook.get_number_of_all_characters()) 
159
  • Note 4μž₯을 μΆ”κ°€ν•˜μ˜€μœΌλ―€λ‘œ get_number_of_all_pages( ) ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜λ©΄ 총 νŽ˜μ΄μ§€ μˆ˜κ°€ 좜λ ₯되고, get_number_of_all characters() ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜λ©΄ 총 κΈ€μž μˆ˜κ°€ 좜λ ₯λœλ‹€.
>>> wise_saying_notebook.remove_note(3)
>>> print(wise_saying_notebook.get_number_of_all_pages()) 
3
>>>
>>> wise_saying_notebook.add_note(note_1, 100)
ν•΄λ‹Ή νŽ˜μ΄μ§€μ—λŠ” 이미 λ…ΈνŠΈκ°€ μ‘΄μž¬ν•©λ‹ˆλ‹€.
>>>
>>> for i in range(300):
...   wise_saying_notebook.add_note(note_1, i)
ν•΄λ‹Ή νŽ˜μ΄μ§€μ—λŠ” 이미 λ…ΈνŠΈκ°€ μ‘΄μž¬ν•©λ‹ˆλ‹€.
ν•΄λ‹Ή νŽ˜μ΄μ§€μ—λŠ” 이미 λ…ΈνŠΈκ°€ μ‘΄μž¬ν•©λ‹ˆλ‹€.
ν•΄λ‹Ή νŽ˜μ΄μ§€μ—λŠ” 이미 λ…ΈνŠΈκ°€ μ‘΄μž¬ν•©λ‹ˆλ‹€.
ν•΄λ‹Ή νŽ˜μ΄μ§€μ—λŠ” 이미 λ…ΈνŠΈκ°€ μ‘΄μž¬ν•©λ‹ˆλ‹€.
>>> print(wise_saying_notebook.get_number_of_all_pages()) 
300
  • λ…ΈνŠΈμ˜ μ‚­μ œλ‚˜ 좔가도 μ—¬λŸ¬ 가지 λͺ…λ Ήμ–΄λ‘œ κ°€λŠ₯ν•˜λ‹€.
  • νŠΉμ • Noteλ₯Ό μ§€μš°λŠ” remove_note()λ₯Ό μ‚¬μš©ν•˜κ±°λ‚˜ 객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ° κ°œλ…μœΌλ‘œ μƒˆλ‘œμš΄ 빈 λ…ΈνŠΈλ₯Ό μž„μ˜λ‘œ μΆ”κ°€ν•  μˆ˜λ„ μžˆλ‹€. κΈ°μ‘΄ νŽ˜μ΄μ§€μ— λ…ΈνŠΈλ₯Ό μΆ”κ°€ν•˜λ €κ³  ν•˜λ©΄ 였λ₯˜ λ©”μ‹œμ§€λ„ 좜λ ₯λœλ‹€.

객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ˜ νŠΉμ§•

  • 객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ€ 절차적인 ν”„λ‘œκ·Έλž˜λ°κ³Ό 비ꡐ해 μ—¬λŸ¬ 가지 νŠΉμ§•μ΄ μžˆλ‹€.
  • 객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ˜ κΈ°λ³Έ μ² ν•™μ—λŠ” μ‹€μƒν™œμ„ λͺ¨λΈλ§ν•œλ‹€λŠ” κ°œλ…μ΄ 있기 λ•Œλ¬Έμ— λŒ€λΆ€λΆ„μ΄ μ‹€μƒν™œμ— μ‘΄μž¬ν•˜λŠ” λ‹€μ–‘ν•œ κ°œλ…μ„ μ‰½κ²Œ ν”„λ‘œκ·Έλž˜λ°ν•˜κΈ° μœ„ν•œ νŠΉμ§•λ“€μ΄λ‹€. 객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ˜ νŠΉμ§•μ—λŠ” 크게 상속, λ‹€ν˜•μ„±, κ°€μ‹œμ„±μ΄ μžˆλ‹€. λͺ¨λ‘ 객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ°λΏλ§Œ μ•„λ‹ˆλΌ μ™„μ„±λœ 파이썬 ν”„λ‘œκ·Έλž˜λ°μ„ ν•˜λŠ”λ°λ„ 맀우 μ€‘μš”ν•œ κ°œλ…μ΄λ‹€.

상속

  • 상속(inheritance)은 이름 κ·ΈλŒ€λ‘œ 무엇인가λ₯Ό λ‚΄λ €λ°›λŠ” 것을 λœ»ν•œλ‹€.
  • λΆ€λͺ¨ν΄λž˜μŠ€μ— μ •μ˜λœ 속성과 λ©”μ„œλ“œλ₯Ό μžμ‹ ν΄λž˜μŠ€κ°€ λ¬Όλ €λ°›μ•„ μ‚¬μš©ν•œλ‹€λŠ” 것이닀.
class Person(object): 
    pass
  • classλΌλŠ” μ˜ˆμ•½μ–΄ λ‹€μŒμ— 클래슀λͺ…μœΌλ‘œ Person을 μ“°κ³  () μ•ˆμ— objectλ₯Ό μž…λ ₯ν•˜μ˜€λ‹€. μ—¬κΈ°μ„œ objectκ°€ λ°”λ‘œ Person 클래슀의 λΆ€λͺ¨ ν΄λž˜μŠ€μ΄λ‹€.
  • objectλŠ” νŒŒμ΄μ¬μ—μ„œ μ‚¬μš©ν•˜λŠ” κ°€μž₯ κΈ°λ³Έ 객체 base object 이며, 파이썬 μ–Έμ–΄κ°€ 객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ΄λ―€λ‘œ λͺ¨λ“  λ³€μˆ˜λŠ” 객체이닀. 예λ₯Ό λ“€μ–΄ 파이썬의 λ¬Έμžμ—΄ν˜• λ³€μˆ˜μ— λŒ€ν•΄ λ‹€μŒκ³Ό 같이 객체 이름을 확인할 수 μžˆλ‹€.
>>> a = "abc" 
>>> type(a) 
<class 'str'>

객체 μžμ„Ένžˆ μ•Œμ•„λ³΄κΈ°

  • μ§€κΈˆκΉŒμ§€ λ¬Έμžμ—΄ν˜•μ΄λΌκ³  λΆˆλ €μ§€λ§Œ λ‚΄λΆ€μ μœΌλ‘œλŠ” 객체둜 μ²˜λ¦¬λ˜μ—ˆλ‹€. 파이썬의 λͺ¨λ“  κ°μ²΄λŠ” object 객체λ₯Ό μƒμ†ν•œλ‹€.
  • 객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ—μ„œ 상속은 λΆ€λͺ¨ ν΄λž˜μŠ€λ‘œλΆ€ν„° κ°’κ³Ό λ©”μ„œλ“œλ₯Ό λ¬Όλ €λ°›μ•„ μžμ‹ 클래슀λ₯Ό μƒμ„±ν•œλ‹€λŠ” λœ»μ΄λ‹€. 즉, μžμ‹μ΄ λΆ€λͺ¨μ˜ νŠΉμ„±μ„ κ·ΈλŒ€λ‘œ ν¬ν•¨ν•œ 채 μƒμ„±λ˜λŠ” 것이닀.
>>> class Person(object):
...     def __init__(self, name, age):
...         self.name = name
...         self.age = age

>>> class Korean(Person):
        pass
>>> first_korean = Korean("Sungchul", 35) 
>>> print(first_korean.name)
Sungchul
  • 이 μ½”λ“œμ—μ„œλŠ” λ¨Όμ € Person 클래슀λ₯Ό μƒμ„±ν•˜μ˜€λ‹€.
  • Person ν΄λž˜μŠ€μ—λŠ” μƒμ„±μž init() ν•¨μˆ˜λ₯Ό λ§Œλ“€μ–΄ nameκ³Ό age에 κ΄€λ ¨λœ 정보λ₯Ό μž…λ ₯ν•  수 μžˆλ„λ‘ ν•˜μ˜€λ‹€.
  • λ‹€μŒμœΌλ‘œ Korean 클래슀λ₯Ό λ§Œλ“€λ©΄μ„œ Person 클래슀λ₯Ό μƒμ†λ°›μ•˜λ‹€. class Korean(Person)κ³Ό 같이 μž‘μ„±ν•˜λ©΄ κ°„λ‹¨νžˆ 상속 받을 수 μžˆλ‹€. 그리고 passλŠ” λ³„λ„μ˜ λ‚΄μš© 없이 클래슀만 μ‘΄μž¬ν•œλ‹€λŠ” λœ»μ΄λ‹€.
  • 즉, λ³„λ„μ˜ λ‚΄μš©μ΄ μ—†λŠ” Korean 클래슀 μΈμŠ€ν„΄μŠ€λ₯Ό λ§Œλ“  것이닀. Korean ν΄λž˜μŠ€λŠ” λ³„λ„μ˜ μƒμ„±μžλŠ” μ—†μ§€λ§Œ, Person ν΄λž˜μŠ€κ°€ 가진 μƒμ„±μžλ₯Ό κ·ΈλŒ€λ‘œ μ‚¬μš©ν•˜μ—¬ μΈμŠ€ν„΄μŠ€λ₯Ό λ§Œλ“€μ—ˆλ‹€. κ·Έλž˜μ„œ Person ν΄λž˜μŠ€μ—μ„œ μƒμ„±ν•œ λ³€μˆ˜λ₯Ό κ·ΈλŒ€λ‘œ μ‚¬μš©ν•  수 μžˆλ‹€. μ΄λŸ¬ν•œ 객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ˜ νŠΉμ§•μ„ 상속이라고 ν•œλ‹€.

  • 상속을 λ„ν‘œλ‘œ ν‘œν˜„ν•˜λ©΄ μœ„μ™€ κ°™λ‹€. μ‚¬κ°ν˜•μ΄ 클래슀이고, ν™”μ‚΄ν‘œλŠ” 각 클래슀의 상속 관계이닀. 즉, Person 클래슀λ₯Ό Employeeκ°€ 상속받고, 이 클래슀λ₯Ό λ‹€μ‹œ ν•œλ²ˆ Manager, Staff, Hourly 등이 μƒμ†λ°›λŠ” 것이닀.
  • 일반적으둜 상속을 ν•˜κ²Œ 되면 λΆ€λͺ¨ ν΄λž˜μŠ€λ³΄λ‹€ μžμ‹ 클래슀의 정보가 더 κ΅¬μ²΄ν™”λœλ‹€. 객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ°μœΌλ‘œ ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•  λ•Œ μ΄λŸ¬ν•œ 상속 ꡬ쑰λ₯Ό 섀계해야 ν•œλ‹€.
  • 특히 상속이 μ§„ν–‰λ μˆ˜λ‘ λΆ€λͺ¨ ν΄λž˜μŠ€μ— λŒ€ν•΄ 각 클래슀의 κΈ°λŠ₯이 κ΅¬μ²΄ν™”λ˜λ„λ‘ λΆ€λͺ¨ κ°μ²΄μ—λŠ” 일반적인 κΈ°λŠ₯을, μžμ‹ κ°μ²΄μ—λŠ” μƒμ„Έν•œ κΈ°λŠ₯을 λ„£μ–΄μ•Ό ν•œλ‹€.
  • 그리고 같은 일을 ν•˜λŠ” λ©”μ„œλ“œλΌ ν•˜λ”λΌλ„ λΆ€λͺ¨ 객체보닀 μžμ‹ 객체에 μ’€ 더 λ§Žμ€ 정보λ₯Ό 쀄 μˆ˜λ„ μžˆλ‹€. 이λ₯Ό ‘λΆ€λͺ¨ 클래슀의 λ©”μ„œλ“œλ₯Ό μž¬μ •μ˜ν•œλ‹€’라고 ν•œλ‹€.
class Person(object):      #λΆ€λͺ¨ 클래슀 Person μ„ μ–Έ
    def __init__(self, name, age, gender):
        self.name = name
        self.age = age
        self.gender = gender

    def about_me(self):    #λ©”μ„œλ“œ μ„ μ–Έ
        print("μ €μ˜ 이름은", self.name, "μ΄κ³ μš”, 제 λ‚˜μ΄λŠ”", str(self.age), "μ‚΄μž…λ‹ˆλ‹€.")
  • λ¨Όμ € λΆ€λͺ¨ ν΄λž˜μŠ€κ°€ Person이닀. name, age, gender에 λŒ€ν•΄ λ³€μˆ˜λ₯Ό μ„ μ–Έν•˜μ˜€κ³ , about_ me ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ μƒμ„±λœ μΈμŠ€ν„΄μŠ€κ°€ μžμ‹ μ„ μ„€λͺ…ν•  수 μžˆλ„λ‘ ν•˜μ˜€λ‹€. 사싀 str() ν•¨μˆ˜μ— 듀어가도 λ˜λŠ” ν΄λž˜μŠ€μ΄μ§€λ§Œ μž„μ˜μ˜ about_me 클래슀λ₯Ό μƒμ„±ν•˜μ˜€λ‹€.

λ‹€μŒμœΌλ‘œ 상속 λ°›λŠ” Employee 클래슀

class Employee(Person):            # λΆ€λͺ¨ 클래슀 PersonμœΌλ‘œλΆ€ν„° 상속 
    def __init__(self, name, age, gender, salary, hire_date):
        super().__init__(name,age,gender) # λΆ€λͺ¨κ°μ²΄μ‚¬μš© 
        self.salary = salary
        self.hire_date = hire_date       #속성값 μΆ”κ°€

    def do_work(self):                    #μƒˆλ‘œμš΄ λ©”μ„œλ“œ μΆ”κ°€
        print("μ—΄μ‹¬νžˆ μΌμ„ν•œλ‹€.")     
     
    def about_me(self):                   #λΆ€λͺ¨ 클래슀 ν•¨μˆ˜ μž¬μ •μ˜
        super().about_me()                #λΆ€λͺ¨ 클래슀 ν•¨μˆ˜ μ‚¬μš©
        print ("제 κΈ‰μ—¬λŠ”", self.salary, "원이고, 제 μž…μ‚¬μΌμ€", self.hire_date, "μž…λ‹ˆλ‹€.")
  • Person ν΄λž˜μŠ€κ°€ λ‹¨μˆœνžˆ μ‚¬λžŒμ— λŒ€ν•œ 정보λ₯Ό μ •μ˜ν–ˆλ‹€λ©΄, Employee ν΄λž˜μŠ€λŠ” μ‚¬λžŒμ— λŒ€ν•œ μ •μ˜μ™€ ν•¨κ»˜ μΌν•˜λŠ” μ‹œκ°„κ³Ό 월급에 λŒ€ν•œ λ³€μˆ˜λ₯Ό μΆ”κ°€ν•œλ‹€. 즉 init() ν•¨μˆ˜λ₯Ό μž¬μ •μ˜ ν•œλ‹€.
  • μ΄λ•Œ λΆ€λͺ¨ 클래슀의 init () ν•¨μˆ˜λ₯Ό κ·ΈλŒ€λ‘œ μ‚¬μš©ν•˜λ €λ©΄ λ³„λ„μ˜ init() ν•¨μˆ˜λ₯Ό λ§Œλ“€μ§€ μ•Šμ•„λ„ λœλ‹€. ν•˜μ§€λ§Œ κΈ°μ‘΄ ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜λ©΄μ„œ μƒˆλ‘œμš΄ λ‚΄μš©μ„ μΆ”κ°€ν•˜κΈ° μœ„ν•΄μ„œλŠ” μžμ‹ ν΄λž˜μŠ€μ— init() ν•¨μˆ˜λ₯Ό 생성할 λ•Œ super().init(λ§€κ°œλ³€μˆ˜) 라고 μž…λ ₯ν•œλ‹€.
  • μ—¬κΈ°μ„œ super()λŠ” λΆ€λͺ¨ 클래슀λ₯Ό 가리킨닀. 즉, λΆ€λͺ¨ 클래슀의 __ init()__ ν•¨μˆ˜λ₯Ό κ·ΈλŒ€λ‘œ μ‚¬μš©ν•œλ‹€λŠ” λœ»μ΄λ‹€. 그리고 κ·Έ μ•„λž˜μ—λŠ” μžμ‹ ν΄λž˜μŠ€μ—μ„œ ν•„μš”ν•œ μƒˆλ‘œμš΄ λ³€μˆ˜λ₯Ό μΆ”κ°€ν•˜λ©΄ λœλ‹€.
  • μ΄λŸ¬ν•œ ν•¨μˆ˜μ˜ μž¬μ •μ˜λ₯Ό μ˜€λ²„λΌμ΄λ”©( overriding)이라고 ν•œλ‹€. μ˜€λ²„λΌμ΄λ”©μ€ 상속 μ‹œ ν•¨μˆ˜ 이름과 ν•„μš”ν•œ λ§€κ°œλ³€μˆ˜λŠ” κ·ΈλŒ€λ‘œ μœ μ§€ν•˜λ©΄μ„œ ν•¨μˆ˜μ˜ μˆ˜ν–‰ μ½”λ“œλ₯Ό λ³€κ²½ν•˜λŠ” 것이닀.
  • 같은 λ°©μ‹μœΌλ‘œ about_me() ν•¨μˆ˜κ°€ μ˜€λ²„λΌμ΄λ”©λœ 것을 확인할 수 μžˆλ‹€. Personκ³Ό Employee에 λŒ€ν•œ μ„€λͺ…을 μΆ”κ°€ν•œ 것이닀. μœ„ μ½”λ“œλ“€μ€ μ„€λͺ…μ˜ μš©μ΄μ„±μ„ μœ„ν•΄ ν…μŠ€νŠΈ ν˜•νƒœμ˜ μ„€λͺ…λ§Œ μΆ”κ°€ν•˜μ˜€μ§€λ§Œ μ‹€μ œλ‘œλŠ” ν”„λ‘œκ·Έλž¨μ— μ‚¬μš©ν•˜κΈ° μœ„ν•œ λ‹€μ–‘ν•œ κΈ°λŠ₯이 좔가될 수 μžˆλ‹€.
  • do_work처럼 μžμ‹ ν΄λž˜μŠ€μ—λ§Œ ν•„μš”ν•œ μƒˆλ‘œμš΄ ν•¨μˆ˜λ₯Ό 생성할 μˆ˜λ„ μžˆλ‹€. μ•žμ„œ μ„€λͺ…ν–ˆλ“―이 자 식 ν΄λž˜μŠ€λŠ” λΆ€λͺ¨ ν΄λž˜μŠ€λ³΄λ‹€ 더 μƒμ„Έν•œ 일을 ν•œλ‹€. λ”°λΌμ„œ μžμ‹ ν΄λž˜μŠ€κ°€ μƒˆλ‘œμš΄ κΈ°λŠ₯을 μˆ˜ν–‰ν•  수 μžˆλ„λ‘ μ½”λ“œλ₯Ό μž‘μ„±ν•΄μ•Ό ν•œλ‹€.
  • νŒŒμ΄μ¬μ—μ„œλŠ” 이외에도 λ‹€μ–‘ν•œ 상속 κΈ°λŠ₯을 μ§€μ›ν•œλ‹€. 예λ₯Ό λ“€μ–΄, 1개 μ΄μƒμ˜ 클래슀 νŠΉμ§•μ„ μƒμ†ν•˜λŠ” 닀쀑상속을 μ§€μ›ν•˜κΈ°λ„ ν•œλ‹€. μ΄λŸ¬ν•œ 세뢀적인 κΈ°λŠ₯은 νŒŒμ΄μ¬μ„ μ‚¬μš©ν•˜μ—¬ 본격적인 객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ„ ν•  λ•Œ ν•„μš”ν•˜λ‹€.

λ‹€ν˜•μ„±

  • λ‹€ν˜•μ„± (polymorphism)은 같은 μ΄λ¦„μ˜ λ©”μ„œλ“œκ°€ λ‹€λ₯Έ κΈ°λŠ₯을 ν•˜λŠ” 것을 λ§ν•œλ‹€. 사싀 이 κΈ°λŠ₯은 μƒμ†μ—μ„œ 이미 ν™•μΈν•˜μ˜€λ‹€. 예λ₯Ό λ“€μ–΄, about_meλΌλŠ” ν•¨μˆ˜λ₯Ό λΆ€λͺ¨ ν΄λž˜μŠ€μ™€ μžμ‹ ν΄λž˜μŠ€κ°€ μ„œλ‘œ λ‹€λ₯΄κ²Œ κ΅¬ν˜„ν–ˆλŠ”λ°, 이것도 μΌμ’…μ˜ λ‹€ν˜•μ„±μ΄λ‹€.

λ‹€ν˜•μ„±μ„ μ‚¬μš©ν•˜λŠ” 이유

  • 객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ„ μ‚¬μš©ν•˜λŠ” 이유λ₯Ό μƒκ°ν•˜λ©΄ κ°„λ‹¨ν•˜λ‹€. 객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ€ λ‹€λ₯Έ μ‚¬λžŒμ˜ μ½”λ“œλ₯Ό μ‰½κ²Œ μž¬μ‚¬μš©ν•˜κΈ° μœ„ν•΄ μ‚¬μš©ν•œλ‹€κ³  μ–ΈκΈ‰ν•˜μ˜€λ‹€. 이λ₯Ό μœ„ν•΄μ„œλŠ” 내뢀적인 κ΅¬ν˜„ 과정은 잘 λͺ¨λ₯΄λ”라도 κ·Έ ν•¨μˆ˜λ‚˜ 클래슀의 역할은 λͺ…ν™•νžˆ μ•Œ ν•„μš”κ°€ μžˆλ‹€.
  • μΈν„°λ„·μ—μ„œ 데이터λ₯Ό λͺ¨μœΌλŠ” ν”„λ‘œκ·Έλž¨μ„ 크둀러 crawler라고 ν•˜λŠ”λ°. μ΄λ²ˆμ—λŠ” λ‰΄μŠ€λ₯Ό λͺ¨μœΌλŠ” 크둀러λ₯Ό λ§Œλ“€μ–΄λ³΄λ©΄μ„œ μ„€λͺ…ν•˜κ² λ‹€.
  • λ¨Όμ € λΆ€λͺ¨ Crawler 클래슀λ₯Ό λ§Œλ“€κ³  do_crawling이라 λŠ” ν•¨μˆ˜λ₯Ό μƒμ„±ν•œλ‹€. 그리고 Crawler 클래슀λ₯Ό μƒμ†μ‹œμΌœ NaverCrawler와 DaumCrawlerλ₯Ό λ§Œλ“ λ‹€. 이제 두 μžμ‹ ν΄λž˜μŠ€λŠ” λͺ¨λ‘ do_crawling ν•¨μˆ˜λ₯Ό κ°–κ²Œ λœλ‹€.
  • 같은 μ΄λ¦„μ΄μ§€λ§Œ κ΅¬ν˜„ λ‚΄μš©μ€ λ‹€λ₯΄λ‹€. 각각 ν΄λž˜μŠ€μ—μ„œ κ΅¬ν˜„λ˜λŠ” λ‚΄λΆ€ λ‘œμ§μ— 차이가 μžˆλŠ”λ°, 이λ₯Ό ν•¨μˆ˜μ˜ λ‹€ν˜•μ„±μ΄λΌκ³  ν•œλ‹€. μ—¬κΈ°μ„œ Crawler ν΄λž˜μŠ€λ“€μ˜ do_crawling ν•¨μˆ˜λŠ” 각각 넀이버와 λ‹€μŒμ—μ„œ λ‰΄μŠ€λ₯Ό κ°€μ Έμ˜€λŠ” 역할을 ν•œλ‹€. ν•΄λ‹Ή 클래슀의 μ‚¬μš©μžλŠ” 데이터λ₯Ό μ–΄λ–»κ²Œ κ°€μ Έμ˜€λŠ”μ§€ λͺ¨λ₯΄μ§€λ§Œ κ²°κ³ΌλŠ” 두 클래슀 λͺ¨λ‘ κ°™λ‹€λŠ” 것을 μ•Œ 수 μžˆλ‹€.
n_crawler = NaverCrawler()
d_crawler = DaumCrawler()
cralwers = [n_crawler, d_crawler]
news=[]
for cralwer in cralwers:
    news.append(cralwer.do_crawling())
  • ν•΄λ‹Ή 클래슀의 μ‚¬μš©μž μž…μž₯μ—μ„œλŠ” ν•¨μˆ˜μ˜ μ΄λ¦„λ§Œ μ•Œλ©΄ 같은 ν˜•νƒœλ‘œ μ‚¬μš©ν•  수 μžˆμ§€λ§Œ, 클래슀의 개발자 μž…μž₯μ—μ„œλŠ” 내뢀적인 κ΅¬ν˜„μ„ 각 ν΄λž˜μŠ€λ³„ λ‹€λ₯΄κ²Œ κ°œλ°œν•  ν•„μš”κ°€ μžˆλ‹€.
  • 이λ₯Ό λ‹€ν˜•μ„±μ΄λΌκ³  ν•˜λŠ”λ°, λ‹€ν˜•μ„±μ„ μ‚¬μš©ν•˜λ©΄ ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•  λ•Œ μ‚¬μš©μžκ°€ μ’€ 더 μ‰½κ²Œ 클래슀λ₯Ό μ‚¬μš© ν•  수 μžˆλ‹€.
class Animal:
    def __init__(self, name):
        self.name = name
    def talk(self):
        raise NotlmplementedErrorC’Subclass must implement abstract method")
 
class Cat(Animal):
    def talk(self):
        return 'Meow!'
 
class Dog(Animal):
    def talk(self):
        return 'Woof! Woof!'
 
animals=[Cat('Missy'), Cat('Mr.Mistoffelees'), Dog('Lassie')]
for animal in animals:
    print(animal.name + ':' + animal.talk())
#15~17ν–‰ μ‹€ν–‰ κ²°κ³Ό

Missy: Meow!
Mr. Mistoffelees: Meow! 
Lassie: Woof! Woof!
  • μœ„ μ½”λ“œλŠ” μ˜μ‚¬μ½”λ“œλ‘œ μ‹€μ œ μž‘λ™λ˜μ§€λŠ” μ•Šκ³  단지 λ‹€ν˜•μ„±μ„ μ„€λͺ… ν•˜κΈ° μœ„ν•΄ λ§Œλ“  μ½”λ“œμ΄λ‹€.
  • μ½”λ“œμ—μ„œ λΆ€λͺ¨ ν΄λž˜μŠ€λŠ” Animal이며, Catκ³Ό DogλŠ” Animal 클래슀λ₯Ό μƒμ†λ°›λŠ”λ‹€. 핡심 ν•¨μˆ˜λŠ” talk둜, 각각 두 동물 클래슀의 역할이 λ‹€λ₯Έ 것을 확인할 수 μžˆλ‹€. Animal ν΄λž˜μŠ€λŠ” 아직 μ„€λͺ…ν•˜μ§€ μ•Šμ•˜μ§€λ§Œ NotlmplementedErrorλΌλŠ” 클래슀λ₯Ό ν˜ΈμΆœν•œλ‹€. 이 ν΄λž˜μŠ€λŠ” μžμ‹ ν΄λž˜μŠ€μ—λ§Œ ν•΄λ‹Ή ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•  수 μžˆλ„λ‘ ν•œλ‹€. λ”°λΌμ„œ 두 ν΄λž˜μŠ€κ°€ λ‚΄λΆ€ λ‘œμ§μ—μ„œ 같은 μ΄λ¦„μ˜ ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ κ²°κ³Όλ₯Ό 좜λ ₯ν•˜λ„λ‘ ν•œλ‹€. μ •μ˜λœ λͺ¨λ“  ν΄λž˜μŠ€λŠ” 15γ€œ 17ν–‰κ³Ό 같이 μ‚¬μš©ν•  수 μžˆλ‹€.

κ°€μ‹œμ„±

  • κ°€μ‹œμ„±μ€ 객체의 정보λ₯Ό λ³Ό 수 μžˆλŠ” λ ˆλ²¨μ„ μ‘°μ ˆν•˜μ—¬ 객체의 정보 접근을 μˆ¨κΈ°λŠ” 것을 λ§ν•˜λŠ”λ°, 이 νŠΉμ§•μ€ λ‹€μ–‘ν•œ μ΄λ¦„μœΌλ‘œ 뢈리고 μžˆλ‹€.
  • νŒŒμ΄μ¬μ—μ„œλŠ” κ°€μ‹œμ„±μ΄λΌκ³  ν•˜μ§€λ§Œ μ’€ 더 μ€‘μš”ν•œ 핡심 κ°œλ…μ€ μΊ‘μŠν™”(encapsulation)와 정보 은닉 (information hiding)이닀.
  • νŒŒμ΄μ¬μ—μ„œλŠ” 객체의 μž¬μ‚¬μš©μ„ μœ„ν•΄ 각 객체가 무슨 역할을 ν•˜λŠ”μ§€ μ•Œμ•„μ•Ό ν•œλ‹€. ν•˜μ§€λ§Œ 그와 λ™μ‹œμ— κ΅¬ν˜„μ˜ 세뢀적인 λ‚΄μš©μ„ λͺ¨λ‘ μ•Œ ν•„μš”λŠ” μ—†λ‹€. 단지 μ‚¬μš©ν•˜λŠ” λ°©λ²•λ§Œ μ•Œλ©΄ λœλ‹€. 즉,객체의 λ§€κ°œλ³€μˆ˜ μΈν„°νŽ˜μ΄μŠ€λ§Œ λͺ…ν™•νžˆ μ•Œλ©΄ μ‚¬μš©ν•  수 μžˆλ‹€.
  • μ΄λŸ¬ν•œ κ°œλ…μ„ μΊ‘μŠν™”λΌκ³  ν•˜λ©°, 객체의 μ„ΈλΆ€ λ‚΄μš©μ€ λͺ¨λ₯Έ 채 객체의 μ‚¬μš©λ²•λ§Œ μ•Œκ³  μ‚¬μš©ν•œλ‹€λŠ” λœ»μ΄λ‹€. λ™μ‹œμ— ν•„μš”ν•œ μ •λ³΄λŠ” μˆ¨κ²¨μ•Ό ν•œλ‹€.
  • μΊ‘μŠν™” 와 μ •λ³΄μ€λ‹‰μœΌλ‘œ ν‘œν˜„μ€ λ‹€λ₯΄κ²Œ ν•˜μ§€λ§Œ λ‘˜ λ‹€ μ½”λ“œμ˜ λ‚΄λΆ€κ΅¬ν˜„μ„ μž˜ν•΄μ„œ μ™ΈλΆ€μ—μ„œ μ‰½κ²Œ μ‚¬μš©ν•˜κ²Œ ν•˜κ³ , μ½”λ“œμ˜ 세뢀적인 λ‚΄μš©μ€ λͺ¨λ₯΄κ²Œ ν•œλ‹€λŠ” μΈ‘λ©΄μ—μ„œ λΉ„μŠ·ν•œ 의미둜 μ‚¬μš©λœλ‹€.

μΊ‘μŠν™”λ₯Ό μ‚¬μš©ν•΄μ•Ό ν•˜λŠ” 이유

  • μ—¬λŸ¬ 가지가 μžˆμ§€λ§Œ 일단 클래슀λ₯Ό 섀계할 λ•Œ 클래슀 κ°„ κ°„μ„­ 및 정보 곡유λ₯Ό μ΅œμ†Œν™”ν•˜μ—¬ κ°œλ³„ ν΄λž˜μŠ€κ°€ λ‹¨λ…μœΌλ‘œλ„ 잘 λ™μž‘ν•  수 μžˆλ„λ‘ ν•΄μ•Ό ν•˜κΈ° λ•Œλ¬Έμ΄λ‹€. 각 ν΄λž˜μŠ€κ°€ κ°•ν•˜κ²Œ μ—°κ²°λ˜μ–΄ μžˆλ‹€λ©΄ λ…λ¦½μ μœΌλ‘œ μ‚¬μš©ν•˜κΈ° μ–΄λ ΅λ‹€. λ˜ν•œ, μ‚¬μš©μž μž…μž₯μ—μ„œλŠ” μƒμ„Έν•œ λ‚΄μš©μ„ λͺ¨λ₯΄λ”라도 μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ΄ν•΄ν•˜λ©΄ 클래슀λ₯Ό μ‰½κ²Œ μ‚¬μš©ν•  수 μžˆλ‹€. νŒŒμ΄μ¬μ—μ„œλŠ” μ΄λŸ¬ν•œ κ°œλ…μ„ κ°€μ‹œμ„±μ΄λΌλŠ” μ΄λ¦„μœΌλ‘œ μ μš©μ‹œν‚€κ³ , 정보 은닉을 μ–΄λ–»κ²Œ ν•  것인가λ₯Ό μ½”λ“œ λ ˆλ²¨μ—μ„œ μ‘°μ ˆν•œλ‹€.

μ‹€μ œ 파이썬의 κ°€μ‹œμ„± μ‚¬μš© 방법 μ˜ˆμ‹œ

  • μ½”λ“œλ₯Ό μž‘μ„±ν•΄μ•Ό ν•˜λŠ” 상황

<aside> πŸ’‘ Product 객체λ₯Ό Inventory 객체에 μΆ”κ°€ Inventoryμ—λŠ” 였직 Product 객체만 듀어감 Inventory에 Productκ°€ λͺ‡ κ°œμΈμ§€ 확인이 ν•„μš”ν•¨ Inventory에 Product itemsλŠ” 직접 접근이 λΆˆκ°€ν•¨

</aside>

class Product(object):
    pass

class Inventory(object):
    def  __ init__(self):
        self.__items =[]
    def add_new_item(self, product): 
        if type(product) == Product:
           self.__items.append(product)
           print("new item added") 
        else:
           raise ValueError("Invalid Item") 
    def get_number_of_items(self):
        return len(self.__items)

my_inventory = Inventory()
my_inventory.add_new_item(Product()) 
my_inventory.add_new_item(Product())

my_inventory.__items
#좜λ ₯κ²°κ³Ό

new item added                         # 17ν–‰ μ‹€ν–‰ κ²°κ³Ό
new item added                         # 18ν–‰ μ‹€ν–‰ κ²°κ³Ό
Traceback (most recent call last):     # 20ν–‰ μ‹€ν–‰ κ²°κ³Ό
    File "visibilityl.py", line 20, in <module>
        my_inventory_iterns
AttributeError: 'Inventory' object has no attribute '__items'
  • μœ„ μ½”λ“œμ—μ„œλŠ” Inventory 객체에 add_new_item() ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ μƒˆλ‘­κ²Œ μƒμ„±λœ Product 객체λ₯Ό λ„£μ–΄μ€€λ‹€. μ—¬κΈ°μ„œ μžλ£Œν˜•μ„ λΉ„κ΅ν•˜μ—¬ ν•΄λ‹Ή 객체가 Product 객체인지 확인 ν•˜κ³ , 그렇지 μ•Šμ„ 경우 ValueErrorκ°€ λ°œμƒν•œλ‹€.
  • itemsλŠ” Product 객체가 λ“€μ–΄κ°€λŠ” κ³΅κ°„μœΌλ‘œ, get_number_of_items()λ₯Ό μ‚¬μš©ν•˜μ—¬ 총 객체의 개수λ₯Ό λ°˜ν™˜ν•œλ‹€. μ—¬κΈ°μ„œ 핡심은___items λ³€μˆ˜μ΄λ‹€. Inventoryλ₯Ό μ €μž₯ν•˜λŠ” κ³΅κ°„μœΌλ‘œ, add_new_item()을 톡해 Product 객체λ₯Ό 넣을 수 μžˆλ‹€.

λ‹€λ₯Έ ν”„λ‘œκ·Έλž¨μ΄ add_new_item()이 μ•„λ‹ˆλΌ 직접 ν•΄λ‹Ή 객체에 μ ‘κ·Όν•΄ μƒˆλ‘œμš΄ 값을 μΆ”κ°€ν•˜λ €κ³  ν•œλ‹€λ©΄ μ–΄λ–»κ²Œ ν• κΉŒ?

  • λ‹€λ₯Έ μ½”λ“œμ—μ„œλŠ” 잘 μ‹€ν–‰λ˜λ‹€κ°€ 20ν–‰μ˜ my_inventory._itemsμ—μ„œ 였λ₯˜κ°€ λ°œμƒν•œλ‹€. μ™œλƒν•˜λ©΄ _κ°€ 특수 역할을 ν•˜λŠ” μ˜ˆμ•½ 문자둜 ν΄λž˜μŠ€μ—μ„œ λ³€μˆ˜μ— 두 κ°œκ°€ λΆ™μ–΄μžˆμ–΄ μ‚¬μš©λ  클래슀 λ‚΄λΆ€μ—μ„œλ§Œ μ ‘κ·Όν•  수 있고, μ™ΈλΆ€μ—λŠ” ν˜ΈμΆœν•˜μ—¬ μ‚¬μš©ν•˜μ§€ λͺ»ν•˜κΈ° λ•Œλ¬Έμ΄λ‹€.
  • 즉, 클래슀 λ‚΄λΆ€ 용으둜만 λ³€μˆ˜λ₯Ό μ‚¬μš©ν•˜κ³  μ‹Άλ‹€λ©΄ ‘__λ³€μˆ˜λͺ…’ ν˜•νƒœλ‘œ λ³€μˆ˜λ₯Ό μ„ μ–Έν•œλ‹€. μ΄λŸ¬ν•œ νŠΉμ§•μ„ μžλ°”μ— μ„œλŠ” private variable이라고도 ν•œλ‹€. 즉, κ°€μ‹œμ„±μ„ 클래슀 λ‚΄λ‘œ ν•œμ •ν•˜λ©΄μ„œ 값이 λ‹€λ₯΄κ²Œ λ“€μ–΄κ°€λŠ”κ²ƒμ„λ§‰μ„μˆ˜μžˆλ‹€. 이λ₯Όμ •λ³΄μ€λ‹‰μ΄λΌκ³ ν•œλ‹€.

μ΄λŸ¬ν•œ 정보λ₯Ό 클래슀 μ™ΈλΆ€μ—μ„œ μ‚¬μš©ν•˜κΈ° μœ„ν•΄μ„œλŠ” μ–΄λ–»κ²Œ ν•΄μ•Ό ν• κΉŒ?

  • λ°μ½”λ ˆμ΄ν„° (decorator)라고 λΆˆλ¦¬λŠ” ©propertyλ₯Ό μ‚¬μš©ν•œλ‹€.
  • λ°μ½”λ ˆμ΄ν„°λŠ” 클래슀의 각 λ©”μ„œλ“œ 상단에 μ‚½μž…ν•˜μ—¬ ν•΄λ‹Ή λ©”μ„œλ“œμ˜ κΈ°λŠ₯을 μΆ”κ°€ν•˜λŠ” 파이썬 문법이닀.
class Inventory(object):
    def __init__(self):
        self.__items=[]          # privateλ³€μˆ˜λ‘œμ„ μ–Έ(타인이접근λͺ»ν•¨)

    @property                    # property λ°μ½”λ ˆμ΄ν„°(μˆ¨κ²¨μ§„ λ³€μˆ˜ λ°˜ν™˜)
    def items(self):
        return self.__items
  • 처음 μ½”λ“œμ˜ 14ν–‰ 뒷뢀뢄에 μœ„μ˜ μ½”λ“œλ₯Ό μΆ”κ°€ν•˜μ—¬ ©propertyλ₯Ό μ‚¬μš©ν•˜λ©΄ ν•΄λ‹Ή λ³€μˆ˜λ₯Ό μ™ΈλΆ€μ—μ„œ μ‚¬μš©ν•  수 μžˆλ‹€.
  • λ‹€λ₯Έ μ½”λ“œλŠ” κ·ΈλŒ€λ‘œ μœ μ§€ν•˜κ³  λ§ˆμ§€λ§‰μ— itemsλΌλŠ” μ΄λ¦„μœΌλ‘œ λ©”μ„œλ“œλ₯Ό λ§Œλ“€λ©΄μ„œ ©property λ₯Ό λ©”μ„œλ“œ 상단에 μž…λ ₯ν•œλ‹€. 그리고 μ™ΈλΆ€μ—μ„œ μ‚¬μš©ν•  λ³€μˆ˜μΈ __itemsλ₯Ό λ°˜ν™˜ν•œλ‹€. μ΄λ ‡κ²Œ μ½” λ“œλ₯Ό μΆ”κ°€ν•˜λ©΄ λ‹€μŒκ³Ό 같이 μ™ΈλΆ€μ—μ„œλ„ ν•΄λ‹Ή λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•  수 μžˆλ‹€.
>>> my—inventory = Inventory()
>>> items = my_inventory.items 
>>> items.append(Product())
  • 이번 μ½”λ“œμ—μ„œλŠ” 였λ₯˜κ°€ λ°œμƒν•˜μ§€ μ•Šμ•˜λ‹€. μ—¬κΈ°μ„œ μ£Όλͺ©ν•  뢀뢄은 __items λ³€μˆ˜μ˜ μ›λž˜ 이름 이 μ•„λ‹Œ items둜 ν˜ΈμΆœν•œλ‹€λŠ” 것이닀. λ°”λ‘œ ©propertyλ₯Ό 뢙인 ν•¨μˆ˜ μ΄λ¦„μœΌλ‘œ μ‹€μ œ __items λ₯Ό μ‚¬μš©ν•  수 μžˆλŠ” 것이닀. μ΄λŠ” κΈ°μ‘΄ private λ³€μˆ˜λ₯Ό λˆ„κ΅¬λ‚˜ μ‚¬μš©ν•  수 μžˆλŠ” public λ³€μˆ˜λ‘œ λ°”κΎΈλŠ” 방법 쀑 ν•˜λ‚˜μ΄λ‹€.