3.1 ํด๋์ค ์์ฑ
Python์์ ํด๋์ค ์์ฑ์ ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ (OOP)์ ์ค์ํ ๋ถ๋ถ์ด์ผ. ํด๋์ค๋ ์๋ก์ด ๋ฐ์ดํฐ ํ์ ์ ๋ง๋ค ์ ์๊ฒ ํด์ฃผ๊ณ , ์ด ๋ฐ์ดํฐ ํ์ ์ ๊ณ ์ ํ ์์ฑ๊ณผ ๋ฉ์๋๋ฅผ ๊ฐ์ง ์ ์์ด. Python์์ ํด๋์ค๋ฅผ ์์ฑํ๋ ๊ธฐ๋ณธ ๊ฐ๋ ๊ณผ ์์ ๋ฅผ ์ดํด๋ณด์.
๊ธฐ๋ณธ ๊ฐ๋
- ํด๋์ค: ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ธฐ ์ํ ํ ํ๋ฆฟ. ํด๋์ค๋ ํด๋น ํด๋์ค์ ๊ฐ์ฒด๋ค์ด ๊ฐ์ง ์์ฑ๊ณผ ๋ฉ์๋๋ฅผ ์ ์ํด.
- ๊ฐ์ฒด: ํด๋์ค์ ์ธ์คํด์ค. ๊ฐ์ฒด๋ ํด๋์ค์์ ์ ์๋ ๋ชจ๋ ์์ฑ๊ณผ ๋ฉ์๋๋ฅผ ๊ฐ์ง๊ณ ์์ด.
- ์์ฑ: ํด๋์ค๋ ๊ฐ์ฒด์ ์ฐ๊ฒฐ๋ ๋ณ์์ผ.
- ๋ฉ์๋: ํด๋์ค๋ ๊ฐ์ฒด์ ์ฐ๊ฒฐ๋ ํจ์์ผ.
์์ฑ์ ๊ธฐ๋ณธ์ ์ผ๋ก ๊ฐ์ฒด๋ ํด๋์ค ๋ด๋ถ์ ์๋ ๋ณ์์ผ. ๋ฉ์๋๋ ํด๋์ค ๋ด๋ถ์ ์ ์๋ ํจ์์ผ. ์ด ์ฉ์ด๋ค์ OOP์์ ์จ ๊ฑฐ๊ณ , ํจ์๋ ๋ณ์์ ๊ฐ์ด ์ฌ์ฉ๋ผ.
์๋ก์ด ํด๋์ค๋ฅผ ์ ์ธ(์์ฑ)ํ๋ ค๋ฉด class
ํค์๋๋ฅผ ์ฌ์ฉํด์ผ ํด.
์ด ์์
์ ์ผ๋ฐ์ ์ธ ๋ฌธ๋ฒ์ ๋ค์๊ณผ ๊ฐ์:
class ํด๋์ค์ด๋ฆ:
๋ณ์1 = ๊ฐ1
๋ณ์N = ๊ฐN
def ํจ์1(self):
ํจ์ ์ฝ๋
def ํจ์M(self):
ํจ์ ์ฝ๋
๊ธฐ๋ณธ์ ์ผ๋ก ํด๋์ค๋ ๋ณ์์ ํจ์๋ก ์ด๋ฃจ์ด์ง ์์ ํ๋ก๊ทธ๋จ์ด๊ณ , ํด๋์ค ์ด๋ฆ์ด๋ผ๋ ๋ณ๋์ ๊ณต๊ฐ์ ๋์ธ๋ค๊ณ ํ ์ ์์ด.
ํด๋์ค๋ฅผ ๋ง๋ ํ์๋ ํด๋น ํด๋์ค์ ๊ฐ์ฒด(์ธ์คํด์ค)๋ฅผ ์์ฑํ ์ ์์ด. ์ด ์ฝ๋๋ ๋ ๊ฐ๋จํ๊ฒ ๋ณด์ผ๊ฑฐ์ผ:
๋ณ์X = ํด๋์ค์ด๋ฆ()
์ค์!
Python์์ ๋ณ์์ ๋ฉ์๋ ์ด๋ฆ์ ์๋ฌธ์๋ก ์ฐ๋ ๊ฒ ์ผ๋ฐ์ ์ด์ผ. ํด๋์ค ์ด๋ฆ์ ๋๋ฌธ์๋ก ์์ํด์ผ ํด. ๋ํ ํด๋์ค ์ด๋ฆ์๋ ๋ฐ์ค์ ์ฌ์ฉํ์ง ์์. ํด๋์ค ์ด๋ฆ์ด ์ฌ๋ฌ ๋จ์ด๋ก ์ด๋ฃจ์ด์ ธ์ผ ํ๋ค๋ฉด, ๊ฐ ๋จ์ด๋ฅผ ๋๋ฌธ์๋ก ์์ํด.
ํด๋์ค/๊ฐ์ฒด์ ๋ณ์์ ์ ๊ทผํ๋ ค๋ฉด ์ผ๋ฐ์ ์ผ๋ก ๋ค์๊ณผ ๊ฐ์ด ์์ฑํด:
๋ณ์X.๋ณ์1 = 10
๋ณ์X.ํจ์M()
ํ์ง๋ง ์๋ ์ค๋ช ํ ๋ค๋ฅธ ์ฌํญ๋ ์์ดโฆ
3.2 ๊ฐ์ฒด ๋ค๋ฃจ๊ธฐ
ํด๋์ค์ ํด๋์ค์ ์ธ์คํด์ค(๊ฐ์ฒด)๋ ๋ ๋ค ๊ฐ์ฒด์ผ. ๊ทธ๋์ ๋ ๊ฐ์ง ๋ชจ๋ ๋ณ์์ ๋ฉ์๋๋ฅผ ๊ฐ์ง ์ ์์ด.
๋ณ์๋ ๋ ๊ฐ์ง ์ ํ์ด ์์ด:
-
ํด๋์ค ์์ฑ/๋ณ์/ํ๋
(class property)
-
๊ฐ์ฒด ์์ฑ/๋ณ์/ํ๋
(object property)
๊ทธ๋ฆฌ๊ณ ์ธ ๊ฐ์ง ์ ํ์ ๋ฉ์๋๊ฐ ์์ด:
-
ํด๋์ค ๋ฉ์๋/ํจ์
(class method)
-
์ธ์คํด์ค ๋ฉ์๋/ํจ์
(instance method)
-
์ ์ ๋ฉ์๋
(static method)
๋ฉ์๋๋ค์ ์ ์ธ ๋ฐฉ์๊ณผ ํธ์ถ ๋ฐฉ์์์ ์๋ก ๋ฌ๋ผ.
์ธ์คํด์ค ๋ฉ์๋
์ธ์คํด์ค ๋ฉ์๋๋ฅผ ์ ์ธํ๋ฉด ์ฒซ ๋ฒ์งธ ํ์ ๋งค๊ฐ๋ณ์๋ก self
๋ฅผ ์ ๋ฌํด์ผ ํด. ๋ฉ์๋๋ฅผ ํธ์ถํ ๋ ์ด ๋งค๊ฐ๋ณ์์๋ ๊ฐ์ฒด(์ธ์คํด์ค)์ ๋ํ ์ฐธ์กฐ๊ฐ ์ ๋ฌ๋ผ.
class MyClass:
def instance_method(self):
print(type(self)) # <class 'MyClass'>
my_object = MyClass()
my_object.instance_method()
์ ์์ ์์ instance_method()
ํจ์๊ฐ ์คํ๋๊ธฐ ์์ํ์ ๋, ๋งค๊ฐ๋ณ์ self
์ my_object
๊ฐ์ฒด์ ๋ํ ์ฐธ์กฐ๊ฐ ์ ๋ฌ๋์ด.
ํด๋์ค ๋ฉ์๋
ํด๋์ค ๋ฉ์๋๋ฅผ ์ ์ธํ ๋๋ ์ฒซ ๋ฒ์งธ ํ์ ๋งค๊ฐ๋ณ์๋ก cls
๋ฅผ ์ ๋ฌํด์ผ ํด. ๋ฉ์๋๋ฅผ ํธ์ถํ ๋ ํด๋์ค (class object)
์ ๋ํ ์ฐธ์กฐ๊ฐ ์ ๋ฌ๋ผ. ๋ํ, ํด๋์ค ๋ฉ์๋๋ ์๋ ์์ ์ฒ๋ผ classmethod
๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ๋ถ์ฌ์ผ ํด:
class MyClass:
def instance_method(self):
print(type(self)) # <class 'MyClass'>
@classmethod
def class_method(cls):
print(type(cls)) # <class 'type'>
my_object = MyClass()
my_object.instance_method()
MyClass.class_method()
์ ์์ ์์ class_method()
ํจ์๊ฐ ์คํ๋๊ธฐ ์์ํ์ ๋, ๋งค๊ฐ๋ณ์ cls
์ MyClass
ํด๋์ค์ ๋ํ ์ฐธ์กฐ๊ฐ ์ ๋ฌ๋์ด.
์ ์ ๋ฉ์๋
์ ์ ๋ฉ์๋๋ฅผ ์ ์ธํ ๋๋ ์๋ฌด๊ฒ๋ ์ ๋ฌํ์ง ์์๋ ๋ผ, ํ์ง๋ง ํด๋์ค์ ๋ด๋ถ ๋ฐ์ดํฐ์ ์ ๊ทผํ ์ ์์ด. ์๋ ์์ ์ฒ๋ผ ๋ฉ์๋์ staticmethod
๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ๋ถ์ฌ์ผ ํด:
class MyClass:
def instance_method(self):
print(type(self)) # <class 'MyClass'>
@classmethod
def class_method(cls):
print(type(cls)) # <class 'type'>
@staticmethod
def static_method():
return "์ด ๋ฉ์๋๋ ์ธ์คํด์ค๋ ํด๋์ค์ ์์กดํ์ง ์์"
my_object = MyClass()
my_object.instance_method()
MyClass.class_method()
MyClass.static_method()
์ ์ ๋ฉ์๋๋ ํด๋์ค ๋ฉ์๋์ ๋น์ทํ๊ฒ ํธ์ถ๋์ง๋ง, ๊ฐ์ฒด๋ ํด๋์ค์ ๋ํ ์ฐธ์กฐ๊ฐ ์ ๋ฌ๋์ง ์์.
3.3 ํด๋์ค ๋ณ์
ํด๋์ค ๋ณ์
ํด๋์ค ๋ณ์(์์ฑ)๋ฅผ ์ ์ธํ๋ ค๋ฉด ํด๋์ค ๋ด๋ถ ์ด๋์์๋ ๊ทธ๋ฅ ์ ์ธํ๋ฉด ๋ผ. ๋ณดํต ํด๋์ค ๋ฉ์๋๋ฅผ ์ ์ธํ๊ธฐ ์ ์ ๊ฐ์ฅ ์ฒ์์ ์ ์ธํด. ์์ :
class MyClass:
attribute = "๋๋ ํด๋์ค ์์ฑ์ด๋ค"
@classmethod
def class_method(cls):
print(cls.attribute) # ๋๋ ํด๋์ค ์์ฑ์ด๋ค
my_object = MyClass()
MyClass.class_method()
ํด๋์ค ๋ณ์์ ๊ฐ์ ์ฝ๊ฑฐ๋ ์ฐ๊ณ ์ถ๋ค๋ฉด ๊ฐ์ฒด cls
๋ฅผ ์ฌ์ฉํด.
์ฌ์ค, ํด๋์ค ๋ณ์์ ํด๋์ค ์ด๋ฆ์ ํตํด ์ง์ ์ ๊ทผํด๋ ๋ผ:
class MyClass:
attribute = "๋๋ ํด๋์ค ์์ฑ์ด๋ค"
@classmethod
def class_method(cls):
print(MyClass.attribute) # ๋๋ ํด๋์ค ์์ฑ์ด๋ค
my_object = MyClass()
print(MyClass.attribute) # ๋๋ ํด๋์ค ์์ฑ์ด๋ค
๊ฐ์ฒด ๋ณ์/ํ๋
๊ฐ์ฒด ๋ณ์ (instance)
๋ self
์ ํ๋์ผ. self.name
์ ํตํด ์ ๊ทผํ ์ ์์ด. self
๊ฐ์ฒด๋ ๋ฐ๋ก ์ด ์์
์ ์ํด ๋ฉ์๋์ ์ ๋ฌ๋ผ.
์์ :
class MyClass:
attribute = "๋๋ ํด๋์ค ์์ฑ์ด๋ค"
def set_name(self, name):
self.name = name
def print_name(self):
print(self.name)
my_object = MyClass()
my_object.set_name("name์ด๋ผ๋ ๊ฐ์ฒด ํ๋")
my_object.print_name() # "name์ด๋ผ๋ ๊ฐ์ฒด ํ๋"
๊ฐ์ฒด์ ๋ฉ์๋๋ฅผ ํธ์ถํ ๋๋ง๋ค (self)
๋งค๊ฐ๋ณ์๋ก ๋ฉ์๋๊ฐ ํธ์ถ๋ ๊ฐ์ฒด์ ๋ํ ์ฐธ์กฐ๊ฐ ์ ๋ฌ๋ผ. ๋ค๋ฅธ ๊ฐ์ฒด ๋ฉ์๋๋ค๋ self
๊ฐ์ฒด๋ฅผ ํตํด ๊ณตํต ๋ฐ์ดํฐ๋ฅผ ์ ๊ทผํ ์ ์์ด.
GO TO FULL VERSION