๐Ÿน ๊ฐ์ฒด์ง€ํ–ฅ๊ณผ ํด๋ž˜์Šค

๋ฏผ๋‹ฌํŒฝ์ด์šฐ์œ ยท2024๋…„ 6์›” 2์ผ

๐Ÿน ํŒŒ์ด์ฌ ๊ธฐ์ดˆ

๋ชฉ๋ก ๋ณด๊ธฐ
16/19
post-thumbnail

๐Ÿ’ก 1. ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ

๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ(Object-Oriented Programming, OOP)์€ ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ์„ค๊ณ„ํ•˜๊ณ  ๊ตฌํ˜„ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ์ค‘์š”ํ•œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํŒจ๋Ÿฌ๋‹ค์ž„ ์ค‘ ํ•˜๋‚˜์ด๋‹ค. ์ด ํŒจ๋Ÿฌ๋‹ค์ž„์€ ํ”„๋กœ๊ทธ๋žจ์„ "๊ฐ์ฒด"๋ผ๊ณ  ๋ถˆ๋ฆฌ๋Š” ๋…๋ฆฝ์ ์ธ ๊ฐœ์ฒด๋กœ ๋‚˜๋ˆ„๊ณ , ์ด๋Ÿฌํ•œ ๊ฐ์ฒด๋“ค ๊ฐ„์˜ ์ƒํ˜ธ์ž‘์šฉ์„ ํ†ตํ•ด ํ”„๋กœ๊ทธ๋žจ์„ ๊ตฌ์„ฑํ•˜๋Š” ๊ฐœ๋ฐœ ๋ฐฉ๋ฒ•๋ก ์ด๋‹ค.

์ ˆ์ฐจ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ

์ ˆ์ฐจ์ง€ํ–ฅํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•  ๋•Œ ์ผ๋ จ์˜ ์ ˆ์ฐจ ๋˜๋Š” ๋‹จ๊ณ„์— ๋”ฐ๋ผ ์ฝ”๋“œ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค. ์ด๋Ÿฌํ•œ ๋‹จ๊ณ„๋‚˜ ์ ˆ์ฐจ๋“ค์€ ์ฃผ๋กœ ํ•จ์ˆ˜๋‚˜ ์„œ๋ธŒ๋ฃจํ‹ด์œผ๋กœ ๋‚˜๋ˆ„์–ด์ ธ ์žˆ์œผ๋ฉฐ, ๊ฐ๊ฐ์˜ ํ•จ์ˆ˜๋Š” ํŠน์ €ํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ๋‹ค. ์ฃผ๋กœ '์ž…๋ ฅ-์ฒ˜๋ฆฌ-์ถœ๋ ฅ'์˜ ์ˆœ์ฐจ์ ์ธ ์ ˆ์ฐจ๋ฅผ ๋”ฐ๋ฅด๋ฉฐ, ์ฝ”๋“œ๋ฅผ ์œ„์—์„œ๋ถ€ํ„ฐ ์•„๋ž˜๋กœ ์‹คํ–‰ํ•˜๋ฉด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค. C ์–ธ์–ด์™€ ๊ฐ™์€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋Š” ์ฃผ๋กœ ์ ˆ์ฐจ์ง€ํ–ฅ์ ์ธ ์Šคํƒ€์ผ์„ ๋”ฐ๋ฅธ๋‹ค.

ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ

ํ•จ์ˆ˜ํ˜•ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ํ•จ์ˆ˜(function)๋ฅผ ์ผ๊ธ‰ ์‹œ๋ฏผ์œผ๋กœ ์ทจ๊ธ‰ํ•˜์—ฌ ํ”„๋กœ๊ทธ๋ž˜๋ฏˆ ์ž‘์„ฑํ•˜๋Š” ํŒจ๋Ÿฌ๋‹ค์ž„์ด๋‹ค. ํ•จ์ˆ˜๋Š” ๋‹ค๋ฅธ ํ•จ์ˆ˜์— ์ „๋‹ฌ๋˜๊ฑฐ๋‚˜ ๋ฐ˜ํ™˜๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํ•จ์ˆ˜๋“ค ๊ฐ„์˜ ์กฐํ•ฉ์„ ํ†ตํ•ด ๋ณต์žกํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ๋‹ค. ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ , ๋ถ€์ž‘์šฉ(side effect)์„ ์ตœ์†Œํ™”ํ•˜๋ ค๋Š” ๋…ธ๋ ฅ์ด ์žˆ๋‹ค. ํ•จ์ˆ˜ํ˜• ์–ธ์–ด๋กœ๋Š” Haskell, Lisp, Clojure ๋“ฑ์ด ์žˆ์œผ๋ฉฐ, ๋ช‡๋ช‡ ๋‹ค๋ฅธ ์–ธ์–ด๋“ค๋„ ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์ง€์›ํ•œ๋‹ค. ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ๋ณ‘๋ ฌ์ฒ˜๋ฆฌ์™€ ์ƒํƒœ ๊ด€๋ฆฌ์— ์šฉ์ดํ•˜๋ฉฐ, ํ•จ์ˆ˜๋“ค์„ ์กฐํ•ฉํ•˜์—ฌ ๊ฐ„๊ฒฐํ•˜๊ณ  ์•ˆ์ •์ ์ธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š”๋ฐ ๋„์›€์ด ๋œ๋‹ค.

๐Ÿ’ก 2. ํด๋ž˜์Šค

  • ๊ฐ์ฒด(Object): ๊ฐ์ฒด๋Š” ํ˜„์‹ค ์„ธ๊ณ„์—์„œ์˜ ์‹ค์ œ ๊ฐœ์ฒด๋‚˜ ์ถ”์ƒ์ ์ธ ๊ฐœ๋…์„ ๋ชจ๋ธ๋งํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ž๋™์ฐจ, ์‚ฌ๋žŒ, ์€ํ–‰ ๊ณ„์ขŒ ๋“ฑ์ด ๊ฐ์ฒด๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ์ฒด๋Š” ๋ฐ์ดํ„ฐ(์†์„ฑ, ์ƒํƒœ)์™€ ๋ฉ”์„œ๋“œ(๋™์ž‘, ํ•จ์ˆ˜)๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค.

  • ํด๋ž˜์Šค(Class): ํด๋ž˜์Šค๋Š” ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ํ…œํ”Œ๋ฆฟ ๋˜๋Š” ์„ค๊ณ„๋„์ž…๋‹ˆ๋‹ค. ํด๋ž˜์Šค๋Š” ๊ฐ์ฒด์˜ ๊ณตํ†ต ์†์„ฑ๊ณผ ๋™์ž‘์„ ์ •์˜ํ•˜๋ฉฐ, ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, "์ž๋™์ฐจ" ํด๋ž˜์Šค๋Š” ๋ชจ๋“  ์ž๋™์ฐจ ๊ฐ์ฒด๊ฐ€ ๊ฐ€์ ธ์•ผ ํ•˜๋Š” ์†์„ฑ(์ƒ‰์ƒ, ์†๋„)๊ณผ ๋ฉ”์„œ๋“œ(์ฃผํ–‰, ๋ฉˆ์ถค)๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ธ์Šคํ„ด์Šค(Instance): ํด๋ž˜์Šค๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์‹ค์ œ๋กœ ์ƒ์„ฑ๋œ ๊ฐ์ฒด๋ฅผ ์ธ์Šคํ„ด์Šค๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ํด๋ž˜์Šค๋Š” ์—ฌ๋Ÿฌ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๊ฐ ์ธ์Šคํ„ด์Šค๋Š” ๋…๋ฆฝ์ ์ธ ๋ฐ์ดํ„ฐ์™€ ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค.

2-1. ํด๋ž˜์Šค ๋งŒ๋“ค๊ธฐ

class ํด๋ž˜์Šค์ด๋ฆ„:
    # ํด๋ž˜์Šค ์†์„ฑ(๋ฉค๋ฒ„ ๋ณ€์ˆ˜) ์ •์˜
    ์†์„ฑ1 = ์ดˆ๊ธฐ๊ฐ’1
    ์†์„ฑ2 = ์ดˆ๊ธฐ๊ฐ’2

    # ์ƒ์„ฑ์ž ๋ฉ”์„œ๋“œ (์ƒ๋žต ๊ฐ€๋Šฅ)
    def __init__(self, ๋งค๊ฐœ๋ณ€์ˆ˜1, ๋งค๊ฐœ๋ณ€์ˆ˜2, ...):
        # ์ธ์Šคํ„ด์Šค ์†์„ฑ ์ดˆ๊ธฐํ™”
        self.์†์„ฑ1 = ๋งค๊ฐœ๋ณ€์ˆ˜1
        self.์†์„ฑ2 = ๋งค๊ฐœ๋ณ€์ˆ˜2

    # ๋ฉ”์„œ๋“œ(๋ฉค๋ฒ„ ํ•จ์ˆ˜) ์ •์˜
    def ๋ฉ”์„œ๋“œ1(self, ๋งค๊ฐœ๋ณ€์ˆ˜1, ๋งค๊ฐœ๋ณ€์ˆ˜2, ...):
        # ๋ฉ”์„œ๋“œ ๋™์ž‘ ์ •์˜
        pass

    def ๋ฉ”์„œ๋“œ2(self, ๋งค๊ฐœ๋ณ€์ˆ˜1, ๋งค๊ฐœ๋ณ€์ˆ˜2, ...):
        # ๋ฉ”์„œ๋“œ ๋™์ž‘ ์ •์˜
        pass

2-2. ๊ฐ„๋‹จํ•œ ํด๋ž˜์Šค ์ž‘์„ฑํ•˜๊ธฐ

# ๊ด€๋ก€์ƒ ํด๋ž˜์Šค ์ด๋ฆ„์˜ ์ฒซ๊ธ€์ž๋ฅผ ๋Œ€๋ฌธ์ž˜ ๋งŽ์ด ํ•จ
class Dog:
  pass # ๋‚˜์ค‘์— ๋งŒ๋“ค๊ณ  ์‹ถ์„ ๋•Œ
def func():
  pass
Rucy = Dog()
print(Rucy)
print(type(Rucy))
> <__main__.Dog object at 0x78df2ef99810>
> <class '__main__.Dog'>
PPomi = Dog()
print(PPomi)
print(type(PPomi))
> <__main__.Dog object at 0x78df2ef99450>
> <class '__main__.Dog'>

2-3. ๊ฐ์ฒด์˜ ์†์„ฑ ์ดˆ๊ธฐํ™”

class Dog:
  name = ''
  age = 0
  family = ''
Rucy = Dog()
print(Rucy.name)
print(Rucy.age)
print(Rucy.family)
>
> 0
>
Rucy.name = '๋ฃจ์‹œ'
Rucy.age = 14
Rucy.family = 'ํฌ๋ฉ”'

print(Rucy.name)
print(Rucy.age)
print(Rucy.family)
> ๋ฃจ์‹œ
> 14
> ํฌ๋ฉ”
PPomi = Dog()
PPomi.name = '๋ฝ€๋ฏธ'
PPomi.age = 7
PPomi.family = 'ํผํ”ผ์ธ '

print(PPomi.name)
print(PPomi.age)
print(PPomi.family)
> ๋ฝ€๋ฏธ
> 7
> ํผํ”ผ์ธ 

2-4. ๋ฉ”์„œ๋“œ์˜ ์‚ฌ์šฉ

class Dog:
  name = ''
  age = 0
  family = ''

  def eat(self): # ๋ฌด์กฐ๊ฑด ๋งค๊ฐœ๋ณ€์ˆ˜ ํ•˜๋‚˜๋Š” self๋ฅผ ๋“ฑ๋กํ•ด์ค˜์•ผํ•จ. ๋ฉ”์„œ๋“œ๋Š” ๋ฉ”๋ชจ๋ฆฌ ์ ˆ์•ฝ์„ ์œ„ํ•ด ๊ณต๋™์œผ๋กœ ์‚ฌ์šฉ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ”์„œ๋“œ๋ฅผ ๋ˆ„๊ฐ€ ์‚ฌ์šฉํ–ˆ๋Š”์ง€ ์•Œ๊ธฐ ์œ„ํ•ด self์— ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๊ฐ€ ๋“ค์–ด๊ฐ
    print('์‚ฌ๋ฃŒ๋ฅผ ๋จน์Šต๋‹ˆ๋‹ค')
Rucy = Dog()
Rucy.eat()
> ์‚ฌ๋ฃŒ๋ฅผ ๋จน์Šต๋‹ˆ๋‹ค
PPomi = Dog()
PPomi.eat()
> ์‚ฌ๋ฃŒ๋ฅผ ๋จน์Šต๋‹ˆ๋‹ค

๐Ÿ’ก 3. ์ƒ์„ฑ์ž

ํŒŒ์ด์ฌ์—์„œ ์ƒ์„ฑ์ž(Constructor)๋Š” ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ ์ž๋™์œผ๋กœ ํ˜ธ์ถœ๋˜๋Š” ํŠน๋ณ„ํ•œ ๋ฉ”์„œ๋“œ์ด๋‹ค. ์ƒ์„ฑ์ž๋Š” ๊ฐ์ฒด์˜ ์ดˆ๊ธฐํ™”๋ฅผ ๋‹ด๋‹นํ•˜๋ฉฐ, ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ ํ•„์š”ํ•œ ์†์„ฑ์„ ์ดˆ๊ธฐํ™”ํ•˜๊ณ  ์„ค์ •ํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค. ํŒŒ์ด์ฌ์—์„œ ์ƒ์„ฑ์ž ๋ฉ”์„œ๋“œ๋Š” __init__๋ผ๊ณ  ์ด๋ฆ„์ด ์ •ํ•ด์ ธ ์žˆ๋‹ค.

class ํด๋ž˜์Šค์ด๋ฆ„:
    def __init__(self, ๋งค๊ฐœ๋ณ€์ˆ˜1, ๋งค๊ฐœ๋ณ€์ˆ˜2): # ๊ตณ์ด self๋ผ๊ณ  ์“ฐ์ง€ ์•Š์•„๋„ ๋˜์ง€๋งŒ ๊ด€๋ก€์ ์œผ๋กœ self๋ฅผ ๋งŽ์ด ์”€
        self.์†์„ฑ1 = ๋งค๊ฐœ๋ณ€์ˆ˜1
        self.์†์„ฑ2 = ๋งค๊ฐœ๋ณ€์ˆ˜2
class Dog:
  def __init__(self):
    print('์ƒ์„ฑ์ž ํ˜ธ์ถœ')
Rucy = Dog() # ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ init ๋ฉ”์„œ๋“œ๊ฐ€ ์ž๋™์œผ๋กœ ํ˜ธ์ถœ๋จ
> ์ƒ์„ฑ์ž ํ˜ธ์ถœ
class Dog():
  def __init__(self, name, age, family):
    self.name = name
    self.age = age
    self.family = family
Rucy = Dog('๋ฃจ์‹œ', 14, 'ํฌ๋ฉ”') # ์•ž์˜ ๋ฐฉ์‹๊ณผ๋Š” ๋‹ค๋ฅด๊ฒŒ init ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ์†์„ฑ์„ ๋ฐ”๋กœ ๋ถ€์—ฌํ•ด์ค„ ์ˆ˜ ์žˆ๋‹ค. ์†์„ฑ์„ ๋ฏธ๋ฆฌ ์ง€์ •ํ•ด๋‘๋ฉด ๋ฉ”๋ชจ๋ฆฌ๋„ ๋‚ญ๋น„๋˜๊ณ  ํ™•์žฅ์„ฑ๋„ ๋–จ์–ด์ง
print(Rucy.name)
print(Rucy.age)
print(Rucy.family)
> ๋ฃจ์‹œ
> 14
> ํฌ๋ฉ”

๐Ÿ’ก 4. ๋ฉ”์„œ๋“œ

๋ฉ”์„œ๋“œ(Method)๋Š” ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ(OOP)์—์„œ ์‚ฌ์šฉ๋˜๋Š” ํ•จ์ˆ˜์™€ ๋น„์Šทํ•œ ๊ฐœ๋…์ด์ง€๋งŒ, ํด๋ž˜์Šค ๋‚ด๋ถ€์— ์ •์˜๋˜์–ด ํŠน์ • ๊ฐ์ฒด์— ์—ฐ๊ฒฐ๋œ ํ•จ์ˆ˜์ด๋‹ค. ๋ฉ”์„œ๋“œ๋Š” ํ•ด๋‹น ํด๋ž˜์Šค์˜ ๋ชจ๋“  ๊ฐ์ฒด์—์„œ ๊ณต์œ ๋˜๋ฉฐ, ๊ฐ์ฒด์˜ ๋™์ž‘์„ ์ •์˜ํ•˜๊ฑฐ๋‚˜ ํŠน์ • ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค.

4-1. ๋ฉ”์„œ๋“œ ์ •์˜

class Counter:
  def __init__(self):
    self.num = 0

  def increment(self):
    self.num += 1

  def decrement(self):
    self.num -= 1

  def reset(self):
    self.num = 0

  def current_value(self):
    return self.num
KBbank = Counter()
print(KBbank.current_value())
> 0
KBbank.increment()
KBbank.increment()
KBbank.increment()
print(KBbank.current_value())
> 3
KBbank.decrement()
KBbank.decrement()
HanaBank = Counter()
print(HanaBank.current_value())
> 0
HanaBank.increment()
HanaBank.increment()
HanaBank.increment()
HanaBank.increment()
HanaBank.increment()
print(HanaBank.current_value())
> 0
HanaBank.reset()
print(HanaBank.current_value())
> 0
print(KBbank.current_value())
> 1

4-2. ๋ฉ”์„œ๋“œ ํƒ€์ž…

  • ์ธ์Šคํ„ด์Šค ๋ฉ”์„œ๋“œ(Instance Method): ๊ฐ์ฒด์˜ ์ƒํƒœ๋ฅผ ์กฐ์ž‘ํ•˜๊ฑฐ๋‚˜ ๊ฐ์ฒด์— ํŠน์ • ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฉ”์„œ๋“œ์ž…๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ํด๋ž˜์Šค ๋ฉ”์„œ๋“œ๋Š” ์ธ์Šคํ„ด์Šค ๋ฉ”์„œ๋“œ์ž…๋‹ˆ๋‹ค. ์œ„์˜ ์˜ˆ์ œ์—์„œ ๋ณด์—ฌ์ง„ __init__ ๋ฉ”์„œ๋“œ๋„ ์ธ์Šคํ„ด์Šค ๋ฉ”์„œ๋“œ์ž…๋‹ˆ๋‹ค.

  • ํด๋ž˜์Šค ๋ฉ”์„œ๋“œ(Class Method): ํด๋ž˜์Šค ๋ ˆ๋ฒจ์—์„œ ๋™์ž‘ํ•˜๋ฉฐ, ๋ชจ๋“  ์ธ์Šคํ„ด์Šค๊ฐ€ ๊ณต์œ ํ•˜๋Š” ๋ฉ”์„œ๋“œ์ž…๋‹ˆ๋‹ค. ํด๋ž˜์Šค ๋ฉ”์„œ๋“œ๋Š” @classmethod ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ •์˜ํ•˜๋ฉฐ, ์ฒซ ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ cls๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

  • ์ •์  ๋ฉ”์„œ๋“œ(Static Method): ํŠน์ • ํด๋ž˜์Šค๋‚˜ ์ธ์Šคํ„ด์Šค์™€ ๊ด€๋ จ์ด ์—†๋Š” ๋ฉ”์„œ๋“œ๋กœ, ํด๋ž˜์Šค ๋‚ด๋ถ€์— ์ •์˜๋˜์–ด ์žˆ์ง€๋งŒ ํด๋ž˜์Šค๋‚˜ ์ธ์Šคํ„ด์Šค์™€ ๋…๋ฆฝ์ ์œผ๋กœ ํ˜ธ์ถœ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ •์  ๋ฉ”์„œ๋“œ๋Š” @staticmethod ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

class Math:
  def add(self, x, y):
    return x + y

  def multiply(self, x, y):
    return x * y
math = Math()

result1 = math.add(3, 4 )
print(result1)

result2 = math.multiply(3, 4)
print(result2)
> 7
> 12
class Calculator:

  num = 1 # ํด๋ž˜์Šค ๋ณ€์ˆ˜

  def add(self, x, y):
    return x + y

  @classmethod
  def subtract(cls, x, y): # cls๋Š” self์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๊ด€๋ก€์ ์œผ๋กœ ํด๋ž˜์Šค ๋ฉ”์„œ๋“œ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฑฐ๋ผ ๋‹ค๋ฅธ ์ด๋ฆ„์œผ๋กœ ์‚ฌ์šฉํ•ด๋„ ๋œ๋‹ค
    return x - y
    # return x - cls.num ์ด๋Ÿฐ ์‹์œผ๋กœ ์œ„์˜ ํด๋ž˜์Šค ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

  @staticmethod
  def multiply(x, y):
    return x * y

  def divide(x, y):
    return x / y
calc = Calculator()

# ์ธ์Šคํ„ด์Šค ๋ฉ”์„œ๋“œ
result1 = calc.add(3, 4)
print(result1)

# ํด๋ž˜์Šค ๋ฉ”์„œ๋“œ
result2 = Calculator.subtract(4, 3) # ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ  ๋ฐ”๋กœ ํ˜ธ์ถœ ๊ฐ€๋Šฅ
print(result2)

# ์ •์  ๋ฉ”์„œ๋“œ
result3 = Calculator.multiply(3, 4) # ํด๋ž˜์Šค ๋ฉ”์„œ๋“œ์™€ ํ˜ธ์ถœ ๋ฐฉ์‹์€ ๊ฐ™์œผ๋‚˜, ๋ฉ”์„œ๋“œ๋ฅผ ์ƒ์„ฑํ•  ๋•Œ self๋ฅผ ๋„ฃ์ง€ ์•Š๋Š”๋‹ค.
print(result3)

# ํ˜•์‹์ ์ธ ์ฐจ์ด๋งŒ ์žˆ๋А๋ƒ? ๊ทธ๊ฑด ์•„๋‹˜ -> ํด๋ž˜์Šค ๋ฉ”์„œ๋“œ๋Š” ํด๋ž˜์Šค ๋ณ€์ˆ˜ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
# ์ •์  ๋ฉ”์„œ๋“œ๋Š” ๋ฉ”์„œ๋“œ ์‹คํ–‰ ํ›„ ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•˜์ง€ ์•Š๊ณ  ํ˜ธ์ถœ๋งŒ ํ•˜๊ณ  ๋๋‚จ
> 7
> 1
> 12

๐Ÿ’ก 5. ํด๋กœ์ €

ํด๋กœ์ €(Closure)๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์—์„œ ์ค‘์š”ํ•œ ๊ฐœ๋… ์ค‘ ํ•˜๋‚˜๋กœ, ํ•จ์ˆ˜์™€ ๊ทธ ํ•จ์ˆ˜๊ฐ€ ์ฐธ์กฐํ•˜๋Š” ์™ธ๋ถ€ ๋ณ€์ˆ˜(๋˜๋Š” ์ž์œ  ๋ณ€์ˆ˜) ์‚ฌ์ด์˜ ๊ด€๊ณ„๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค. ํด๋กœ์ €๋Š” ํ•จ์ˆ˜์˜ ๋‚ด๋ถ€์—์„œ ์ •์˜๋œ ํ•จ์ˆ˜๋กœ, ๋‚ด๋ถ€ ํ•จ์ˆ˜๊ฐ€ ์™ธ๋ถ€ ํ•จ์ˆ˜์˜ ๋ณ€์ˆ˜์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ณ , ์™ธ๋ถ€ ํ•จ์ˆ˜๋Š” ๋‚ด๋ถ€ ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋กœ ์ธํ•ด ํ•จ์ˆ˜์™€ ๊ทธ ํ•จ์ˆ˜๊ฐ€ ์ฐธ์กฐํ•˜๋Š” ์ƒํƒœ(๋ณ€์ˆ˜)๋ฅผ ํ•จ๊ป˜ ์ €์žฅํ•˜๊ณ  ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.

def mul2(n):
  return n * 2
print(mul2(10))
print(mul2(5))
> 20
> 10
def mul5(n):
  return n * 5
print(mul5(10))
print(mul5(5))

# 1๋ถ€ํ„ฐ 10๊นŒ์ง€ ๋งŒ๋“ค๊ธฐ? ์–ดํ›„ ๊ท€์ฐฎ์•„!
> 50
> 25
class Mul:
  def __init__(self, m):
    self.m = m

  def mul(self, n):
    return self.m * n
mul2 = Mul(2)
print(mul2.mul(10))
print(mul2.mul(5))
> 20
> 10
class Mul:
  def __init__(self, m):
    self.m = m

  def __call__(self, n):
    return self.m * n
mul2 = Mul(2)
print(mul2(10)) # ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ ํ›„ ๊ทธ ๊ฐ์ฒด๋ฅผ ํ•จ์ˆ˜์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•˜๋ฉด call ํ˜ธ์ถœ๋จ
print(mul2(5))

mul5 = Mul(5)
print(mul5(10))
print(mul5(5))
> 20
> 10
> 50
> 25
# ํด๋กœ์ € ๋งŒ๋“ค๊ธฐ
def mul(m):
  def inner(n): # ํ•จ์ˆ˜ ์•ˆ์— ํ•จ์ˆ˜
    return m * n
  return inner # ๋‚ด๋ถ€ ํ•จ์ˆ˜๋ฅผ ์™ธ๋ถ€ ํ•จ์ˆ˜์ชฝ์œผ๋กœ ๋ถˆ๋Ÿฌ์ฃผ๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ
mul2 = mul(2)
print(mul2(10))
> 20
mul5 = mul(5)
print(mul5(10)) # ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ ํ›„ ๊ทธ ๊ฐ์ฒด๋ฅผ ํ•จ์ˆ˜์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•˜๋ฉด call ํ˜ธ์ถœ๋จ
print(mul5(5))
> 50
> 25
# ํด๋กœ์ € ๋งŒ๋“ค๊ธฐ
def mul(m):
  def inner(n): # ํ•จ์ˆ˜ ์•ˆ์— ํ•จ์ˆ˜
    return m * n

๐Ÿ’ก 6. ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ

๋ฐ์ฝ”๋ ˆ์ดํ„ฐ(Decorator)๋Š” ํŒŒ์ด์ฌ์—์„œ ํ•จ์ˆ˜๋‚˜ ๋ฉ”์„œ๋“œ์˜ ๋™์ž‘์„ ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜ ํ™•์žฅํ•˜๊ธฐ ์œ„ํ•œ ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ์ด๋‹ค. ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋Š” ํ•จ์ˆ˜๋‚˜ ๋ฉ”์„œ๋“œ๋ฅผ ๋ž˜ํ•‘ํ•˜๊ฑฐ๋‚˜ ๊ฐ์‹ธ์„œ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋ฉฐ, ์ฝ”๋“œ ์žฌ์‚ฌ์šฉ์„ฑ๊ณผ ๊ฐ€๋…์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚จ๋‹ค. ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋Š” @ ๊ธฐํ˜ธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•จ์ˆ˜๋‚˜ ๋ฉ”์„œ๋“œ ์œ„์— ์ ์šฉ๋œ๋‹ค.

import time

def func1(a, b):
  start = time.time() # ํ˜„์žฌ์‹œ๊ฐ„์„ ์ˆซ์ž๋กœ ๊ฐ€์ ธ์˜ด
  print('ํ•จ์ˆ˜๊ฐ€ ์‹œ์ž‘๋˜์—ˆ์Šต๋‹ˆ๋‹ค')
  result = a + b
  end = time.time()
  print(f'ํ•จ์ˆ˜๊ฐ€ ๋๋‚ฌ์Šต๋‹ˆ๋‹ค. ์†Œ์š”์‹œ๊ฐ„: {end - start}')
  return result
result = func1(10, 3)
print(result)
> ํ•จ์ˆ˜๊ฐ€ ์‹œ์ž‘๋˜์—ˆ์Šต๋‹ˆ๋‹ค
> ํ•จ์ˆ˜๊ฐ€ ๋๋‚ฌ์Šต๋‹ˆ๋‹ค. ์†Œ์š”์‹œ๊ฐ„: 0.0013720989227294922
> 13
def func2(a, b):
  start = time.time() # ํ˜„์žฌ์‹œ๊ฐ„์„ ์ˆซ์ž๋กœ ๊ฐ€์ ธ์˜ด
  print('ํ•จ์ˆ˜๊ฐ€ ์‹œ์ž‘๋˜์—ˆ์Šต๋‹ˆ๋‹ค')
  result = a * b
  end = time.time()
  print(f'ํ•จ์ˆ˜๊ฐ€ ๋๋‚ฌ์Šต๋‹ˆ๋‹ค. ์†Œ์š”์‹œ๊ฐ„: {end - start}')
  return result
result = func2(10, 3)
print(result)
> ํ•จ์ˆ˜๊ฐ€ ์‹œ์ž‘๋˜์—ˆ์Šต๋‹ˆ๋‹ค
> ํ•จ์ˆ˜๊ฐ€ ๋๋‚ฌ์Šต๋‹ˆ๋‹ค. ์†Œ์š”์‹œ๊ฐ„: 0.008896827697753906
> 30
print(format(0.001034324344535, 'f')) # ์†Œ์ˆ˜์  ๋„ˆ๋ฌด ๊ธธ๊ฑฐ๋‚˜ e๋ญ์‹œ๊นฝ ๋‚˜์˜ฌ ๋•Œ ๋ณ€ํ™˜๋ฒ•
> 0.001034
# ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ๋งŒ๋“ค๊ธฐ
def func1(a, b):
  result = a + b
  return result

def func2(a, b):
  result = a * b
  return result
def elapsed(func):
  def wrapper(a, b):
    start = time.time() # ํ˜„์žฌ์‹œ๊ฐ„์„ ์ˆซ์ž๋กœ ๊ฐ€์ ธ์˜ด
    print('ํ•จ์ˆ˜๊ฐ€ ์‹œ์ž‘๋˜์—ˆ์Šต๋‹ˆ๋‹ค')
    result = func(a, b)
    end = time.time()
    print(f'ํ•จ์ˆ˜๊ฐ€ ๋๋‚ฌ์Šต๋‹ˆ๋‹ค. ์†Œ์š”์‹œ๊ฐ„: {end - start}')
    return result
  return wrapper
deco1 = elapsed(func1) # func1 ํ•จ์ˆ˜ ๊ฐ€์ ธ์˜ด
result = deco1(10, 3)
print(result)
> ํ•จ์ˆ˜๊ฐ€ ์‹œ์ž‘๋˜์—ˆ์Šต๋‹ˆ๋‹ค
> ํ•จ์ˆ˜๊ฐ€ ๋๋‚ฌ์Šต๋‹ˆ๋‹ค. ์†Œ์š”์‹œ๊ฐ„: 0.0023889541625976562
> 13
deco2 = elapsed(func2) # func2 ํ•จ์ˆ˜ ๊ฐ€์ ธ์˜ด
result = deco2(10, 3)
print(result)
> ํ•จ์ˆ˜๊ฐ€ ์‹œ์ž‘๋˜์—ˆ์Šต๋‹ˆ๋‹ค
> ํ•จ์ˆ˜๊ฐ€ ๋๋‚ฌ์Šต๋‹ˆ๋‹ค. ์†Œ์š”์‹œ๊ฐ„: 0.0019953250885009766
> 30
# ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ๋งŒ๋“ค๊ธฐ
@elapsed
def func1(a, b):
  result = a + b
  return result

@elapsed
def func2(a, b):
  result = a * b
  return result
func1(10, 3) # ์œ„์—์ฒ˜๋  elapsed ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์ง€ ์•Š์•„๋„
func2(10, 3)
> ํ•จ์ˆ˜๊ฐ€ ์‹œ์ž‘๋˜์—ˆ์Šต๋‹ˆ๋‹ค
> ํ•จ์ˆ˜๊ฐ€ ๋๋‚ฌ์Šต๋‹ˆ๋‹ค. ์†Œ์š”์‹œ๊ฐ„: 0.00011992454528808594
> ํ•จ์ˆ˜๊ฐ€ ์‹œ์ž‘๋˜์—ˆ์Šต๋‹ˆ๋‹ค
> ํ•จ์ˆ˜๊ฐ€ ๋๋‚ฌ์Šต๋‹ˆ๋‹ค. ์†Œ์š”์‹œ๊ฐ„: 2.9087066650390625e-05
> 30
profile
์–ด๋–ป๊ฒŒ ํ–„์Šคํ„ฐ๊ฐ€ ๊ฐœ๋ฐœ์ž

0๊ฐœ์˜ ๋Œ“๊ธ€