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

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

onegyul 2023. 5. 18. 18:56

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

8μ°¨μ‹œ κ°•μ˜ μ£Όμ œλŠ” 객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ°μž…λ‹ˆλ‹€.

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

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

  • λ‹€λ₯Έ μ‚¬λžŒμ΄ μž‘μ„±ν•œ μ½”λ“œλ₯Ό μ–΄λ–»κ²Œ μ‚¬μš©ν•˜λ©΄ 쒋을지에 λŒ€ν•œ λ‹΅
  • λ‚΄κ°€ μ•„λ‹Œ 남이 λ§Œλ“  μ½”λ“œλ₯Ό μž¬μ‚¬μš©ν•˜κ³  싢을 λ•Œ μ‚¬μš©ν•˜λŠ” λŒ€ν‘œμ μΈ 방법
  • μ–΄λ–€ κΈ°λŠ₯을 μˆ˜ν–‰ν•˜λŠ” ν•˜λ‚˜μ˜ 단일 ν”„λ‘œκ·Έλž¨μ„ 객체라고 ν•˜λŠ” μ½”λ“œλ‘œ λ§Œλ“€μ–΄ λ‹€λ₯Έ ν”„λ‘œκ·Έλž˜λ¨Έκ°€ μž¬μ‚¬μš©ν•  수 μžˆλ„λ‘ ν•œλ‹€

2) 객체와 클래슀

객체(object)λŠ” μ‹€μƒν™œμ— μ‘΄μž¬ν•˜λŠ” μ‹€μ œμ μΈ 물건 λ˜λŠ” κ°œλ…μ„ λœ»ν•˜λ©°, 속성과 ν–‰λ™μœΌλ‘œ κ΅¬μ„±λœλ‹€. 객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ€ μ΄λŸ¬ν•œ 객체의 κ°œλ…μ„ ν™œμš©ν•˜μ—¬ ν”„λ‘œκ·Έλž¨μœΌλ‘œ ν‘œν˜„ν•˜λŠ” 기법이닀.

  • 속성(attribute) : 객체가 가지고 μžˆλŠ” λ³€μˆ˜
  • 행동(action) : 객체가 μ‹€μ œλ‘œ μž‘λ™μ‹œν‚€λŠ” ν•¨μˆ˜, λ©”μ„œλ“œ

예) 인곡지λŠ₯ 좕ꡬ ν”„λ‘œκ·Έλž¨μ„ λ§Œλ“€ λ•Œλ₯Ό μƒκ°ν•΄λ³΄μž. ν”„λ‘œκ·Έλž¨μ„ λ§Œλ“€κΈ° μœ„ν•΄ μ–΄λ–€ μ’…λ₯˜μ˜ 객체가 ν•„μš”ν•œμ§€ 생각해야 ν•œλ‹€. κ²Œμž„μ„ κ΅¬μ„±ν•˜λŠ” λ‹¨μœ„λ‘œ μ‹¬νŒ, μ„ μˆ˜, νŒ€μ΄ μžˆλŠ”λ° 이 κ°œλ…μ„ 객체라고 ν•  수 μžˆλ‹€. ‘μ„ μˆ˜’ 객체의 경우 μ„ μˆ˜ 이름, ν¬μ§€μ…˜, μ†Œμ†νŒ€ 등이 ν•˜λ‚˜μ˜ 속성이고, ‘곡을 μ°¨λ‹€’, ‘νŒ¨μŠ€ν•˜λ‹€’와 같은 κ°œλ…μ€ ν–‰λ™μœΌλ‘œ μƒκ°ν•˜λ©΄ λœλ‹€.

 

κ°μ²΄λŠ” ν•˜λ‚˜μ˜ ν”„λ‘œκ·Έλž¨μ—μ„œ μ—¬λŸ¬ κ°œκ°€ μ‚¬μš©λ  μˆ˜λ„ μžˆλ‹€. λ”°λΌμ„œ 객체듀을 μœ„ν•œ 섀계도λ₯Ό λ§Œλ“€μ–΄μ•Ό ν•œλ‹€. 이λ₯Ό ν”„λ‘œκ·Έλž¨μ—μ„œλŠ” 클래슀(class)라고 ν•œλ‹€.

  • 클래슀(class) : 객체가 κ°€μ Έμ•Ό ν•  κΈ°λ³Έ 정보λ₯Ό 담은 μ½”λ“œ, μΌμ’…μ˜ 섀계도 μ½”λ“œλΌκ³  생각.

예) 좕ꡬ μ„ μˆ˜ 객체λ₯Ό λ§Œλ“ λ‹€λ©΄ μ„ μˆ˜ 이름, ν¬μ§€μ…˜, μ†Œμ†νŒ€ 등은 기본적으둜 κ°€μ Έμ•Ό ν•  속성이닀. μ΄λŸ¬ν•œ 정보λ₯Ό ν΄λž˜μŠ€μ— λ‹΄κ³  μ‹€μ œ μƒμ„±λ˜λŠ” κ°œμ²΄μ—λŠ” 손ν₯λ―Ό, 이강인 같은 μ„ μˆ˜ 이름을 ν• λ‹Ήν•œλ‹€. μ΄λ ‡κ²Œ ν•΄μ„œ μ‹€μ œλ‘œ μƒμ„±λ˜λŠ” 객체λ₯Ό μΈμŠ€ν„΄μŠ€(instance)라고 ν•œλ‹€.

예) ‘DOG’ λΌλŠ” ν΄λž˜μŠ€κ°€ μžˆλ‹€λ©΄, μ‹€μ œ μ‚¬μš©ν•˜λŠ” μ’…λ₯˜λ³„λ‘œ μ—¬λŸ¬ 마리의 Dog μΈμŠ€ν„΄μŠ€λ₯Ό λ§Œλ“€ 수 μžˆλ‹€.

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

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

πŸ’‘ class SoccerPlayer(object): 클래슀 μ˜ˆμ•½μ–΄, 클래슀 이름, μƒμ†λ°›λŠ” 객체λͺ…

아직 μƒμ†μ˜ κ°œλ…μ„ λ°°μš°μ§€ μ•Šμ•˜μ§€λ§Œ κ°„λ‹¨νžˆ μ„€λͺ…ν•˜λ©΄, 기쑴에 λ§Œλ“  클래슀의 νŠΉμ§•μ„ κ·ΈλŒ€λ‘œ 이어받아 μ‚¬μš©ν•˜λŠ” 것을 λ§ν•œλ‹€. 상속은 객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ˜ μž₯점 쀑 ν•˜λ‚˜μΈλ°, 이 νŠΉμ§•μ€ λ’€μ—μ„œ λ‹€μ‹œ 닀루도둝 ν•˜μž.

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

snake_case : 띄어쓰기 뢀뢄에 ‘_’λ₯Ό μΆ”κ°€ν•˜μ—¬ λ³€μˆ˜μ˜ 이름을 지정함. 파이썬 ν•¨μˆ˜λ‚˜ λ³€μˆ˜λͺ…에 μ‚¬μš©λœλ‹€.

CamelCase : 띄어쓰기 뢀뢄에 λŒ€λ¬Έμžλ₯Ό μ‚¬μš©ν•˜μ—¬ λ³€μˆ˜μ˜ 이름을 지정함. 파이썬 클래슀λͺ…에 μ‚¬μš©λœλ‹€.

 

클래슀 μ„ μ–Έμ˜ 기본을 μ•Œμ•˜μœΌλ‹ˆ 좕ꡬ μ„ μˆ˜ 클래슀λ₯Ό κ΅¬μ„±ν•΄λ³΄μž.

1. μ†μ„±μ˜ μ„ μ–Έ

속성에 λŒ€ν•œ 정보λ₯Ό μ„ μ–Έν•˜κΈ° μœ„ν•΄μ„œλŠ” __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__( ) ν•¨μˆ˜ : ν΄λž˜μŠ€μ—μ„œ μ‚¬μš©ν•  λ³€μˆ˜λ₯Ό μ •μ˜ν•˜λŠ” ν•¨μˆ˜
  • 첫번째 λ§€κ°œλ³€μˆ˜λŠ” λ°˜λ“œμ‹œ self λ³€μˆ˜λ₯Ό μ‚¬μš©ν•΄μ•Ό ν•œλ‹€.
    self λ³€μˆ˜λŠ” ν΄λž˜μŠ€μ—μ„œ μƒμ„±λœ μΈμŠ€ν„΄μŠ€μ— μ ‘κ·Όν•˜λŠ” μ˜ˆμ•½μ–΄μ΄λ‹€. μ΄ν•΄ν•˜κΈ° μ–΄λ ΅λ‹€λ©΄ μƒμ„±λœ μΈμŠ€ν„΄μŠ€λ₯Ό μ§€μ •ν•˜λŠ” λ³€μˆ˜λΌκ³  μƒκ°ν•˜λ©΄ λœλ‹€.
  • self λ’€μ˜ λ§€κ°œλ³€μˆ˜λ“€μ€ μ‹€μ œλ‘œ ν΄λž˜μŠ€κ°€ 가진 μ†μ„±μœΌλ‘œ μ„ μˆ˜ 이름, ν¬μ§€μ…˜, λ“±λ²ˆν˜Έ 등이고 이 값듀은 μ‹€μ œλ‘œ μƒμ„±λ˜λŠ” μΈμŠ€ν„΄μŠ€μ— ν• λ‹Ήλœλ‹€. ν• λ‹Ήλ˜λŠ” μ½”λ“œλŠ” self.name = name (=μƒμ„±λœ μΈμŠ€ν„΄μŠ€μ— μžˆλŠ” name λ³€μˆ˜μ— λ§€κ°œλ³€μˆ˜λ‘œ μž…λ ₯된 name 값을 ν• λ‹Ήν•œλ‹€λŠ” 뜻)이닀. 클래슀의 λ³€μˆ˜λŠ” ‘self.λ³€μˆ˜μ΄λ¦„’으둜 init( ) ν•¨μˆ˜μ—μ„œ 자유둭게 생성할 수 μžˆλ‹€.

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

ν•¨μˆ˜λŠ” 이 ν΄λž˜μŠ€κ°€ ν•  수 μžˆλŠ” λ‹€μ–‘ν•œ λ™μž‘μ„ μ •μ˜ν•  수 μžˆλ‹€. λ“±λ²ˆν˜Έ ꡐ체 λΌλŠ” ν•»μ˜Ήμ„ μ½”λ“œλ‘œ ν‘œν˜„ν•΄λ³΄μž.

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

3. _의 μ“°μž„

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

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

for _ in range(10):
		print("Hello, World")
  • ‘Hello, World’λ₯Ό 화면에 10번 좜λ ₯ν•˜λŠ” ν•¨μˆ˜μ΄λ‹€. 횟수λ₯Ό μ„ΈλŠ” _ λ³€μˆ˜λŠ” νŠΉλ³„ν•œ μš©λ„κ°€ μ—†μœΌλ―€λ‘œ λ’€μ—μ„œ μ‚¬μš©λ˜μ§€ μ•ŠλŠ”λ‹€.

_ 2개λ₯Ό μ‚¬μš©ν•˜λ©΄ νŠΉμˆ˜ν•œ 에약 ν•¨μˆ˜λ‚˜ λ³€μˆ˜λ₯Ό μ˜λ―Έν•œλ‹€. str__μ΄λ‚˜ __ init( ) 같은 ν•¨μˆ˜κ°€ μžˆλ‹€. __ str__( ) ν•¨μˆ˜λŠ” 클래슀둜 μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν–ˆμ„ λ•Œ, κ·Έ μΈμŠ€ν„΄μŠ€ 자체λ₯Ό print( ) ν•¨μˆ˜λ‘œ 화면에 좜λ ₯ν•˜λ©΄ λ‚˜μ˜€λŠ” 값을 λœ»ν•œλ‹€.

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

 

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

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

πŸ’‘ jinhyun = SoccerPlayer(”Jinhyun”, “MF”, 10): 객체λͺ…, 클래슀 이름, init ν•¨μˆ˜ μΈν„°νŽ˜μ΄μŠ€ μ΄ˆκΉƒκ°’

# 전체 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)

# 좜λ ₯κ²°κ³Ό (각각 16, 17, 18ν–‰ 싀행결과이닀)
ν˜„μž¬ μ„ μˆ˜μ˜ λ“±λ²ˆν˜ΈλŠ”: 10
μ„ μˆ˜μ˜ λ“±λ²ˆν˜Έλ₯Ό λ³€κ²½ν•œλ‹€: From 10 to 5
ν˜„μž¬ μ„ μˆ˜μ˜ λ“±λ²ˆν˜ΈλŠ”: 5

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

  • μžμ‹ μ˜ μ½”λ“œλ₯Ό λ‹€λ₯Έ μ‚¬λžŒμ΄ μ†μ‰½κ²Œ μ‚¬μš©ν•  수 μžˆλ„λ‘ μ„€κ³„ν•˜κΈ° μœ„ν•¨
  • μ½”λ“œλ₯Ό μ’€ 더 μ†μ‰½κ²Œ μ„ μ–Έν•  수 μžˆλ‹€λŠ” μž₯점도 μžˆλ‹€
# 데이터
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])

# 좜λ ₯κ²°κ³Ό (각각 print문에 λŒ€ν•œ μ‹€ν–‰ κ²°κ³Ό)
[['Messi', 'MF', 10], ['Ramos', 'DF', 4], ['Ronaldo', 'CF', 7], ['Park', 'WF', 13], ['Buffon', 'GK', 1]]
['Messi', 'MF', 10]
Hello, My name is Messi. I play in MF in center.

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

1) 상속

  • 상속(inheritance) : 이름 κ·ΈλŒ€λ‘œ 무엇인가λ₯Ό λ‚΄λ €λ°›λŠ” 것을 λœ»ν•˜λ©°, λΆ€λͺ¨ ν΄λž˜μŠ€μ— μ •μ˜λœ 속성과 λ©”μ„œλ“œλ₯Ό μžμ‹ ν΄λž˜μŠ€κ°€ λ¬Όλ €λ°›μ•„ μ‚¬μš©ν•˜λŠ” 것을 λ§ν•œλ‹€.
class Person(object):
    pass

objectκ°€ Person 클래슀의 λΆ€λͺ¨ ν΄λž˜μŠ€μ΄λ‹€. objectλŠ” νŒŒμ΄μ¬μ—μ„œ μ‚¬μš©ν•˜λŠ” κ°€μž₯ κΈ°λ³Έ 객체(base object)이며, 파이썬 μ–Έμ–΄κ°€ 객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ΄λ―€λ‘œ λͺ¨λ“  λ³€μˆ˜λŠ” κ°œμ²΄μ΄λ‹€.

a = "abc"
print(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("Sungshul", 35)
print(first_korean.name)  # Sungchul 좜λ ₯
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), "μ‚΄μž…λ‹ˆλ‹€.")
class Employee(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, "μž…λ‹ˆλ‹€.")

2) λ‹€ν˜•μ„±

  • λ‹€ν˜•μ„±(polymorphism) : 같은 μ΄λ¦„μ˜ λ©”μ„œλ“œκ°€ λ‹€λ₯Έ κΈ°λŠ₯을 ν•˜λŠ” 것을 말함
  • 객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ€ λ‹€λ₯Έ μ‚¬λžŒμ˜ μ½”λ“œλ₯Ό μ‰½κ²Œ μž¬μ‚¬μš©ν•˜κΈ° μœ„ν•΄ μ‚¬μš©ν•˜λŠ”λ° 이λ₯Ό μœ„ν•΄μ„œλŠ” 내뢀적인 κ΅¬ν˜„ 과정을 잘 λͺ¨λ₯΄λ”라도 κ·Έ ν•¨μˆ˜λ‚˜ 클래슀의 역할은 λͺ…ν™•νžˆ μ•Œ ν•„μš”κ°€ 있음
n_crawler = NaverCrawler()
d_crawler = DaumCrawler()
crawlers = [n_crawler, d_crawler]
news = []
for crawler in crawlers:
    news.append(crawler.do_crawling())
	class Animal:
    def __init__(self, name):
        self.name = name
    def talk(self):
        raise NotImplementedError("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())

# 좜λ ₯κ²°κ³Ό
Missy:Meow!
Mr,Mistoffelees:Meow!
Lassie:Woof! Woof!

3) κ°€μ‹œμ„±

  • κ°€μ‹œμ„±(visibility) : 객체의 정보λ₯Ό λ³Ό 수 μžˆλŠ” λ ˆλ²¨μ„ μ‘°μ ˆν•˜μ—¬ 객체의 정보 접근을 μˆ¨κΈ°λŠ” 것
  • μΊ‘μŠν™”(encapsulation) : 객체의 λ§€κ°œλ³€μˆ˜ μΈν„°νŽ˜μ΄μŠ€λ§Œ λͺ…ν™•νžˆ μ•Œλ©΄ 객체λ₯Ό μ‚¬μš©ν•  수 μžˆλŠ”λ°, 객체의 μ„ΈλΆ€ λ‚΄μš©μ€ λͺ¨λ₯Έ 채 객체의 μ‚¬μš©λ²•λ§Œ μ•Œκ³  μ‚¬μš©ν•œλ‹€λŠ” 뜻
  • 정보 은닉(information hiding) : μ™ΈλΆ€μ—μ„œ μ½”λ“œ λ‚΄λΆ€λ₯Ό λ³Ό 수 μ—†κ²Œ ν•˜κΈ° μœ„ν•΄ λ‚΄λΆ€μ˜ 정보λ₯Ό μˆ¨κΈ°λŠ” κ°œλ…

μΊ‘μŠν™”μ™€ μ •λ³΄μ€λ‹‰μœΌλ‘œ ν‘œν˜„μ€ λ‹€λ₯΄κ²Œ ν•˜μ§€λ§Œ λ‘˜ λ‹€ μ½”λ“œμ˜ λ‚΄λΆ€ κ΅¬ν˜„μ„ 잘 ν•΄μ„œ μ™ΈλΆ€μ—μ„œ μ‰½κ²Œ μ‚¬μš©ν•˜κ²Œ ν•˜κ³ , μ½”λ“œμ˜ 세뢀적인 λ‚΄μš©μ€ λͺ¨λ₯΄κ²Œ ν•œλ‹€λŠ” μΈ‘λ©΄μ—μ„œ λΉ„μŠ·ν•œ 의미둜 μ‚¬μš©λœλ‹€.

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

μ‹€μ œ 파이썬의 κ°€μ‹œμ„± μ‚¬μš© 방법에 λŒ€ν•΄ μ˜ˆμ‹œλ₯Ό λ“€μ–΄ μ„€λͺ…ν•˜κ² λ‹€. μ½”λ“œλ₯Ό μž‘μ„±ν•΄μ•Ό ν•˜λŠ” 상황은 λ‹€μŒκ³Ό κ°™λ‹€.

  • Product 객체λ₯Ό Inventory 객체에 μΆ”κ°€
  • Inventoryμ—λŠ” 였직 Product 객체만 듀어감
  • Inventory에 Productκ°€ λͺ‡ κ°œμΈμ§€ 확인이 ν•„μš”ν•¨
  • Inventory에 Product itemsλŠ” 직접 접근이 λΆˆκ°€ν•¨
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
new item added
Traceback (most recent call last):
  File "C:\\Users\\hahnp\\PycharmProjects\\study_only\\dsob_week8\\visibility1.py", line 20, in <module>
    my_inventory.__items
AttributeError: 'Inventory' object has no attribute '__items'
class Inventory(object):
    def __init__(self):
        self.__items = []

    @property
    def itmes(self):
        return self.__items