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

[1νŒ€/ν—ˆμ„œμ›] 8μ°¨μ‹œ 파이썬 μŠ€ν„°λ”” - 객체지ν–₯ν”„λ‘œκ·Έλž˜λ°

ν—ˆμ„œμ› 2023. 5. 18. 22:37

참고자료 : 데이터과학을 μœ„ν•œ 파이썬 ν”„λ‘œκ·Έλž˜λ°

8μ°¨μ‹œ_객체지ν–₯ν”„λ‘œκ·Έλž˜λ°_κ°•μ˜μ•ˆ.pdf
0.71MB
8μ°¨μ‹œ_객체지ν–₯ν”„λ‘œκ·Έλž˜λ°_과제.pdf
0.27MB

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


ν•™μŠ΅λͺ©ν‘œ

  • 객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ„ λ°°μš°λŠ” μ΄μœ μ— λŒ€ν•΄ μ•Œμ•„λ³Έλ‹€.
  • 객체와 클래슀의 κ°œλ…μ— λŒ€ν•΄ ν•™μŠ΅ν•œλ‹€.
  • 클래슀λ₯Ό κ΅¬ν˜„ν•˜κ³  μΈμŠ€ν„΄μŠ€λ₯Ό μ‚¬μš©ν•˜λŠ” 방법을 μ΄ν•΄ν•œλ‹€.
  • 객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ˜ νŠΉμ§•μΈ 상속. λ‹€ν˜•μ„±, κ°€μ‹œμ„±μ— λŒ€ν•΄ ν•™μŠ΅ν•œλ‹€.

01 객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ„ λ°°μš°λŠ” 이유

  • 객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ°

⇒ λ‚΄κ°€ μ•„λ‹ˆλΌ 남이 λ§Œλ“  μ½”λ“œλ₯Ό μž¬μ‚¬μš©ν•˜κ³  싢을 λ•Œ μ‚¬μš©ν•˜λŠ” λŒ€ν‘œμ μΈ 방법

ν•¨μˆ˜μ²˜λŸΌ μ–΄λ–€ κΈ°λŠ₯을 ν•¨μˆ˜ μ½”λ“œλ‘œ λ¬Άμ–΄ λ‘λŠ” 것이 μ•„λ‹ˆλΌ,

ν•˜λ‚˜μ˜ 단일 ν”„λ‘œκ·Έλž¨μ„ 객체라고 ν•˜λŠ” μ½”λ“œλ‘œ λ§Œλ“€μ–΄ λ‹€λ₯Έ ν”„λ‘œκ·Έλž˜λ¨Έκ°€ μž¬μ‚¬μš©ν•  수 μžˆλ„λ‘ 함

 

  • 객체와 클래슀
    • 객체(object): μ‹€μƒν™œμ— μ‘΄μž¬ν•˜λŠ” μ‹€μ œμ μΈ 물건 λ˜λŠ” κ°œλ…
      • 속성(attribute) : 객체가 가지고 μžˆλŠ” λ³€μˆ˜(variable)
      • 행동(action) - 객체가 μ‹€μ œλ‘œ μž‘λ™μ‹œν‚€λŠ” ν•¨μˆ˜(fuction), λ©”μ„œλ“œ

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

  • 클래슀 κ΅¬ν˜„ν•˜κΈ°

νŒŒμ΄μ¬μ—μ„œ 클래슀λ₯Ό μ„ μ–Έν•˜κΈ° μœ„ν•œ κΈ°λ³Έ μ½”λ“œ ν…œν”Œλ¦Ώ:

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

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

κ°€μ‘΄κ³Ό λ‹€λ₯΄κ²Œ 첫 κΈ€μžμ™€ 쀑간 κΈ€μžκ°€ λŒ€λ¬Έμž

파이썬뿐만 μ•„λ‹ˆλΌ λͺ¨λ“  컴퓨터 ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄μ—μ„œ λ³€μˆ˜, 클래슀, ν•¨μˆ˜λͺ…을 μ§“λŠ” μž‘λͺ… 기법이 μžˆλ‹€.

  • μ†μ„±μ˜ μ„ μ–Έ

속성에 λŒ€ν•œ 정보λ₯Ό μ„ μ–Έν•˜κΈ° μœ„ν•΄μ„œλŠ” _ init_()λΌλŠ” μ˜ˆμ•½ ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•œλ‹€.

파이썬 ν΄λž˜μŠ€μ—μ„œλŠ” λͺ‡ 개의 μ˜ˆμ•½ ν•¨μˆ˜κ°€ μžˆλŠ”λ°. λŒ€ν‘œμ μΈ 것이 iinit()κ°€ μžˆλ‹€.

μ΄λŸ¬ν•œ ν•¨μˆ˜λ“€μ€ μ•½μ†λœ ν˜•νƒœμ˜ μž‘μ—…μ„ μˆ˜ν–‰μ‹œμΌœ μ€€λ‹€.

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() ν•¨μˆ˜μ—μ„œ 자유둭게 생성할 수 μžˆλ‹€.

 

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

ν•¨μˆ˜λŠ” 이 ν΄λž˜μŠ€κ°€ ν•  수 μžˆλŠ” λ‹€μ–‘ν•œ λ™μž‘μ„ μ •μ˜ν•  수 μžˆλ‹€.

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κ°€ μžˆμ–΄μ•Όλ§Œ μ‹€μ œλ‘œ μΈμŠ€ν„΄μŠ€κ°€ μ‚¬μš©ν•  수 μžˆλŠ” ν•¨μˆ˜λ‘œ μ„ μ–Έλœλ‹€.

κ·Έ μ™Έμ—λŠ” 일반적인 ν•¨μˆ˜μ˜ μ‚¬μš© 방법과 κ°™λ‹€.

 

  • _의 μ“°μž„

일반적으둜 νŒŒμ΄μ¬μ—μ„œ _의 μ“°μž„μ€ κ°œμˆ˜μ— 따라 μ—¬λŸ¬ κ°€μ§€λ‘œ λ‚˜λˆŒ 수 μžˆλ‹€.

for _ in range(10):
    printC’Hello, World")

→ _ 1κ°œλŠ” μ΄ν›„λ‘œ 쓰이지 μ•Šμ„ λ³€μˆ˜μ— νŠΉλ³„ν•œ 이름을 λΆ€μ—¬ν•˜κ³  싢지 μ•Šμ„ λ•Œ μ‚¬μš©

또 λ‹€λ₯Έ μš©λ„λ‘œ _ 2개λ₯Ό μ‚¬μš©ν•˜λ©΄ νŠΉμˆ˜ν•œ μ˜ˆμ•½ ν•¨μˆ˜λ‚˜ λ³€μˆ˜λ₯Ό μ˜λ―Έν•œλ‹€.

λ‹€μ–‘ν•œ μš©λ„κ°€ μžˆμœΌλ‹ˆ _의 νŠΉμˆ˜ν•œ μš©λ„μ— λŒ€ν•΄μ„œλ„ μΈμ§€ν•΄λ‘λŠ” 것이 μ’‹μŒ

 

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

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

μΈμŠ€ν„΄μŠ€: ν΄λž˜μŠ€μ—μ„œ μ‹€μ œμ μΈ 데이터가 μž…λ ₯λ˜μ–΄ μ‚¬μš©ν•  수 μžˆλŠ” ν˜•νƒœμ˜ 객체

λ¨Όμ € 클래슀 이름을 ν˜ΈμΆœν•˜κ³ , μ•žμ—μ„œ μ •μ˜ν–ˆλ˜ __init_() ν•¨μˆ˜μ˜ λ§€κ°œλ³€μˆ˜μ— λ§žμΆ”μ–΄ 값을 μž…λ ₯ν•œλ‹€.

μ—¬κΈ°μ„œ 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 = SoccerPlayerC’Jinhyun", "MF", 10)

print("ν˜„μž¬ μ„ μˆ˜μ˜ λ“±λ²ˆν˜ΈλŠ”:,\\ j inhyun .back_number)
jinhyun.change_back_number(5)
print("ν˜„μž¬ μ„ μˆ˜μ˜ λ“±λ²ˆν˜ΈλŠ”:", jinhyun.baμ•„c_number)
  • 클래슀λ₯Ό μ‚¬μš©ν•˜λŠ” 이유

μžμ‹ μ΄ λ§Œλ“  μ½”λ“œκ°€ 데이터 μ €μž₯뿐 μ•„λ‹ˆλΌ λ‹€λ₯Έ 역할을 ν•΄μ•Ό ν•  λ•Œ μžμ‹ μ˜ μ½”λ“œλ₯Ό λ‹€λ₯Έ μ‚¬λžŒμ΄ μ†μ‰½κ²Œ μ‚¬μš©ν•  수 μžˆλ„λ‘ μ„€κ³„ν•˜κΈ° μœ„ν•¨μ΄λ‹€.

-> 데이터λ₯Ό λ³€ν™˜ν•˜κ±°λ‚˜ λ°μ΄ν„°λ² μ΄μŠ€μ— μ €μž₯ν•˜λŠ” λ“±μ˜ 역할이 ν•„μš”ν•  λ•Œκ°€ μžˆλ‹€.

이것을 λ¦¬μŠ€νŠΈμ™€ ν•¨μˆ˜λ‘œ 각각 λ§Œλ“€μ–΄ κ³΅μœ ν•˜λŠ” 것보닀 ν•˜λ‚˜μ˜ 객체둜 생성해 λ‹€λ₯Έ μ‚¬λžŒλ“€μ—κ²Œ λ°°ν¬ν•œλ‹€λ©΄ μž‘μ—…μ΄ 훨씬 더 μ‰¬μ›Œμ§„λ‹€.

++ μ½”λ“œλ₯Ό μ’€ 더 μ†μ‰½κ²Œ μ„ μ–Έν•  수 μžˆλ‹€λŠ” μž₯점도 μžˆλ‹€.

λ‹¨μˆœνžˆ 이차원 리슀트둜 μ„ μ–Έν•  수 μžˆλŠ” 것을 객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ˜ κ°œλ…μ„ μ μš©μ‹œμΌœ μ’€ 더 λͺ…ν™•ν•˜ 게 μ €μž₯된 데이터λ₯Ό 확인할 수 μžˆλ‹€. 특히 λ‹€λ₯Έ μ‚¬λžŒλ“€μ΄ κ²°κ³Όλ₯Ό μ‚¬μš©ν•  λ•Œ 이 데이터가 무엇을 μœ„ν•œ 데이터인지λ₯Ό λͺ…ν™•νžˆ μ•Œ 수 μžˆλ‹€.

 

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

  • 상속

이름 κ·ΈλŒ€λ‘œ 무엇인가λ₯Ό λ‚΄λ €λ°›λŠ” 것을 λœ»ν•œλ‹€.

→ λΆ€λͺ¨ ν΄λž˜μŠ€λ‘œλΆ€ν„° κ°’κ³Ό λ©”μ„œλ“œλ₯Ό λ¬Όλ €λ°›μ•„ μžμ‹ 클래슀λ₯Ό μƒμ„±ν•œλ‹€λŠ” λœ»μ΄λ‹€.

즉, μžμ‹μ΄ λΆ€λͺ¨μ˜ νŠΉμ„±μ„ κ·ΈλŒ€λ‘œ ν¬ν•¨ν•œ 채 μƒμ„±λ˜λŠ” 것이닀.

class Person(object):
    pass

→ classλΌλŠ” μ˜ˆμ•½μ–΄ λ‹€μŒμ— 클래슀λͺ…μœΌλ‘œ Person을 μ“°κ³  () μ•ˆμ— objectλ₯Ό μž…λ ₯ν•˜μ˜€λ‹€.

μ—¬κΈ°μ„œ objectκ°€ Person 클래슀의 λΆ€λͺ¨ ν΄λž˜μŠ€μ΄λ‹€.

사싀 objectλŠ” νŒŒμ΄μ¬μ—μ„œ μ‚¬μš©ν•˜λŠ” κ°€μž₯ κΈ°λ³Έ 객체이며. 파이썬 μ–Έμ–΄κ°€ 객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ΄λ―€λ‘œ λͺ¨λ“  λ³€μˆ˜λŠ” 객체이닀.

 

  • λ‹€ν˜•μ„±

같은 μ΄λ¦„μ˜ λ©”μ„œλ“œκ°€ λ‹€λ₯Έ κΈ°λŠ₯을 ν•˜λŠ” 것을 λ§ν•œλ‹€. λ‹€ν˜•μ„±μ„ μ‚¬μš©ν•˜λŠ” 이유 : ν•΄λ‹Ή 클래슀의 μ‚¬μš©μž μž…μž₯μ—μ„œλŠ” ν•¨μˆ˜μ˜ μ΄λ¦„λ§Œ μ•Œλ©΄ 같은 ν˜•νƒœλ‘œ μ‚¬μš©ν•  수 μžˆμ§€λ§Œ. 클래슀 의 개발자 μž…μž₯μ—μ„œλŠ” 내뢀적인 κ΅¬ν˜„μ„ 각 ν΄λž˜μŠ€λ³„ λ‹€λ₯΄κ²Œ κ°œλ°œν•  ν•„μš”κ°€ μžˆλ‹€. 이λ₯Ό λ‹€ν˜•μ„± 이라고 ν•˜λŠ”λ°, λ‹€ν˜•μ„±μ„ μ‚¬μš©ν•˜λ©΄ ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•  λ•Œ μ‚¬μš©μžκ°€ μ’€ 더 μ‰½κ²Œ 클래슀λ₯Ό μ‚¬μš© ν•  수 μžˆλ‹€.

 

  • κ°€μ‹œμ„±

객체의 정보λ₯Ό λ³Ό 수 μžˆλŠ” λ ˆλ²¨μ„ μ‘°μ ˆν•˜μ—¬ 객체의 정보 접근을 μˆ¨κΈ°λŠ” 것

μ’€ 더 μ€‘μš”ν•œ 핡심 κ°œλ…μ€ **μΊ‘μŠν™”(encapsulation)**와 **정보 은닉 (information hiding)**이닀. 파이썬객체의 λ§€κ°œλ³€μˆ˜ μΈν„°νŽ˜μ΄μŠ€λ§Œ λͺ…ν™•νžˆ μ•Œλ©΄ μ‚¬μš©ν•  수 μžˆλ‹€.

  • μΊ‘μŠν™” : 객체의 μ„ΈλΆ€ λ‚΄μš©μ€ λͺ¨λ₯Έ 채 객체의 μ‚¬μš©λ²•λ§Œ μ•Œκ³  μ‚¬μš©ν•œλ‹€.
  • → 클래슀λ₯Ό 섀계할 λ•Œ 클래슀 κ°„ κ°„μ„­ 및 정보 곡유λ₯Ό μ΅œμ†Œν™”ν•˜μ—¬ κ°œλ³„ ν΄λž˜μŠ€κ°€ λ‹¨λ…μœΌλ‘œλ„ 잘 λ™μž‘ν•  수 μžˆλ„λ‘ ν•˜κΈ° μœ„ν•΄ μ‚¬μš©
  • 정보 은닉 : μ™ΈλΆ€μ—μ„œ μ½”λ“œ λ‚΄λΆ€λ₯Ό λ³Ό 수 μ—†κ²Œ ν•˜κΈ° μœ„ν•΄ λ‚΄λΆ€μ˜ 정보λ₯Ό μˆ¨κΈ΄λ‹€.

⇒ λ‘˜ λ‹€ μ™ΈλΆ€μ—μ„œ μ‰½κ²Œ μ‚¬μš©ν•˜κ²Œ ν•˜κ³ , μ½”λ“œμ˜ 세뢀적인 λ‚΄μš©μ€ λͺ¨λ₯΄κ²Œ ν•œλ‹€

κ°€μ‹œμ„±μ΄λΌλŠ” μ΄λ¦„μœΌλ‘œ μ μš©μ‹œν‚€κ³ . 정보 은닉을 μ–΄λ–»κ²Œ ν•  것인가λ₯Ό μ½”λ“œμ—μ„œ 쑰절