πŸ› οΈBackend/⚑Python

[Python] 10κ°• - 객체지ν–₯

junbin2 2025. 4. 18. 18:01

1. 객체지ν–₯의 이해

2.. ν΄λž˜μŠ€μ™€ μΈμŠ€ν„΄μŠ€

3. 객체지ν–₯의 ν™œμš©

 

1. 객체지ν–₯의 이해

(1) 객체지ν–₯의 κ°œλ…

 - 객체와 객체 μ‚¬μ΄μ˜ μƒν˜Έμž‘μš©μœΌλ‘œ ν”„λ‘œκ·Έλž¨μ„ κ΅¬μ„±ν•˜λŠ” ν”„λ‘œκ·Έλž˜λ° νŒ¨λŸ¬λ‹€μž„μ„ μ˜λ―Έν•œλ‹€.

 - ν”„λ‘œκ·Έλž¨μ„ μœ μ—°ν•˜κ³  변경을 μ‰½κ²Œ λ§Œλ“€μ–΄ λŒ€κ·œλͺ¨ μ†Œν”„νŠΈμ›¨μ–΄ κ°œλ°œμ— μ‚¬μš©μ„ 함.

[1] 객체지ν–₯ νŒ¨λŸ¬λ‹€μž„μ˜ νŠΉμ§•

 - 좔상화 : κ³΅ν†΅μ˜ μ†μ„±μ΄λ‚˜ κΈ°λŠ₯을 λ„μΆœ

 - μΊ‘μŠν™” : 데이터 ꡬ쑰와 λ°μ΄ν„°μ˜ 연산을 κ²°ν•©

 - 상속 : μƒμœ„ κ°œλ…μ˜ νŠΉμ§•μ΄ ν•˜μœ„ κ°œλ…μ— 전달

 - λ‹€ν˜•μ„± : μœ μ‚¬ 객체의 μ‚¬μš©μ„±μ„ κ·ΈλŒ€λ‘œ μœ μ§€

 

(2) 객체와 클래슀

[1] 객체 μ •μ˜

- κ°μ²΄λŠ” 좔상화와 μΊ‘μŠν™”μ˜ κ²°κ³Όλ₯Ό μ˜λ―Έν•œλ‹€.

 - μ‹€μ„Έκ³„μ˜ 사물에 λŒ€ν•œ μƒνƒœ(데이터)와 μ—°μ‚°(λ©”μ†Œλ“œ)을 ν‘œν˜„ν•œ λ‹¨μœ„λ₯Ό λ§ν•œλ‹€.

 - 멀버(데이터 ν•„λ“œ, λ©”μ†Œλ“œ)λŠ” ν΄λž˜μŠ€μ— μ˜ν•΄ 결정이 λœλ‹€.

[2] 클래슀 μ •μ˜

 - ν΄λž˜μŠ€λŠ” 객체λ₯Ό λ§Œλ“€μ–΄ λ‚΄κΈ° μœ„ν•œ μ„€κ³„λ„λ©΄μœΌλ‘œ λ³Ό 수 μžˆλ‹€.

 - μ‰½κ²Œ 말해, 클래슀의 μ—¬λŸ¬ 볡사본듀을 객체라고 λ³Ό 수 있음. 즉, 원본(섀계도)으둜 λ³Ό 수 있음.

 - ν΄λž˜μŠ€μ—μ„œλŠ” λ©”μ†Œλ“œμ™€ μ΄ˆκΈ°μžκ°€ μ‘΄μž¬ν•¨.

[3] λ©”μ†Œλ“œ(method)

 - 객체에 λŒ€ν•œ 행동(μ—°μ‚°)을 μ •μ˜

 - ν•¨μˆ˜μ˜ μ •μ˜ 및 μ‚¬μš© 방법과 동일함.

 - 클래슀 내뢀에 ν•¨μˆ˜κ°€ 있으면 그것을 λ©”μ„œλ“œλΌκ³  뢀름.

[4] 초기자(initializer)

 - 객체의 μƒνƒœλ₯Ό μ΄ˆκΈ°ν™”ν•˜λŠ” 특수 λ©”μ†Œλ“œλ₯Ό μ˜λ―Έν•œλ‹€.

 - 항상 __init__으둜 λͺ…λͺ…함

 - μžλ°”μ—μ„  μƒμ„±μžλ‘œ λ³Ό 수 있음.

 

(3) 파이썬 객체 & 클래슀 ꡬ문 ν˜•μ‹

 - 클래슀 내뢀에 λ©”μ†Œλ“œλ“€μ„ μ •μ˜ ν•  수 있음. μ΄λ•Œ, λ©”μ†Œλ“œλŠ” λ‹¨μˆœνžˆ 클래슀 λ‚΄λΆ€μ˜ ν•¨μˆ˜λ₯Ό μ˜λ―Έν•¨.

class Calculator: # 클래슀 μ •μ˜
  def add(self, a, b):
    print(a + b)
  def minus(self, a, b):
    print(a - b)

calculator = Calculator() # 객체 생성
calculator.add(1, 2) # 생성 된 객체 λ©”μ†Œλ“œ 호좜

calculator = Calculator() # 또 λ‹€λ₯Έ 객체 생성
calculator.minus(2, 1) # 생성 된 객체 λ©”μ†Œλ“œ 호좜

 - Calculator 클래슀λ₯Ό ν˜ΈμΆœν•΄μ„œ λ©”μ„œλ“œλ₯Ό λΆ€λ₯΄λŠ” 뢀뢄은 

 

(4) λ©”μ†Œλ“œμ˜ μ •μ˜

 - 클래슀 λ‚΄λΆ€μ˜ μ •μ˜ λ˜μ–΄μžˆλŠ” ν•¨μˆ˜λ₯Ό λ©”μ†Œλ“œλΌκ³  λ§ν•œλ‹€.

[1] self λ§€κ°œλ³€μˆ˜

 - ν•΄λ‹Ή λ§€κ°œλ³€μˆ˜λŠ” self 자기 μžμ‹  즉, ν•΄λ‹Ή 클래슀의 정보λ₯Ό λ‹΄κ³ μžˆλ‹€.

 - self λ§€κ°œλ³€μˆ˜ μ‚¬μš©μ‹œμ—λŠ” λͺ¨λ“  λ©”μ†Œλ“œμ˜ 첫번째 λ§€κ°œλ³€μˆ˜λ‘œ μ¨μ•Όν•œλ‹€.

 - 객체 μžμ‹ μ„ μ°Έμ‘°ν•˜μ—¬ 클래슀 μ •μ˜μ— ν¬ν•¨λœ 멀버에 μ ‘κ·Ό μ‹œ μ‚¬μš©ν•œλ‹€.

class test:
  def abc(self): # ν•¨μˆ˜ ν˜ΈμΆœμ‹œ μžλ™μœΌλ‘œ self에 ν•΄λ‹Ή 클래슀λ₯Ό λ„˜κ²¨μ€Œ
   self.age = 100
   print(self.a)

test().abc()

 - selfλŠ” μ—¬λŸ¬ 객체듀이 μžˆμ„λ•Œ, 각각의 κ³ μœ κ°’μ„ μ €μž₯ν•  수 있음.

 

(5) 초기자(μƒμ„±μž)

 - μ΄ˆκΈ°μžλŠ” 객체λ₯Ό μƒμ„±ν•˜λŠ” κ³Όμ •μ—μ„œ λ§€κ°œλ³€μˆ˜λ‘œ 값을 λ„£μœΌλ©΄, __init__ λ©”μ„œλ“œ(ν•¨μˆ˜)κ°€ 호좜이 되며 값을 μ΄ˆκΈ°ν™” ν•  수 μžˆλ‹€.

 - 사싀상 μƒμ„±μžλ₯Ό 초기자라고 λΆ€λ₯Έλ‹€. ( __init__ λ©”μ„œλ“œ μž„. )

class User:
    def __init__(self, name, age):
        self.name = name  # 멀버 λ³€μˆ˜μ— 전달받은 κ°’ μ €μž₯
        self.age = age

    def introduce(self):
        print(f"μ•ˆλ…•ν•˜μ„Έμš”, 제 이름은 {self.name}이고 λ‚˜μ΄λŠ” {self.age}μ‚΄μ΄μ—μš”.")

# 객체 μƒμ„±ν•˜λ©΄μ„œ 초기자 μžλ™ 호좜됨
user1 = User("이름", 28)
user1.introduce()

 


2. 데이터 ν•„λ“œ 감좔기

(1) 데이터 은닉(data hiding)

 - 데이터 ν•„λ“œμ˜ 직접 변경을 λ°©μ§€ν•˜κΈ° μœ„ν•΄ μ‚¬μš©μžμ˜ 직접적 접근을 차단할 수 있음.

 - pulbicκ³Ό λ‹€λ₯Έ private 데이터 ν•„λ“œλ‘œ μ •μ˜

 - 클래슀 λ‚΄λΆ€μ—μ„œλ§Œ 접근이 κ°€λŠ₯ν•˜κ²Œ λ§Œλ“€ 수 있음.

 - μ•ž 두 밑쀄(__)둜 μ •μ˜ ν•˜λ©΄ λœλ‹€.

- setter와 getterλ₯Ό ν™œμš©ν•˜μ—¬ 값을 λ³€κ²½ ν•  수 μžˆλ‹€. ( κ·Έλƒ₯ λ‹¨μˆœνžˆ λ‚΄λΆ€μ—μ„œ μ ‘κ·Όν•˜λŠ” ν•¨μˆ˜μ΄λ‹€. )

class User:
  
  def __init__(self, name, age):
    self.__name = name # 접근은 ν•΄λ‹Ή ν΄λž˜μŠ€μ—μ„œλ§Œ κ°€λŠ₯
    self.__age = age

  def get_name(self): # κ°€λŠ₯ν•˜κ²Œ λ§Œλ“€κΈ° μœ„ν•΄ getterλ₯Ό ν™œμš©
    return self.__name
  
  def get_age(self):
    return self.__age

user = User("junbin", 20)
print(user.get_name())
print(user.get_age())

 

(2) 데이터 은닉 μ‚¬μš©ν•˜λŠ” 이유

 - μ™ΈλΆ€μ—μ„œ 직접 데이터λ₯Ό μˆ˜μ •ν•˜λ©΄, 객체 μƒνƒœκ°€ μ˜ˆμƒμΉ˜ λͺ»ν•˜κ²Œ 변경될 μœ„ν—˜μ΄ 있음.

 - λ‚˜μ€‘μ— λ‚΄λΆ€ λ‘œμ§μ„ 바꿔도 μ™ΈλΆ€ μΈν„°νŽ˜μ΄μŠ€(get, set λ©”μ„œλ“œ)λŠ” κ·ΈλŒ€λ‘œ 두면 λ˜λ―€λ‘œ μœ μ§€λ³΄μˆ˜κ°€ μ‰¬μ›Œμ§.

 - λ³€μˆ˜λ§ˆλ‹€ 읽기 μ „μš©μ΄λ‚˜ μ“°κΈ° μ „μš©μ²˜λŸΌ λ™μž‘ν•˜κ²Œ λ§Œλ“€ 수 있음.

 


3. 정리

 - 파이썬의 λͺ¨λ“  것은 객체(Object) 이닀.

num = 1
print(type(num))  # κ²°κ³Ό : <class 'int'>
# 즉, num = int(1) ν˜•νƒœμΈ 것인데 μƒλž΅μ΄ λœκ²ƒμ΄λ‹€.

 - num = int(1) κ³Ό num = 1 은 같은 ν˜•νƒœμ΄κ³ , 파이썬이 λ‚΄λΆ€μ μœΌλ‘œ μ €λ ‡κ²Œ λ§Œλ“€μ–΄ μ£ΌλŠ” 것이닀.

 - 즉, νŒŒμ΄μ¬μ€ λͺ¨λ“  것이 객체이닀.