Helloπ I'm Dona!:)
κ°μ²΄ μ§ν₯νλ‘κ·Έλλ° μμ΄λ‘λ OOP(Object-Oriented-Programming) μ 리νκΈ° 3ν! π‘
κ°μ²΄μ§ν₯ νλ‘κ·Έλλ°μμ, ν΄λμ€ μμμ μ¬μ©λλ ν¨μμΈ λ©μλμ μ’ λ₯μλ ν¬κ² 3κ°μ§κ° μλ€.
- μΈμ€ν΄μ€ λ³μμ κ°μ μ½κ±°λ μ€μ νλ λ©μλμΈ μΈμ€ν΄μ€ λ©μλ(instance method)
- ν΄λμ€ λ³μμ κ°μ μ½κ±°λ μ€μ νλ λ©μλμΈ ν΄λμ€ λ©μλ(class method)
- μΈμ€ν΄μ€ λ³μ, ν΄λμ€ λ³μλ₯Ό μ ν λ€λ£¨μ§ μλ λ©μλμΈ μ μ λ©μλ(static method)
μ°¨κ·Όμ°¨κ·Ό μ½λμ ν¨κ» μμ보μπ
1. μΈμ€ν΄μ€ λ©μλ(instance method)
- μΈμ€ν΄μ€ λ³μ 1μ κ°μ μ½κ±°λ μ€μ νλ λ©μλ
- μΈμ€ν΄μ€ λ©μλλ₯Ό μ¬μ©νλ λ°©λ² (2λ² λ°©λ²μ λ§μ΄ μ¬μ©νλ€)
{ν΄λμ€ μ΄λ¦}.{λ©μλ μ΄λ¦}({μΈμ€ν΄μ€})
: ν΄λμ€μμ λ©μλλ₯Ό νΈμΆ{μΈμ€ν΄μ€ μ΄λ¦}.{λ©μλ μ΄λ¦}( )
: μΈμ€ν΄μ€μμ λ©μλλ₯Ό νΈμΆ, κ΄νΈ μμ λΉμ΄λ€. μμ μΈκΈν κ΄νΈ μμ νλΌλ―Έν°λ‘ μ λ¬λμλ€κ³ μκ°νκ³ μλ΅νλ€. β‘οΈ κ·Έλμ νμ΄μ¬μμλ μΈμ€ν΄μ€ λ©μλμ 첫λ²μ§Έ νλΌλ―Έν° μ΄λ¦μ 'self' λ‘ μ°κΈ°λ‘ μ½μνλ€.
βνλΌλ―Έν°κ° λ κ° μ΄μμ΄λ©΄, ν΄λΉ μΈμ€ν΄μ€κ° μλμΌλ‘ 첫λ²μ§Έ νλΌλ―Έν°(self )κ° λλ€.
λ°λ‘ μ½λμ ν¨κ» νμΈν΄λ³΄μ! π
class User:
# μΈμ€ν΄μ€λ₯Ό ν리미ν°λ‘ λ°λ μΈμ€ν΄μ€ λ©μλ, μΈμ€ν΄μ€ λ³μμ κ°μ μ€μ νκ±°λ μΆλ ₯
def say_hello(self):
print(f"μλ
νμΈμ! μ λ {self.name}μ
λλ€.")
# νλΌλ―Έν°κ° λ κ° μ΄μμΈ μΈμ€ν΄μ€ λ©μλ
def login(self, my_email, my_password):
if (self.email == my_email and self.password == my_password):
print('λ‘κ·ΈμΈ μ±κ³΅, νμν©λλ€')
else:
print('λ‘κ·ΈμΈ μ€ν¨, μλ μμ΄λμ΄κ±°λ μλͺ»λ λΉλ°λ²νΈμ
λλ€.')
# User ν΄λμ€μ μΈμ€ν΄μ€ μμ±
user1 = User()
# μΈμ€ν΄μ€ λ³μ μ μ : μΈμ€ν΄μ€ μμ λ§μ μμ±
# {μΈμ€ν΄μ€ μ΄λ¦}.{μΈμ€ν΄μ€ λ³μ} = {μΈμ€ν΄μ€ μ΄λ¦}.{μμ± μ΄λ¦}
user1.name = 'dona'
user1.email = 'iminj1995@gmail.com'
user1.password = '1234'
## μΈμ€ν΄μ€ λ©μλ μ¬μ©νκΈ°
# 1. {ν΄λμ€ μ΄λ¦}.{λ©μλ μ΄λ¦}({μΈμ€ν΄μ€})
User.say_hello(user1) # out : μλ
νμΈμ! μ λ donaμ
λλ€.
# 2. {μΈμ€ν΄μ€ μ΄λ¦}.{λ©μλ μ΄λ¦}( ) : κ΄νΈ μμ κΌ λΉμ°κΈ°!
user1.say_hello() # out : μλ
νμΈμ! μ λ donaμ
λλ€.
# κ΄νΈ μμ μ±μ°λ©΄ errorκ° λλ€.
user1.say_hello(user1) # TypeError: say_hello() takes 1 positional argument but 2 were given
## νλΌλ―Έν°κ° λκ° μ΄μμΈ μΈμ€ν΄μ€ λ©μλ μ¬μ©νκΈ°
# μκΈ°μμ μΈ selfλ κΌ λΉμμ€λ€.
user1.login('iminj1995@gmail.com', '1234') # out : λ‘κ·ΈμΈ μ±κ³΅, νμν©λλ€
user1.login(user1, 'iminj1995@gmail.com', '1234') # out : TypeError: login() takes 3 positional arguments but 4 were given
μ½λμμ λ³Ό μ μλ―, {μΈμ€ν΄μ€ μ΄λ¦}.{λ©μλ μ΄λ¦}(μΈμ€ν΄μ€)
μ ννλ‘ μΈμ€ν΄μ€ λ©μλλ₯Ό μ¬μ©ν λ κ΄νΈ μμ μΈμ€ν΄μ€λ₯Ό λ£μΌλ©΄ μΈμμ κ°μλ₯Ό μ΄κ³Όνμλ€λ error λ©μΈμ§κ° λ¬λ€. νμ μ£Όμνμ!
π νΉμ λ©μλ(magic method)
ν΄λμ€ λ©μλλ‘ λμ΄κ°κΈ° μ μ, μ§λ ν¬μ€ν μμ μΈκΈνμλ νΉμ λ©μλμ λν΄ μμ보μ.(λ§€μ° μ€μνλ€)
- νΉμ λ©μλλ magic method, special method, double underscore, dunder method λ± λ€μνκ² λΆλ¦¬λ©°, νΉμ μν©μμ μλμΌλ‘ νΈμΆλλ λ©μλλ₯Ό λ§νλ€.
- νΉμ λ©μλμ μ’ λ₯λ μ¬λ¬κ°μ§κ° μλλ°, ν΄λΉ ν¬μ€ν μμλ κ°μ²΄ μ§ν₯ νλ‘κ·Έλλ°μ μν΄μ κΌ μμμΌνλ __init__λ©μλμ __str__λ©μλ λκ°μ§λ§ λ€λ£¨μ΄λ³Έλ€.
π __ init __ λ©μλ [μ΄λ λ©μλ]
- μΈμ€ν΄μ€κ° μμ±λ λ μλμΌλ‘ νΈμΆνλ λ©μλ
- __init__λ©μλλ₯Ό μ¬μ©νλ©΄ μ½λκ° ν¨μ¬ κ°κ²°ν΄μ§μ λλ μ μλ€. π
'''μ΄μ μ μ¬μ©νλ μ½λμ ν¨κ» __init__λ©μλμ νΈλ¦¬ν¨μ λ껴보μ!''' # κΈ°μ‘΄ μ½λ class User: pass # User ν΄λμ€μ μΈμ€ν΄μ€ μμ± user1 = User() # μΈμ€ν΄μ€ λ³μ μ μ : μΈμ€ν΄μ€ μμ λ§μ μμ± user1.name = 'dona' user1.email = 'iminj1995@gmail.com' user1.password = '1234' # ---------------------------------------------------------------------- # __init__λ©μλλ₯Ό μ¬μ©ν μ½λ class User: def __init__(self, name, email, password): self.name = name self.email = email self.password = password # User ν΄λμ€μ μΈμ€ν΄μ€ μμ± + μΈμ€ν΄μ€ λ³μ μ μ user1 = User('dona', 'iminj1995@gmail.com', '1234') # ---------------------------------------------------------------------- '''__init__λ©μλκ° μλ λ©μλλ‘ μ μν΄μ€λ€λ©΄ μλμ κ°μ΄ μμ±μ΄ κ°λ₯νλ€. __init__λ©μλ μ²λΌ μΈμ€ν΄μ€ λ³μ μ μκΉμ§ λ°λ‘ ν μ μκΈ°λλ¬Έμ μ½λκ° λ κΈΈμ΄μ§λ€.''' class User: def initialize(self, name, email, password): self.name = name self.email = email self.password = password # User ν΄λμ€μ μΈμ€ν΄μ€ μμ± user1 = User() # μΈμ€ν΄μ€ λ³μ μ μ user1.initialize('dona', 'iminj1995@gmail.com', '1234')β
π __ str__ λ©μλ [λλ μμ€ν°μ]
- print ν¨μλ₯Ό μ¬μ©ν λ, μλμΌλ‘ νΈμΆ
- μΈμ€ν΄μ€λ₯Ό μΆλ ₯ν λ μ°λ¦¬κ° μνλ μ 보λ₯Ό printνκ³ μΆμ λ μ¬μ©
class User: def __init__(self, name, email, password): self.name = name self.email = email self.password = password def __str__(self): return f"μ¬μ©μ: {self.name}, μ΄λ©μΌ: {self.email}, λΉλ°λ²νΈ: ****" # User ν΄λμ€μ μΈμ€ν΄μ€ μμ± + μΈμ€ν΄μ€ λ³μ μ μ user1 = User('dona', 'iminj1995@gmail.com', '1234') # print instance print(user1) # out : μ¬μ©μ: dona, μ΄λ©μΌ: iminj1995@gmail.com, λΉλ°λ²νΈ: ****β
2. ν΄λμ€ λ©μλ(class method)
- ν΄λμ€ λ³μ 2μ κ°μ μ½κ±°λ μ€μ νλ λ©μλ
- ν΄λμ€ λ©μλλ₯Ό μ¬μ©νλ λ°©λ² : μΈμ€ν΄μ€ λ©μλ μ¬μ©λ²κ³Ό λ€λ₯΄κ², λ λ€ μ²«λ²μ§Έ νλΌλ―Έν°λ‘ ν΄λμ€ μλ μ λ¬ν¨
β‘οΈ μΈμ€ν΄μ€ λ©μλμ λ§μ°¬κ°μ§λ‘, κ·Έλμ νμ΄μ¬μμλ ν΄λμ€ λ©μλμ 첫λ²μ§Έ νλΌλ―Έν° μ΄λ¦μ 'cls'(classμ μ½μ) λ‘ μ°κΈ°λ‘ μ½μνλ€.{ν΄λμ€ μ΄λ¦}.{λ©μλ μ΄λ¦}( )
{μΈμ€ν΄μ€ μ΄λ¦}.{λ©μλ μ΄λ¦}( )
- ν΄λμ€ λ©μλλ₯Ό λ§λ€ λλ, @classmethod λΌλ λ°μ½λ μ΄ν°λ₯Ό μ¬μ©ν΄μΌνλ€. 3
3. μ μ λ©μλ(static method)
- μΈμ€ν΄μ€ λ³μ, ν΄λμ€ λ³μλ₯Ό μ ν λ€λ£¨μ§ μλ λ©μλ
- λ°λΌμ μΈμ€ν΄μ€ λ©μλμμ μ¬μ©ν self, ν΄λμ€ λ©μλμμ μ¬μ©ν clsμ κ°μ΄ μ λ¬λλ νλΌλ―Έν°κ° μλ€.
- μ΄λ ν μμ±μ λ€λ£¨μ§ μκ³ , λ¨μ§ κΈ°λ₯(νλ)μ μΈ μν λ§ νλ λ©μλλ₯Ό μ μν λ μ¬μ©
- μ μ λ©μλλ₯Ό μ¬μ©νλ λ°©λ² : μΈμ€ν΄μ€, ν΄λμ€λ₯Ό ν΅ν΄μ λͺ¨λ μ¬μ© κ°λ₯
{ν΄λμ€ μ΄λ¦}.{λ©μλ μ΄λ¦}( )
{μΈμ€ν΄μ€ μ΄λ¦}.{λ©μλ μ΄λ¦}( )
- μ μ λ©μλλ₯Ό λ§λ€ λλ, ν΄λμ€ λ©μλμ λΉμ·νκ² @staticemethod λΌλ λ°μ½λ μ΄ν° ν¨μλ₯Ό νμν΄μ£Όμ΄μΌνλ€.
π» ν΄λμ€ λ©μλμ μ μ λ©μλλ₯Ό κ°μ΄ μ½λλ‘ μ 리ν΄λ³΄μ
class User:
# ν΄λμ€ λ³μ μ μ
count = 0
def __init__(self, name, email, password):
self.name = name
self.email = email
self.password = password
User.count += 1
def __str__(self):
return f"μ¬μ©μ μ΄λ¦ : {self.name}, μ΄λ©μΌ : {self.email}"
# ν΄λμ€ λ©μλ : ν΄λμ€λ₯Ό ν리미ν°λ‘ λ°λ ν΄λμ€ λ©μλ, ν΄λμ€ λ³μμ κ°μ μ€μ νκ±°λ μΆλ ₯
@classmethod
def number_of_users(cls):
print(f"μ΄ μ μ μλ {cls.count}μ
λλ€.")
# μ μ λ©μλ : κΈ°λ₯μ μΈ μν λ§ νλ€, μΈμ€ν΄μ€ λ³μλ ν΄λμ€ λ³μ λ λ€ μ¬μ©νμ§ μμ λ
@staticmethod
def is_valid_email(email):
'''νλΌλ―Έν°λ‘ λ°μ emailμ @μ΄ λ€μ΄μλμ§ νμΈ'''
return "@" in email
# User ν΄λμ€μ μΈμ€ν΄μ€ μμ±
user1 = User('dona', 'iminj1995@gmail.com', '1234')
user2 = User('salmon', 'salmon@gmail.com', '3456')
user3 = User('lee_king_hee', 'kayyounghl@gmail.com', '5678')
user4 = User('teco', 'teco@gmail.com', '6789')
# ν΄λμ€ λ©μλ μ¬μ©νκΈ°
# {ν΄λμ€ μ΄λ¦}.{λ©μλ μ΄λ¦}( ), {μΈμ€ν΄μ€ μ΄λ¦}.{λ©μλ μ΄λ¦}( ) λ λ°©λ² λͺ¨λ κ°λ₯
User.number_of_users() # out : μ΄ μ μ μλ 4μ
λλ€.
user1.number_of_users() # out : μ΄ μ μ μλ 4μ
λλ€.
# μ μ λ©μλ μ¬μ©νκΈ° : ν΄λμ€ μΈμ€ν΄μ€ λͺ¨λ μ¬μ© κ°λ₯
print(User.is_valid_email('hello')) # out : False
print(user1.is_valid_email('hello@tistory.com')) # out : True
π μ΄ μ 리 : μ μ ν λ©μλ μ¬μ©νκΈ°
- μΈμ€ν΄μ€ λ³μλ₯Ό μ¬μ©νλ€
β‘οΈ μΈμ€ν΄μ€ λ©μλ - μΈμ€ν΄μ€ μμ΄λ νμν μ λ³΄κ° μλ€ : μ½λ μμμμ User ν΄λμ€μμ μ μ κ° λͺλͺ
μΈμ§λ₯Ό μλ €μ£Όλ countλ μΈμ€ν΄μ€κ° νλλ μλλΌλ 0λͺ
μ΄λΌλ μ λ³΄κ° νμν¨! (ν΄λμ€ λ©μλλ₯Ό μ¬μ©νλ μ΄μ )
β‘οΈ ν΄λμ€ λ©μλ (μΈμ€ν΄μ€κ° νλλ μμ΄λ μ¬μ© κ°λ₯) - μΈμ€ν΄μ€ λ³μμ ν΄λμ€ λ³μ μ€ μ무κ²λ μ¬μ©νμ§ μλλ€. κΈ°λ₯μ μΈ μν λ§ νλ λ©μλκ° νμνλ€
β‘οΈ μ μ λ©μλ - μΈμ€ν΄μ€ λ³μμ ν΄λμ€ λ³μ λͺ¨λ μ¬μ© : μλ μ½λ μμμμ __init__ λ©μλ
β‘οΈ μΈμ€ν΄μ€ λ©μλ (μΈμ€ν΄μ€ λ³μ ,ν΄λμ€ λ³μ λͺ¨λ μ¬μ© κ°λ₯)
'''κ° λ©μλ μ΄μ 리 example'''
class User:
# ν΄λμ€ λ³μ μ μ
count = 0
# μΈμ€ν΄μ€ λ©μλ
'''μΈμ€ν΄μ€ λ³μμΈ self.name, self.email, self.password
ν΄λμ€ λ³μμΈ User.count μ¬μ©'''
def __init__(self, name, email, password):
self.name = name
self.email = email
self.password = password
User.count += 1
# ν΄λμ€ λ©μλ
'''ν΄λμ€ λ³μμΈ cls.count μ¬μ©'''
@classmethod
def number_of_users(cls):
print("μ΄ μ μ μλ: {}μ
λλ€".format(cls.count))
# μ μ λ©μλ
'''μΈμ€ν΄μ€ λ³μ, ν΄λμ€ λ³μ μ무 κ²λ μ¬μ©νμ§ μμ'''
@staticmethod
def is_valid_email(email_address):
return "@" in email_address
π Reference
π‘ ν΄λΉ λΈλ‘κ·Έ OOP series
- [OOP] (1) ν΄λμ€, κ°μ²΄, μΈμ€ν΄μ€, κ°μ²΄μ§ν₯ vs μ μ°¨μ§ν₯ νλ‘κ·Έλλ° μ μ
- [OOP] (2) μΈμ€ν΄μ€ λ³μμ ν΄λμ€ λ³μ
- [OOP] (3) λ©μλμ μ’ λ₯ : μΈμ€ν΄μ€ λ©μλ, ν΄λμ€ λ©μλ, μ μ λ©μλ (with νμ΄μ¬ μ½λ) & νΉμλ©μλ
π κ°μ£Ό
- μΈμ€ν΄μ€ μμ λ§μ μμ±(Attribute), κ³ μ ν λ³μλ₯Ό λ§νλ€. μμΈν λ΄μ©μ μ§λ ν¬μ€ν μμ νμΈμ΄ κ°λ₯νλ€. [λ³Έλ¬ΈμΌλ‘]
- κ°μ ν΄λμ€μ λͺ¨λ μΈμ€ν΄μ€λ€μ΄ 곡μ νλ μμ±μ λ§νλ€. μμΈν λ΄μ©μ μ§λ ν¬μ€ν μμ νμΈμ΄ κ°λ₯νλ€. [λ³Έλ¬ΈμΌλ‘]
- ν¨μλ₯Ό νλΌλ―Έν°λ‘ λ°μμ, ν¨μλ₯Ό return ν΄μ£Όλ ν¨μλ‘, κΈ°μ‘΄μ ν¨μμ μλ‘μ΄ κΈ°λ₯μ μΆκ°νλ€κ³ μ΄ν΄νλ©΄ μ½λ€. μΆν ν¬μ€ν μμ μ΄λ νμκ° κ³΅λΆνλ©΄μ μ°Έκ³ ν λΈλ‘κ·Έλ μ¬κΈ°λ₯Ό ν΄λ¦ [λ³Έλ¬ΈμΌλ‘]