Hello๐ I'm Dona!:)
๊ฐ์ฒด ์งํฅํ๋ก๊ทธ๋๋ฐ ์์ด๋ก๋ OOP(Object-Oriented-Programming) ์ ๋ฆฌํ๊ธฐ 4ํ! ๐ก
๐ ๋ค์ด๊ฐ๋ฉฐ : ํ๋ก๊ทธ๋๋ฐ์์ ์ถ์ํ๋?
- ๋ณ์, ํจ์, ํด๋์ค๋ฅผ ์ฌ์ฉํด ์ฌ์ฉ์๊ฐ ๊ผญ ์์์ผ๋ง ํ๋ ๋ถ๋ถ๋ง์ ๊ฒ์ผ๋ก ๋๋ฌ๋ด๋ ๊ฒ
- ํ๋ก๊ทธ๋๋จธ๋ค์ด ํน์ ์ฝ๋๋ฅผ ์ฌ์ฉํ ๋, ํ์์ ์ธ ์ ๋ณด๋ฅผ ์ ์ธํ ์ธ๋ถ์ฌํญ์ ๊ฐ๋ฆฌ๋ ๊ฒ
- ๋ณ์ ์ถ์ํ, ํจ์ ์ถ์ํ, ํด๋์ค ์ถ์ํ ๋ฑ์ด ์๋ค.
์ถ์ํ๋, " ๋ณต์กํ ๋ด์ฉ์ ์จ๊ธฐ๊ณ , ์ฃผ์ ๊ธฐ๋ฅ์๋ง ์ ๊ฒฝ์ฐ๋ ๊ฒ "
1. ์ถ์ํ ์ํ๊ธฐ : ์ด๋ฆ ์ ์ง๊ธฐ
- ํด๋์ค, ๋ณ์, ๋ฉ์๋์ ์ด๋ฆ์ ์ด๋์ ์ธ ์ ์๊ณ , ์ด๋ป๊ฒ ์ฌ์ฉํ๋์ง ์ง๊ด์ ์ผ๋ก ์ ์ถ๋๋ ์ด๋ฆ์ ์ฌ์ฉํ์
- ๋ณ์ ์ด๋ฆ์ ๋ํ ๊ท์น์ด ๊ถ๊ธํ๋ค๋ฉด PEP8์ ์ฐธ๊ณ ํ์ - python PEP8(์ฝ๋ฉ ์คํ์ผ ๊ฐ์ด๋)
- ํ์๊ฐ ์ฝ์ธ๋ผ์์ ํ์ด์ฌ ๊ฐ์์์ ๋ฐฐ์ด ๋ณ์ ์ด๋ฆ์ ๋๋ชจ๋(mnemonic)ํ๊ฒ ์ง๋ ๊ฒ๋ ์ฌ๊ธฐ์ ํด๋น๋๋ค.
- ๐ฅ๋๋ชจ๋ ๋ณ์ ์ด๋ฆ(mnemonic varaiable name) : ๋ณด๋ ์ฌ๋์ ์ํด ์ ์ ํ ์ ํ๋ ๋ณ์ ์ด๋ฆ, ๊ธฐ์ตํ๊ธฐ ์ฌ์ด
- ์น์์ ๊ฐํธํ๊ฒ ๋ณ์์ ์ฃผ์๋ฅผ ํ์ธํ๋ฉฐ ์ฝ๋ฉ์ ํ ์ ์๋ ์ฌ์ดํธ๋ฅผ ์๊ฐํ๋ค
ํด๋์ค, ๋ณ์, ๋ฉ์๋ ์ถ์ํ๋ฅผ ์ฝ๋ ์์๋ก ๋๊ปด๋ณด์
# ์ถ์ํ์ ์ ์ข์ ์์ : ์ด๋์ ์ฐ๋ ํด๋์ค, ํจ์, ๋ณ์์ธ์ง ์ดํดํ๊ธฐ ํ๋ค๋ค
class SomeClass:
class_variable = 0.02
def __init__(self, variable_1, variable_2):
self.variable_1 = variable_1
self.variable_2 = variable_2
def method_1(self, some_value):
self.variable_2 += some_value
# ์ถ์ํ์ ์ข์ ์์ : ์ด๋์ ์ฐ๋ ํด๋์ค, ํจ์, ๋ณ์์ด๊ณ ์ด๋ป๊ฒ ์ฌ์ฉํ ์ง ์ง๊ด์ ์ผ๋ก ์ ์ ์๋ค
class BankAccount:
'''์ํ ๊ณ์ข ํด๋์ค'''
interest = 0.02 # ์ด์
def __init__(self, owner_name, balance):
self.owner_name = owner_name # ์ด๋ฆ
self.balance = balance # ์์ก
def deposit(self, amount):
# ์๊ธ
self.balance += amount
2. ๋ฌธ์ํ(docstring = documentation string)
- ์ถ์ํ๋ฅผ ๋ ์ํ๋ ๋ฐฉ๋ฒ์ผ๋ก๋ 'docstring'์ด ์๋ค
- ํด๋์ค๋ฅผ ๋ง๋ค ๋, """์ด๋ ๊ฒ""", ๋๋ '''์ด๋ ๊ฒ''' ๋ฐ์ดํ ์ธ๊ฐ๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค
- ์ด๋ ๊ฒ ์์ฑํ docstring ๋ด์ฉ์ __doc__ ์์ฑ์ ์ ์ฅ๋๋ฉฐ, help(class์ด๋ฆ)๋ก ํ์ธ์ด ๊ฐ๋ฅํ๋ค
- ๋ฌธ์ํ์์ ๊ฐ์ฅ ์ค์ํ ๊ฒ์ ํ๋ก๊ทธ๋จ์ ํจ๊ป ๋ง๋๋ ํ์๋ค๊ณผ ๋ฌธ์ํ ํฌ๋งท(style)์ ๊ดํด ๋ฏธ๋ฆฌ ์ฝ์์ ํ๊ณ ์ด๋ฅผ ์ ์งํค๋ ๊ฒ! ๐ค
- ํผ์์ ๋ง๋๋ ํ๋ก๊ทธ๋จ์ด๋ผ๋ ์์ ๋ง์ ํฌ๋งท(style)์ ์ผ๊ด์ฑ์๊ฒ ์ฌ์ฉํ๋ค๋ฉด ๋์ค์ ํ๋ก๊ทธ๋จ์ ์์ ํ ๋ ์ข๋ค๐
# docstring ์ฌ์ฉ ์์
class BankAccount:
'''์ํ ๊ณ์ข ํด๋์ค'''
interest = 0.02
def __init__(self, owner_name, balance):
'''์ธ์คํด์ค ๋ณ์ : name(๋ฌธ์์ด), balance(์ค์ํ)'''
self.owner_name = owner_name
self.balance = balance
def deposit(self, amount):
'''์์ก ์ธ์คํด์ค ๋ณ์ balance๋ฅผ ํ๋ผ๋ฏธํฐ amount๋งํผ ๋๋ ค์ฃผ๋ ๋ฉ์๋'''
self.balance += amount
def withdraw(self, amount):
'''์์ก ์ธ์คํด์ค ๋ณ์ balance๋ฅผ ํ๋ผ๋ฏธํฐ amount๋งํผ ์ค์ฌ์ฃผ๋ ๋ฉ์๋'''
if self.balance < amount:
print("Insufficient balance!")
else:
self.balance -= amount
# docstring ํ์ธํ๊ธฐ
help(BankAccount)
๐ docstring style
docstring์ ํ์์ ๊ผญ ์ง์ผ์ผํ ๊ท์น์ ์์ง๋ง, ํํ ์ฌ์ฉํ๋ ํฌ๋งท์ ์๋ค.
๋ํ์ ์ธ ๋ฌธ์ํ(docstring)์ 3๊ฐ์ง ํฌ๋งท(style)์ ์ฝ๋ ์์์ ํจ๊ป ์์๋ณด์.
- Google docstring
# example : ์ ์ ๋ฅผ ์ํ ์ถ์ฒ ์์์ ์ฐพ๋ ๋ฉ์๋์ docstring์ ์์ฑํด๋ณด์ def find_suggestion_videos(self, number_of_suggestions=5): """์ ์ ์๊ฒ ์ถ์ฒํ ์์์ ์ฐพ์์ค๋ค Parameters: number_of_suggestions (int): ์ถ์ฒํ๊ณ ์ถ์ ์์ ์ (๊ธฐ๋ณธ๊ฐ์ 5) Returns: list: ์ถ์ฒํ ์์ ์ฃผ์๊ฐ ๋ด๊ธด ๋ฆฌ์คํธ """
- reStructuredText (ํ์ด์ฌ ๊ณต์ ๋ฌธ์ํ ๊ธฐ์ค)
# example : ์ ์ ๋ฅผ ์ํ ์ถ์ฒ ์์์ ์ฐพ๋ ๋ฉ์๋์ docstring์ ์์ฑํด๋ณด์ def find_suggestion_videos(self, number_of_suggestions=5): """์ ์ ์๊ฒ ์ถ์ฒํ ์์์ ์ฐพ์์ค๋ค :param number_of_suggestions: ์ถ์ฒํ๊ณ ์ถ์ ์์ ์ (๊ธฐ๋ณธ๊ฐ์ 5) :type number_of_suggestions: int :returns: ์ถ์ฒํ ์์ ์ฃผ์๊ฐ ๋ด๊ธด ๋ฆฌ์คํธ :rtype: list """
- NumPy/SciPy (ํต๊ณ, ๊ณผํ ๋ถ์ผ์์ ์ฐ์ด๋ Python ๋ผ์ด๋ธ๋ฌ๋ฆฌ)
# example : ์ ์ ๋ฅผ ์ํ ์ถ์ฒ ์์์ ์ฐพ๋ ๋ฉ์๋์ docstring์ ์์ฑํด๋ณด์ def find_suggestion_videos(self, number_of_suggestions=5): """์ ์ ์๊ฒ ์ถ์ฒํ ์์์ ์ฐพ์์ค๋ค Parameters ---------- number_of_suggestions: int ์ถ์ฒํ๊ณ ์ถ์ ์์ ์ (๊ธฐ๋ณธ๊ฐ์ 5) Returns ------- list ์ถ์ฒํ ์์ ์ฃผ์๊ฐ ๋ด๊ธด ๋ฆฌ์คํธ """
๐ type hinting with python
- ํ์ด์ฌ์ ์ ์ ํ์ ์ธ์ด์ฒ๋ผ ํ์ ์ ํ์ํ ์ ์๋ ๊ธฐ๋ฅ
- ํ์ด์ฌ์ ๋์ ํ์ ์ธ์ด(๊ทธ๋ ๊ทธ๋ ํจ์์ ํ์ ์ด ๋ณํ๋ค)
- type hingting์ ์งํค์ง์์๋ error๋ ์๋์ง๋ง, ์๋ฑํ ๊ฒฐ๊ณผ๊ฐ ๋์ฌ ์ ์์
# example
# ๋ณ์์ ๋ฃ์ด์ผํ ํ์
์ hinting
x : float = 0.02
y : int = 3
# ํจ์ : ํจ์์ ๋ฆฌํด๊ฐ์ ํ์
์ hinting
def func -> float :
# ํด๋์ค
class BankAccount:
'''์ํ ๊ณ์ข ํด๋์ค'''
interest: float = 0.02
def __init__(self, owner_name: str, balance: float) -> None:
'''์ธ์คํด์ค ๋ณ์ : name(๋ฌธ์์ด), balance(์ค์ํ)'''
self.owner_name = owner_name
self.balance = balance
def deposit(self, amount: float) -> None:
'''์์ก ์ธ์คํด์ค ๋ณ์ balance๋ฅผ ํ๋ผ๋ฏธํฐ amount๋งํผ ๋๋ ค์ฃผ๋ ๋ฉ์๋'''
self.balance += amount
def withdraw(self, amount: float) -> None:
'''์์ก ์ธ์คํด์ค ๋ณ์ balance๋ฅผ ํ๋ผ๋ฏธํฐ amount๋งํผ ์ค์ฌ์ฃผ๋ ๋ฉ์๋'''
if self.balance < amount:
print("Insufficient balance!")
else:
self.balance -= amount
๐ ๋์ ํ์ ์ธ์ด vs ์ ์ ํ์ ์ธ์ด
[๋์ ํ์ ์ธ์ด]
- ํ์ (์๋ฃํ)์ ๋ณ์๋ฅผ ์ ์ธํ ๋(์ปดํ์ผ) ์ ํ๋ ๊ฒ์ด ์๋๋ผ ์คํํ๋ฉด์ ๊ฒฐ์ ํจ
- ๋ํ์ ์ผ๋ก Python, Javascript, Ruby ๋ฑ์ ์ธ์ด๊ฐ ์์
- ์ฅ์ : ์คํํ ๋๊น์ง ํ์ ์ ๋ํ ๊ฒฐ์ ์ ๊ฐ์ ธ๊ฐ ์ ์๊ธฐ ๋๋ฌธ์ ์ ํ์ ์ฌ์ง๊ฐ ์์, ์ฝ๋๊ฐ ๊ฐ๋จํจ
- ๋จ์ : ๋ณ์์ ์์์น ๋ชปํ ํ์ ์ด ๋ค์ด์ TypeError๊ฐ ๋ฐ์ํ ์ ์์
# ๋์ ํ์
์ธ์ด : python
i = 0
j = 1.5
k = "DONA"
[์ ์ ํ์ ์ธ์ด]
- ๋ณ์ ์ ์ธ ์ ์์ ํ์ (์๋ฃํ)์ ์ง์ ํด์ฃผ์ด์ผํจ, ๋ง์ง ์์ ๊ฐ์ด ๋ค์ด์์ผ๋ฉด ์ปดํ์ผ ์๋ฌ ๋ฐ์
- ๋ํ์ ์ผ๋ก C, C#, C++, Java ๋ฑ์ ์ธ์ด๊ฐ ์์
- ์ฅ์ : ์ปดํ์ผ ์ ํ์ ์ ๋ํ ์ ๋ณด๋ฅผ ๊ฒฐ์ ํ๊ธฐ ๋๋ฌธ์ ์๋๊ฐ ๋น ๋ฅด๊ณ , ํ์ ์๋ฌ ๋ฌธ์ ์ ์ ์ด๊ธฐ์ ๋ฐ๊ฒฌํ ์ ์๊ธฐ ๋๋ฌธ์ ์์ ์ฑ์ด ๋์
# ์ ์ ํ์
์ธ์ด : java
int i = 0;
float j = 1.5;
String k = "DONA";
String k = new String("DONA");
๐ Reference
- mnemonic ์ํค๋ฐฑ๊ณผ
- ์น์์ ๊ฐํธํ๊ฒ ๋ณ์์ ์ฃผ์๋ฅผ ํ์ธํ๋ฉฐ ์ฝ๋ฉ์ ํ ์ ์๋ ์ฌ์ดํธ
- ์ ์ ์ธ์ด์ ๋์ ์ธ์ด ์ฐธ๊ณ ๋ธ๋ก๊ทธ
- ์ ํ ํฌ ์๋ฐ
- ์ฝ๋์ ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ
๐ก ํด๋น ๋ธ๋ก๊ทธ OOP series
- [OOP] (1) ํด๋์ค, ๊ฐ์ฒด, ์ธ์คํด์ค, ๊ฐ์ฒด์งํฅ vs ์ ์ฐจ์งํฅ ํ๋ก๊ทธ๋๋ฐ ์ ์
- [OOP] (2) ์ธ์คํด์ค ๋ณ์์ ํด๋์ค ๋ณ์
- [OOP] (3) ๋ฉ์๋์ ์ข ๋ฅ : ์ธ์คํด์ค ๋ฉ์๋, ํด๋์ค ๋ฉ์๋, ์ ์ ๋ฉ์๋ (with ํ์ด์ฌ ์ฝ๋) & ํน์๋ฉ์๋
- [OOP] (4) ์ถ์ํ(Abstraction) : docstring, type hinting, ์ ์ ๋์ ํ์ ์ธ์ด