λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

🐍 Python/OOP

[OOP] (2) μΈμŠ€ν„΄μŠ€ λ³€μˆ˜μ™€ 클래슀 λ³€μˆ˜

HelloπŸ‘‹ I'm Dona!:)

객체 지ν–₯ν”„λ‘œκ·Έλž˜λ° μ˜μ–΄λ‘œλŠ” OOP(Object-Oriented-Programming)에 λŒ€ν•΄ μ •λ¦¬ν•˜κΈ° 2탄! 🏑


πŸ” μΈμŠ€ν„΄μŠ€ λ³€μˆ˜(instance variable)

μ§€λ‚œ ν¬μŠ€νŒ…μ—μ„œ μ–ΈκΈ‰ν–ˆλ“―, μΈμŠ€ν„΄μŠ€λŠ” 객체λ₯Ό 싀체화 μ‹œν‚¨ κ²ƒμœΌλ‘œ 클래슀둜 λ§Œλ“€ 수 μžˆλ‹€.

μ˜€λŠ˜λ„ μΈμŠ€ν„΄μŠ€ λ³€μˆ˜ μœ„ν‚€λ°±κ³Όλ₯Ό λ¨Όμ € 짚고 λ„˜μ–΄κ°€μž

ν΄λž˜μŠ€κ°€ μžˆλŠ” 객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ—μ„œ μΈμŠ€ν„΄μŠ€ λ³€μˆ˜(instance variable)λŠ” ν΄λž˜μŠ€μ— μ •μ˜λœ λ³€μˆ˜λ‘œ, μΈμŠ€ν„΄μŠ€ λ³€μˆ˜λŠ” 클래슀 λ³€μˆ˜μ™€ λΉ„μŠ·ν•˜λ‹€. μΈμŠ€ν„΄μŠ€ λ³€μˆ˜λŠ” 클래슀 λ³€μˆ˜κ°€ μ•„λ‹ˆμ§€λ§Œ μœ μ‚¬μ μ΄ μžˆλ‹€. 
클래슀 속성(클래슀 ν”„λ‘œνΌν‹°, ν•„λ“œ, 데이터 멀버)의 일쒅이닀. ν΄λž˜μŠ€λŠ” μΈμŠ€ν„΄μŠ€ λ©”μ†Œλ“œμ™€ 클래슀 λ©”μ†Œλ“œλ₯Ό λ‘˜ λ‹€ μ†Œμœ ν•  수 μžˆλ‹€.

λ³€μˆ˜λŠ” μ˜€λΈŒμ νŠΈκ°€ 자기 μžμ‹ μ„ μ•Œκ³  μžˆλŠ” 속성이닀. 였브젝트의 λͺ¨λ“  μΈμŠ€ν„΄μŠ€λ“€μ€ μžμ‹ λ§Œμ˜ μΈμŠ€ν„΄μŠ€ λ³€μˆ˜μ˜ 사본을 가지고 있으며, 값이 κ°μ²΄λ§ˆλ‹€ λ™μΌν•˜λ‹€κ³  ν•˜λ”λΌλ„ κ·ΈλŸ¬ν•˜λ‹€. ν•˜λ‚˜μ˜ 객체 μΈμŠ€ν„΄μŠ€λŠ” λ‹€λ₯Έ λͺ¨λ“  μΈμŠ€ν„΄μŠ€μ— 영ν–₯을 λ―ΈμΉ˜μ§€ μ•Šκ³ μ„œλ„ μΈμŠ€ν„΄μŠ€ λ³€μˆ˜λ“€μ˜ 값을 λ°”κΏ€ 수 μžˆλ‹€. μΈμŠ€ν„΄μŠ€ λ³€μˆ˜λ“€μ€ λ©”μ†Œλ“œκ°€ μ •μ μœΌλ‘œ μ„ μ–Έλ˜μ–΄ μžˆμ§€ μ•Šμ€ 경우 λͺ¨λ“  클래슀 λ©”μ†Œλ“œλ“€μ— μ˜ν•΄ μ‚¬μš©λ  수 μžˆλ‹€.

μΈμŠ€ν„΄μŠ€ λ©”μ†Œλ“œ, 클래슀 λ©”μ†Œλ“œ, 정적 λ©”μ†Œλ“œ λ“± λ©”μ†Œλ“œμ™€ κ΄€λ ¨λœ λ‚΄μš©λ“€μ΄ λ§Žμ€λ° ν•΄λ‹Ή λ‚΄μš©μ€ λ‹€μŒ ν¬μŠ€νŒ…μ—μ„œ λ‹€λ£° μ˜ˆμ •! 🧚‍♀️

이제 μ‰½κ²Œ μ •λ¦¬ν•΄λ³΄μž!

 

  • μΈμŠ€ν„΄μŠ€ λ³€μˆ˜λŠ” μΈμŠ€ν„΄μŠ€ μžμ‹ λ§Œμ˜ 속성(Attribute), κ³ μœ ν•œ λ³€μˆ˜λ₯Ό λ§ν•œλ‹€.
  • μ½”λ“œλ‘œ μ“°λ©΄ {μΈμŠ€ν„΄μŠ€μ˜ 이름}.{μΈμŠ€ν„΄μŠ€ λ³€μˆ˜} μ΄λ ‡κ²Œ μ“°μ΄λŠ”λ°, μΈμŠ€ν„΄μŠ€ λ³€μˆ˜ = 속성(Attribute)라고 μƒκ°ν•˜λ©΄ 쉽닀!
  • 미리 μ •μ˜λœ μΈμŠ€ν„΄μŠ€ λ³€μˆ˜λ§Œ μ‚¬μš©ν•  수 μžˆλ‹€.

백문이 λΆˆμ—¬μΌκ²¬μ΄λΌκ³ , μœ„μ˜ λ‚΄μš©λ“€μ„ μ½”λ“œλ‘œ 보자! πŸ‘€

# class λ§Œλ“€κΈ° : 클래슀의 이름은 항상 λŒ€λ¬Έμžλ‘œ μ‹œμž‘
class User:
	pass

# User 클래슀의 μΈμŠ€ν„΄μŠ€ user1, user2, user3 생성 : 같은 클래슀둜 λ§Œλ“€μ—ˆμ§€λ§Œ, 각각 λ‹€λ₯Έ μΈμŠ€ν„΄μŠ€
user1 = User()
user2 = User()
user3 = User()

# μΈμŠ€ν„΄μŠ€ λ³€μˆ˜ μ •μ˜ : μΈμŠ€ν„΄μŠ€ μžμ‹ λ§Œμ˜ 속성
# {μΈμŠ€ν„΄μŠ€ 이름}.{μΈμŠ€ν„΄μŠ€ λ³€μˆ˜} = {μΈμŠ€ν„΄μŠ€ 이름}.{속성 이름}
user1.name = 'dona'
user1.email = 'iminj1995@gmail.com'
user1.password = '1234'

user2.name = 'mimi'
user2.email = 'mimi@gmail.com'
user2.password = '5678'

# μΈμŠ€ν„΄μŠ€ λ³€μˆ˜ μ‚¬μš©ν•΄λ³΄κΈ°
print(user1.name)
# out : dona

# μ—†λŠ” μΈμŠ€ν„΄μŠ€ λ³€μˆ˜λŠ” error : 미리 μ •μ˜λœ μΈμŠ€ν„΄μŠ€ λ³€μˆ˜λ§Œ μ‚¬μš©ν•  수 μžˆλ‹€.
print(user1.age)
# out : AttributeError : 'User' object has no attribute 'age'

 

πŸ” 클래슀 λ³€μˆ˜(class variable)

ν΄λž˜μŠ€κ°€ μžˆλŠ” 객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ—μ„œ 클래슀 λ³€μˆ˜(class variable)λŠ” 클래슀의 μΈμŠ€ν„΄μŠ€κ°€ μ–Όλ§ˆλ‚˜ 많이 μ‘΄μž¬ν•˜λŠ”μ§€μ— 관계 없이, ν•˜λ‚˜μ˜ 사본이 μ‘΄μž¬ν•˜λŠ” ν΄λž˜μŠ€μ— μ •μ˜λœ λ³€μˆ˜μ΄λ‹€.
클래슀 λ³€μˆ˜λŠ” μΈμŠ€ν„΄μŠ€ λ³€μˆ˜κ°€ μ•„λ‹ˆλ‹€. 이것은 νŠΉλ³„ν•œ μ’…λ₯˜μ˜ 클래슀 속성(λ˜λŠ” 클래슀 ν”„λ‘œνΌν‹°, ν•„λ“œ, 데이터 멀버)이닀. ν΄λž˜μŠ€λŠ” μΈμŠ€ν„΄μŠ€ λ©”μ†Œλ“œμ™€ 클래슀 λ©”μ†Œλ“œλ₯Ό λ‘˜ λ‹€ μ†Œμœ ν•  수 μžˆλ‹€. -클래슀 λ³€μˆ˜ μœ„ν‚€λ°±κ³Ό

μœ„ν‚€ λ°±κ³Όμ—μ„œ ν•˜λ‚˜μ˜ 사본이 μ‘΄μž¬ν•˜λŠ” ν΄λž˜μŠ€μ— μ •μ˜λœ λ³€μˆ˜λΌκ³  ν–ˆλŠ”λ°, μ‰½κ²Œ μƒκ°ν•΄λ³΄μž

μΈμŠ€ν„΄μŠ€ λ³€μˆ˜λŠ” μΈμŠ€ν„΄μŠ€ μžμ‹ λ§Œμ˜ 속성을 λ§ν•œλ‹€. 클래슀 λ³€μˆ˜λŠ” 클래슀의 속성을 λ§ν•œλ‹€. λ”μš± μ •ν™•ν•˜κ²Œ μ •λ¦¬ν•˜λ©΄ μ•„λž˜μ™€ κ°™λ‹€.

 

클래슀 λ³€μˆ˜ : 같은 클래슀의 λͺ¨λ“  μΈμŠ€ν„΄μŠ€λ“€μ΄ κ³΅μœ ν•˜λŠ” 속성

  • 클래슀 λ³€μˆ˜λ₯Ό μ½λŠ” 방법은 μ•„λž˜μ˜ 2가지 : {클래슀 이름}.{클래슀 λ³€μˆ˜ 이름}, {μΈμŠ€ν„΄μŠ€ 이름}.{클래슀 λ³€μˆ˜ 이름}
  • 클래슀 λ³€μˆ˜ 값을 μˆ˜μ • λ˜λŠ” μ„€μ •ν•˜λŠ” 방법 : {클래슀 이름}.{클래슀 λ³€μˆ˜} μ΄λ¦„λ§Œ κ°€λŠ₯ν•˜λ‹€.

➑️ κ²°λ‘  : 읽을 λ•ŒλŠ” μΈμŠ€ν„΄μŠ€μ™€ 클래슀 μ΄λ¦„μœΌλ‘œ λͺ¨λ‘ κ°€λŠ₯ν•˜μ§€λ§Œ, μ„€μ •μ΄λ‚˜ μˆ˜μ •μ€ 클래슀 μ΄λ¦„μœΌλ‘œλ§Œ κ°€λŠ₯ν•˜λ‹€.

μΈμŠ€ν„΄μŠ€ λ³€μˆ˜μ™€ ν—·κ°ˆλ¦΄ 수 있기 λ•Œλ¬Έμ—, 클래슀 λ³€μˆ˜μ— 값을 μ„€μ •ν•  λ•ŒλŠ” 클래슀 μ΄λ¦„μœΌλ‘œλ§Œ μ •μ˜ν•˜λŠ” 것이 μ’‹λ‹€.

 

λ§ˆμ°¬κ°€μ§€λ‘œ μ½”λ“œλ‘œ λ΄…μ‹œλ‹€πŸ‘€

class User:
    # countλΌλŠ” 클래슀 λ³€μˆ˜ μ •μ˜
    count = 0
    
    # μ•„λž˜ λ‚΄μš©μ€ λ‹€μŒ ν¬μŠ€νŒ…(λ©”μ†Œλ“œμ˜ μ’…λ₯˜)μ—μ„œ λ‹€λ£° μ˜ˆμ •
    def __init__(self, name, email, password):
        self.name = name
        self.email = email
        self.password = password
        
        User.count += 1 # μΈμŠ€ν„΄μŠ€κ°€ μ •μ˜λ λ•Œλ§ˆλ‹€ 클래슀 λ³€μˆ˜μΈ count +1
        
user1 = User("dona", "iminj1995@gmail.com", "1234")
user2 = User("mimi", "mimi@gmail.com", "5678")

## 클래슀 λ³€μˆ˜ κ°’ 읽기
# {클래슀 이름}.{클래슀 λ³€μˆ˜μ΄λ¦„}
print(User.count)
# out : 2

# {μΈμŠ€ν„΄μŠ€ 이름}.{클래슀 λ³€μˆ˜μ΄λ¦„}
print(user1.count)
# out : 2
print(user2.count)
# out : 2

## 클래슀 λ³€μˆ˜ κ°’ μˆ˜μ •ν•˜κΈ° : {클래슀 이름}.{클래슀 λ³€μˆ˜μ΄λ¦„}만 κ°€λŠ₯ν•˜λ‹€
User.count = 5

# 확인
print(User.count)
# out : 5

'''{μΈμŠ€ν„΄μŠ€ 이름}.{클래슀 λ³€μˆ˜μ΄λ¦„}으둜 해도 클래슀 λ³€μˆ˜μΈ countλŠ” λ³€ν•˜μ§€ μ•Šμ§€λ§Œ, 
user2의 countκ°’λ§Œ λ°”λ€Œμ–΄ ν—·κ°ˆλ¦΄ 수 μžˆμœΌλ―€λ‘œ μ£Όμ˜ν•˜κΈ°'''
user1.count = 2
print(user1.count) # out : 2
print(user2.count) # out : 5
print(User.count) # out : 5

μΈμŠ€ν„΄μŠ€ λ³€μˆ˜μ™€ 클래슀 λ³€μˆ˜μ˜ 차이에 λŒ€ν•΄ μ•Œμ•„λ³΄μ•˜λ‹€. λ‹€μŒ ν¬μŠ€νŒ…μ—μ„œ λ©”μ†Œλ“œμ˜ μ’…λ₯˜μ— λŒ€ν•΄ λ‹€λ£¨μ–΄λ³΄μž!

πŸ“Ž Reference

🏑 ν•΄λ‹Ή λΈ”λ‘œκ·Έ OOP series