[Week 1-4] ๐ŸPython OOP, ๋ชจ๋“ˆ

Jadeยท2021๋…„ 1์›” 21์ผ
0

๋ถ€์ŠคํŠธ์บ ํ”„ AI Tech

๋ชฉ๋ก ๋ณด๊ธฐ
4/54

1์ฃผ์ฐจ ๋ชฉ์š”์ผ

  • Object Oriented Programming
  • ํŒŒ์ด์ฌ ๋ชจ๋“ˆ๊ณผ ํŒจํ‚ค์ง€

๐Ÿ“[Object Oriented Programming]

OOP์˜ ์ค‘์š”ํ•œ ๊ฐœ๋… 3๋Œ€์žฅ

  • ์ƒ์† (inheritance)
    ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ์†์„ฑ๊ณผ ๋ฉ”์†Œ๋“œ๋ฅผ ์ž์‹ ํด๋ž˜์Šค์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
class Parent: # ํด๋ž˜์Šค ์ด๋ฆ„ ์ฒซ ๊ธ€์ž๋Š” ๋Œ€๋ฌธ์ž๋กœ ์“ฐ๊ณ , CamelCase๋กœ ์“ฐ๋Š” ๊ฒƒ์ด ๊ด€๋ก€
    def __init__(self, name):
        self.name = name
        self.surName = 'Brown'
        print("Hi, I'm", self.name, self.surName)

class Child(Parent): # Parent ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›๋Š”๋‹ค๋Š” ํ‘œ์‹œ
    def __init__(self, name):
        super().__init__(name) # ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž๋ฅผ ์‚ฌ์šฉ

pa = parent('John')
ch = child('Tommy')


>>> Hi, I'm John Brown
    Hi, I'm Tommy Brown # ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ์†์„ฑ surName์„ ์ƒ์†๋ฐ›์Œ

  • ๋‹คํ˜•์„ฑ (Polymorphism)
    ๊ฐ™์€ ์ด๋ฆ„์˜ ๋ฉ”์†Œ๋“œ ๋กœ์ง์„ ๋‹ค๋ฅด๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ. ๋ฉ”์†Œ๋“œ ์˜ค๋ฒ„๋ผ์ด๋”ฉ
    ๋ถ€๋ชจ ํด๋ž˜์Šค๋กœ๋ถ€ํ„ฐ ์ƒ์†๋ฐ›์€ ์ž์‹ ํด๋ž˜์Šค๋“ค์˜ ๊ธฐ๋Šฅ์ด ์กฐ๊ธˆ์”ฉ ๋‹ค๋ฅผ ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.
class Player:
    def __init__(self, name):
        self.name = name

    def attack(self): # ์ง์—…๊ตฐ์— ๋”ฐ๋ผ ์Šคํ‚ฌ์ด ๋‹ค๋ฅด๋‹ค
        print("{0} : I can't!".format(self.name))


class Warrior(Player): # Player๋ฅผ ์ƒ์†
    def __init__(self, name, role):
        super().__init__(name)
        self.role = role

    def attack(self): # ์ง์—…๊ตฐ์— ๋”ฐ๋ผ ์Šคํ‚ฌ์ด ๋‹ค๋ฅด๋‹ค
        print("{0}({1}) : Cleave!".format(self.name, self.role))


class Wizard(Player): # Player๋ฅผ ์ƒ์†
    def __init__(self, name, role):
        super().__init__(name)
        self.role = role
        
    def attack(self): # ์ง์—…๊ตฐ์— ๋”ฐ๋ผ ์Šคํ‚ฌ์ด ๋‹ค๋ฅด๋‹ค
        print("{0}({1}) : Fireball!".format(self.name, self.role))

    
pl_1 = Player('Harry')
pl_1.attack()

pl_2 = Warrior('Jane','Warrior')
pl_2.attack()

pl_3 = Wizard('Andy','Wizard')
pl_3.attack()


>>> Harry : I can't!
    Jane(Warrior) : Cleave!
    Andy(Wizard) : Fireball!

  • ๊ฐ€์‹œ์„ฑ (visibility)
    ์บก์Šํ™”(encapsulation) ๋ผ๊ณ ๋„ ํ•œ๋‹ค. ๊ฐ์ฒด์˜ ์ •๋ณด์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๋ฒ”์œ„๋ฅผ ์กฐ์ ˆํ•˜๋Š” ๊ฒƒ์œผ๋กœ, ๊ฐ์ฒด ์†์„ฑ์ด๋‚˜ ๋ฉ”์†Œ๋“œ ๋“ฑ์ด ํด๋ž˜์Šค ์™ธ๋ถ€๋กœ ๋…ธ์ถœ๋˜์ง€ ์•Š๋„๋ก ํ•˜๋Š” ๊ฑด๋ฐ... ํŒŒ์ด์ฌ์—์„œ๋Š” ์™„๋ฒฝํ•˜๊ฒŒ ์บก์Šํ™”ํ•  ์ˆ˜๊ฐ€ ์—†๋‹ค. ๋˜๋”(__)๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋น„์Šทํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. (name mangling)
class Test:
    def __init__(self):
        self.a = 'a'
        self.__b = 'b'

tester = Test()
print(tester.a)
print(tester.__b) # ์•„์ด์ฝ”! __b๋Š” ์™ธ๋ถ€์—์„œ ๋ชป ๋ถ€๋ฅธ๋‹ค!

>>> a
    AttributeError: 'Test' object has no attribute '__b'

๋˜๋”(๋”๋ธ” ์–ธ๋”์Šค์ฝ”์–ด, __) ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋งŒ๋“  ์†์„ฑ์€ ๋ฐ–์—์„œ ํ˜ธ์ถœํ•˜๋ ค๊ณ  ํ•˜๋ฉด AttributeError๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. tester.__b๋ผ๋Š” ์†์„ฑ์ด ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

ํ•˜์ง€๋งŒ ์‚ฌ์‹ค์€...
์‚ฌ์‹ค __๋ฅผ ๋ถ™์ด๋Š” ๊ฒƒ๊ณผ ํƒ€ ์–ธ์–ด์˜ private ํ‚ค์›Œ๋“œ๋Š” ๋‹ค๋ฅด๋‹ค. private์œผ๋กœ ์„ ์–ธํ•œ ์†์„ฑ์€ ๋ฌด์Šจ ์ง“์„ ํ•ด๋„ ์™ธ๋ถ€์—์„œ ๋ณผ ์ˆ˜ ์—†๋Š”๋ฐ,
__๋ฅผ ๋ถ™์ด๋ฉด(name mangling) ํŒŒ์ด์ฌ์ด ์ด๋ฆ„์„ '๋ญ‰๊ฐœ'๋ฒ„๋ ค์„œ ํ•ด๋‹น ์ด๋ฆ„์œผ๋กœ ํ˜ธ์ถœํ•  ์ˆ˜ ์—†๋Š” ๊ฒƒ ๋ฟ์ด์ง€ ์‚ฌ์‹ค ๋‹ค๋ฅธ ์ด๋ฆ„์ด ๋˜์–ด ์–ด๋”˜๊ฐ€์— ์กด์žฌํ•œ๋‹ค.

class Test:
    def __init__(self):
        self.a = 'a'
        self.__b = 'b'

tester = Test()
print(dir(tester)) # dir()๋กœ ๊ฐ์ฒด ์ •๋ณด๋ฅผ ์ฐ์–ด๋ณด๋ฉด..

>>> ['_Test__b', '__class__', (๊ธธ์–ด์„œ ์ค‘๋žต), 'a'] # ์•„๋‹ˆ, ์ €๊ฒŒ ๋ˆ„๊ตฌ์•ผ??

print(tester._Test__b)

>>> b # ์ด๋ฆ„์ด ๋ฐ”๋€ ์ฑ„ ์‚ด๊ณ  ์žˆ์—ˆ๋‹ค.

ํด๋ž˜์Šค ์†์„ฑ ์•ž์— ๋˜๋”๋ฅผ ๋ถ™์—ฌ ์„ ์–ธํ•˜๋ฉด ์ธํ„ฐํ”„๋ฆฌํ„ฐ๊ฐ€ ๊ฐ์ฒด._ํด๋ž˜์Šค๋ช…__๋ณ€์ˆ˜๋ช… ์ฒ˜๋Ÿผ ์ด๋ฆ„์„ ๋ฐ”๊ฟ” ๋ฒ„๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ–์—์„œ ๊ฐ์ฒด.__๋ณ€์ˆ˜๋ช…์œผ๋กœ ํ˜ธ์ถœํ•  ์ˆ˜ ์—†๋Š” ๊ฒƒ์ด๋‹ค!
๊ทธ๋ž˜์„œ ํŒŒ์ด์ฌ์—์„œ ์™„์ „ํ•œ ์บก์Šํ™”๋Š” ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค. ํŒŒ์ด์ฌ์˜ ์ฒ ํ•™์ธ ๊ฑธ๊นŒ?


๐Ÿ“Œ[์–ธ๋”์Šค์ฝ”์–ด ์ด์•ผ๊ธฐ]

ํŒŒ์ด์ฌ์—์„œ ์–ธ๋”์Šค์ฝ”์–ด๋Š” ๋ช‡ ๊ฐ€์ง€ ์˜๋ฏธ๋ฅผ ๊ฐ–๋Š”๋‹ค.

  • _var
    ์†์„ฑ ์•ž์— ์–ธ๋”์Šค์ฝ”์–ด๋ฅผ ๋ถ™์ด๋Š” ๊ฑด ์ผ์ข…์˜ ์•ฝ์†์ธ๋ฐ, ๋‚ด๋ถ€์ ์œผ๋กœ๋งŒ ์‚ฌ์šฉํ•˜๋Š” ๋ณ€์ˆ˜๋ผ๋Š” ๋œป์ด๋‹ค.

  • var_
    ํŒŒ์ด์ฌ ์˜ˆ์•ฝ์–ด(int, next ๋“ฑ ์ƒ‰์ด ๋ณ€ํ•˜๋Š” ํ‚ค์›Œ๋“œ๋“ค)๋ฅผ ๋ณ€์ˆ˜๋กœ ์“ฐ๊ณ  ์‹ถ์„ ๋•Œ ๋ณ€์ˆ˜ ์ด๋ฆ„ ๋’ค์— ์–ธ๋”์Šค์ฝ”์–ด๋ฅผ ๋ถ™์ธ๋‹ค.

  • __var
    ์†์„ฑ ์•ž์— ๋ถ™๋Š” ๋˜๋”๋Š” ๊ฐ€์‹œ์„ฑ์„ ์กฐ์ ˆํ•˜๊ธฐ ์œ„ํ•ด์„œ ์“ฐ์ธ๋‹ค. ์ธํ„ฐํ”„๋ฆฌํ„ฐ๊ฐ€ ์ด๋ฆ„์„ ๋ญ‰๊ฐœ์„œ ๋‚ด๋ถ€์ ์œผ๋กœ ๋‹ค๋ฅธ ์ด๋ฆ„์œผ๋กœ ๋ฐ”๊พธ๊ธฐ ๋•Œ๋ฌธ์— ํด๋ž˜์Šค ์™ธ๋ถ€์—์„œ ํ•ด๋‹น ์ด๋ฆ„์œผ๋กœ ํ˜ธ์ถœํ•  ์ˆ˜ ์—†๋‹ค.

  • __var__
    ํŠน๋ณ„ํ•œ ์šฉ๋„๋กœ ์“ฐ๊ธฐ ์œ„ํ•ด ํŒŒ์ด์ฌ์—์„œ ์ •์˜ํ•ด ๋‘” ๋งค์ง ๋ฉ”์†Œ๋“œ์ด๋‹ค. __main__, __add__, __str__ ๋“ฑ์ด ์žˆ๋‹ค.

    • __main__ : ํ˜„์žฌ ํŒŒ์ผ์ด ์ง์ ‘ ์‹คํ–‰๋œ ๊ฑด์ง€ ๋ชจ๋“ˆ๋กœ์„œ ๋ถˆ๋ ค์˜จ ๊ฑด์ง€ ํ™•์ธํ•˜๋Š” ์šฉ๋„๋กœ ์“ฐ์ธ๋‹ค.

    • __add__ : ๋ง์…ˆ ์—ฐ์‚ฐ์ž๋ฅผ ์˜ค๋ฒ„๋กœ๋”ฉํ•˜๋Š” ๋ฐ ์“ฐ์ธ๋‹ค. int๋ผ๋ฆฌ ์—ฐ์‚ฐํ•˜๋ฉด ํ‰๋ฒ”ํ•œ ๋ง์…ˆ ์—ฐ์‚ฐ์ด์ง€๋งŒ str๋ผ๋ฆฌ ์—ฐ์‚ฐํ•˜๋ฉด ๋‘ ๋ฌธ์ž์—ด์ด ์ด์–ด์ง€๋Š” ์ด์œ ๋Š” str ํด๋ž˜์Šค ๋‚ด๋ถ€์—์„œ __add__๋ฅผ ์‚ฌ์šฉํ•ด ๋ง์…ˆ ์—ฐ์‚ฐ์ž๋ฅผ ์˜ค๋ฒ„๋กœ๋”ฉํ•ด๋‘์—ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

    • __str__ : ๊ฐ์ฒด๋ฅผ print()ํ•จ์ˆ˜์— ๋„ฃ์—ˆ์„ ๋•Œ ๋ญ๊ฐ€ ์ถœ๋ ฅ๋˜๊ฒŒ ํ•  ์ง€ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. int ๊ฐ์ฒด๋ฅผ ํ”„๋ฆฐํŠธํ•˜๋ฉด ๊ฐ’์ด ํŠ€์–ด๋‚˜์˜ค๊ณ  list๊ฐ์ฒด๋ฅผ ํ”„๋ฆฐํŠธํ•˜๋ฉด [๊ฐ’, ๊ฐ’, ๊ฐ’] ์ฒ˜๋Ÿผ ๊บพ์‡ ๋‚˜ ์ปด๋งˆ๊ฐ€ ๊ฐ™์ด ํŠ€์–ด๋‚˜์˜ค๋Š” ๊ฑด __str__๋ฅผ ์‚ฌ์šฉํ•ด ์˜ค๋ฒ„๋กœ๋”ฉํ•ด๋‘์—ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.


๐Ÿ“[ํŒŒ์ด์ฌ ๋ชจ๋“ˆ๊ณผ ํŒจํ‚ค์ง€]

import antigravity

ํŒŒ์ด์ฌ ๋ชจ๋“ˆ๋„ .py ํŒŒ์ผ์ด๋‹ค. ๊ทธ๋ ‡๋‹ค๋Š” ๊ฒƒ์€ ๊ทธ๋ƒฅ ์•„๋ฌด ์ฝ”๋“œ๋‚˜ ๋‹ค ๋ชจ๋“ˆ๋กœ ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜ ์žˆ๋‹ค๋Š” ๋ง์ด๋‹ค. ์ฝ”๋“œ ๋‚ด์—์„œ import myModule ๊ณผ ๊ฐ™์ด myModule.py ํŒŒ์ผ์„ ๋ถˆ๋Ÿฌ์˜ค๋ ค๊ณ  ์‹œ๋„ํ•˜๋ฉด,

  1. ๋จผ์ € ์ฝ”๋“œ๊ฐ€ ์ €์žฅ๋œ ํด๋”์—์„œ ํ•ด๋‹น ์ด๋ฆ„์˜ ๋ชจ๋“ˆ์„ ์ฐพ๋Š”๋‹ค. (์žˆ์œผ๋ฉด ๋ถˆ๋Ÿฌ์˜จ๋‹ค)
  2. ์—†์œผ๋ฉด ํŒŒ์ด์ฌ์ด ์„ค์น˜๋œ ์œ„์น˜์— ๊ฐ€์„œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํด๋”๋ฅผ ๋’ค์ง„๋‹ค. ์—ฌ๊ธฐ ์—†์œผ๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋‚œ๋‹ค.

์ค‘์š”ํ•œ ๊ฑด ๋ชจ๋“ˆ์„ ํ˜„์žฌ ํด๋”์—์„œ ๊ฐ€์žฅ ๋จผ์ € ์ฐพ๋Š”๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ์ด๊ฒŒ ๋ญ๊ฐ€ ๋ฌธ์ œ๋ƒ๋ฉด ์ฝ”๋“œ๋ฅผ ์ €์žฅํ•  ๋•Œ ํŒŒ์ผ๋ช…์„ ๋‚ด๊ฐ€ ๋ถˆ๋Ÿฌ๋‹ค ์“ธ ๋ชจ๋“ˆ ์ด๋ฆ„๊ณผ ๋˜‘๊ฐ™๊ฒŒ ํ•˜๋ฉด ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ๋ชจ๋“ˆ ๋Œ€์‹ ์— ๊ทธ ์ฝ”๋“œ๊ฐ€ ๋ถˆ๋ ค์˜ค๋Š” ์ผ์ด ์ผ์–ด๋‚œ๋‹ค. ์ฃผ์˜ํ•  ๊ฒƒ...

๋ชจ๋“ˆ์ด ํ•˜๋‚˜์˜ ํŒŒ์ผ์ด ์•„๋‹ˆ๋ผ ํด๋” ์†์— ํด๋” ์†์— ๋ญ๊ฐ€ ๋ง‰ ๋“ค์–ด์žˆ๋Š” ๊ฒฝ์šฐ์—๋Š” ํŒจํ‚ค์ง€๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค. ํŒจํ‚ค์ง€๋“ค ์ค‘์—๋Š” ๊ทœ๋ชจ๊ฐ€ ์•„์ฃผ ํฐ ๊ฒƒ๋„ ๋งŽ๋‹ค. ํŒจํ‚ค์ง€ ๋‚ด์˜ ๋ชจ๋“ˆ์„ ๋ถ€๋ฅผ ๋•Œ๋Š” .์„ ์‚ฌ์šฉํ•ด์„œ ์ ‘๊ทผํ•˜๋Š”๋ฐ, from matplotlib.pyplot import * ์ด๋Ÿฐ ์‹์œผ๋กœ ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.
์ด๋ ‡๊ฒŒ ์“ฐ๋ฉด matplotlib ํŒจํ‚ค์ง€ ๋‚ด์˜ pyplot ๋ชจ๋“ˆ ๋‚ด์˜ ๋ชจ๋“  ๊ฒƒ์„ ๋‹ค ๋ถˆ๋Ÿฌ์˜จ๋‹ค. ๋งˆ์ง€๋ง‰์˜ *์€ ์™€์ผ๋“œ์นด๋“œ๋กœ ์“ฐ์ด๋Š” ๊ทธ ๋ณ„์ด๋‹ค.


๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ฆ [ํ”ผ์–ด ์„ธ์…˜]

๋˜๋”์™€ ๋งน๊ธ€๋ง ์ด์•ผ๊ธฐ, ํŒŒ์ด์ฌ์—๋Š” private ํ‚ค์›Œ๋“œ๊ฐ€ ์—†๋‹ค๋Š” ์–˜๊ธฐ๋ฅผ ์ข€ ํ–ˆ๋‹ค. ๊ฑฐ์˜ ํŒŒ์ด์ฌ๋งŒ ์“ฐ๋‹ˆ๊นŒ ๋‹ค๋ฅธ ์–ธ์–ด ์ด์•ผ๊ธฐ๋ฅผ ๋“ฃ๋Š” ๊ฒŒ ์žฌ๋ฏธ์žˆ๋‹ค. ๊ณผ์ œ ์–˜๊ธฐ๋ฅผ ํ•˜๋‹ค๊ฐ€ ์ •๊ทœํ‘œํ˜„์‹ ์ด์•ผ๊ธฐ๊ฐ€ ๋‚˜์™”๋Š”๋ฐ ๋“ค์–ด๋ณด๋‹ˆ๊นŒ ์ •๊ทœํ‘œํ˜„์‹์„ ์ž˜ ์“ธ ์ค„ ์•Œ๋ฉด ํŽธํ•ด์ง€๋Š” ๋ถ€๋ถ„์ด ๋งŽ์„ ๊ฒƒ ๊ฐ™๋‹ค. import re

profile
๋ฐ˜๊ฐ€์›Œ์šฉ

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