์ธ๊ณต์ง€๋Šฅ๐Ÿพ/ํŒŒ์ด์ฌ ๊ธฐ๋ณธ

[ํŒŒ์ด์ฌ ๊ธฐ๋ณธ ๊ฐœ๋…] ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ

๐Ÿช„ํ•˜๋ฃจ๐Ÿช„ 2023. 1. 9. 09:09
728x90

* ์ด ๊ธ€์€ ๋„ค์ด๋ฒ„ ๋ถ€์ŠคํŠธ ์ฝ”์Šค์˜ ์ธ๊ณต์ง€๋Šฅ(AI) ๊ธฐ์ดˆ ๋‹ค์ง€๊ธฐ ๊ฐ•์˜๋ฅผ ์ˆ˜๊ฐ•ํ•˜๋ฉฐ ์ •๋ฆฌํ•œ ๊ธ€์ž…๋‹ˆ๋‹ค.

Decorator๋Š” ํ•ด๋‹น ๊ฐ•์˜๋งŒ์œผ๋กœ๋Š” ์ดํ•ด๊ฐ€ ์–ด๋ ค์›Œ ๋‹ค์‹œ ์ฐพ์•„์„œ ์ •๋ฆฌํ•˜์˜€์Œ

 

ํด๋ž˜์Šค์™€ ๊ฐ์ฒด

์ ˆ์ฐจ์ง€ํ–ฅ vs ๊ฐ์ฒด์ง€ํ–ฅ

์ ˆ์ฐจ์ง€ํ–ฅ : ์ˆ˜๊ฐ•์‹ ์ฒญ์˜ ์‹œ์ž‘๋ถ€ํ„ฐ ๋๊นŒ์ง€ ์ˆœ์„œ๋Œ€๋กœ ์ €์žฅ

๊ฐ์ฒด์ง€ํ–ฅ : ์ˆ˜๊ฐ•์‹ ์ฒญ ๊ด€๋ จ ์ฃผ์ฒด๋“ค์˜ ํ–‰๋™๊ณผ ๋ฐ์ดํ„ฐ ๋“ค์„ ์ค‘์‹ฌ์œผ๋กœ ํ”„๋กœ๊ทธ๋žจ ์ž‘์„ฑ

 

๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ Object-Oriented Programming

- ํด๋ž˜์Šค์™€ ์ธ์Šคํ„ด์Šค(=๊ฐ์ฒด)

  ๋ถ•์–ด๋นตํ‹€  ๋ถ•์–ด๋นต

- ๊ฐ์ฒด : ์†์„ฑ(Attribute)์™€ ํ–‰๋™(Action)์„ ๊ฐ€์ง

            ๋ณ€์ˆ˜(variable)      ํ•จ์ˆ˜(method)

 

์ฝ”๋“œ๋กœ ์‚ดํŽด๋ณด๊ธฐ

๋”๋ณด๊ธฐ

class SoccerPlayer(object):

                                        ์ƒ์†๋ฐ›๋Š” ๊ฐ์ฒด๋ช…

      def __init__(self, name : ์ž๋ฃŒํ˜•, position : ์ž๋ฃŒํ˜•, back_number : ์ž๋ฃŒํ˜•):  ##__init__์€ ๊ฐ์ฒด ์ดˆ๊ธฐํ™” ์˜ˆ์•ฝ ํ•จ์ˆ˜

                              ์ƒ์„ฑ๋œ ์ธ์Šคํ„ด์Šค

            self.name = name

            self.position = position

            self.back_number = back_number

 

a   =   SoccerPlayer("sarah", "left", 10)

b   =   SoccerPlayer("nick", "right", 20)

---       -----------------    -----------------------

๊ฐ์ฒด         ํด๋ž˜์Šค            __init__ ํ•จ์ˆ˜ ์ธํ„ฐํŽ˜์ด์Šค, ์ดˆ๊ธฐ๊ฐ’

 

์ฐธ๊ณ .

    โ— __init__์€ ๊ฐ์ฒด ์ดˆ๊ธฐํ™” ์˜ˆ์•ฝํ•จ์ˆ˜

            __์€ ํŠน์ˆ˜ํ•œ ์˜ˆ์•ฝํ•จ์ˆ˜๋‚˜ ๋ณ€์ˆ˜ ๊ทธ๋ฆฌ๊ณ  ํ•จ์ˆ˜๋ช… ๋ณ€๊ฒฝ(๋งจ๊ธ€๋ง)์œผ๋กœ ์‚ฌ์šฉ

            ex. __main__    __add__    __str__    __eq__

                            ๊ฐ์ฒด+๊ฐ์ฒด  print(๊ฐ์ฒด)

    โ— ํŒŒ์ด์ฌ ์ด๋ฆ„ ๊ทœ์น™

                             ํด๋ž˜์Šค๋ช…     vs     ํ•จ์ˆ˜๋ช…๊ณผ ๋ณ€์ˆ˜๋ช…

      ๋„์–ด์“ฐ๊ธฐ ๋ถ€๋ถ„      ๋Œ€๋ฌธ์ž                     _

                         ex.     ExpensiveCar          gasoline_engine

 

 

์ฃผ์š”๊ฐœ๋…

1. Inheritance    ์ƒ์†

๋ถ€๋ชจํด๋ž˜์Šค์˜ ์†์„ฑ์„ ์ž์‹ํด๋ž˜์Šค๊ฐ€ ์ƒ์†๋ฐ›๋Š”๊ฒƒ

์ž์‹ํด๋ž˜์Šค์˜ ํ•จ์ˆ˜๋Š” super()์„ ์ด์šฉํ•ด์„œ ์ƒ์†ํ•˜๊ฑฐ๋‚˜ ์ถ”๊ฐ€์ ์ธ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Œ

๋”๋ณด๊ธฐ

class ๋ถ€๋ชจ(Object):

      ......

 

class ์ž์‹(๋ถ€๋ชจ):

      def __init__(self, name, age, gender, salary, hire_date):

            super().__init__(name, age, gender)

            self.salary=salary

            self.hire_date=hire_date

cf) ์˜ค๋ฒ„๋ผ์ด๋”ฉ(Overriding) : ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ ์ผ๋ถ€๋ฅผ ์ž์‹ ํด๋ž˜์Šค์—์„œ ๋ณ€๊ฒฝํ•˜๋Š”๊ฒƒ. ์˜ค๋ฒ„๋ผ์ด๋”ฉ ํ•˜์ง€ ์•Š์€ ๋‹ค๋ฅธ ๋ฉ”์„œ๋“œ๋Š” ๊ทธ๋Œ€๋กœ ์ƒ์†๋จ

 

 

2. Polymorphism    ๋‹คํ˜•์„ฑ

๊ฐ™์€ ์ด๋ฆ„ ๋ฉ”์†Œ๋“œ์˜ ๋‚ด๋ถ€ ๋กœ์ง์„ ๋‹ค๋ฅด๊ฒŒ ์ž‘์„ฑํ•˜๋Š”๊ฒƒ

- ์ฃผ๋กœ ๋ถ€๋ชจํด๋ž˜์Šค์—์„œ ์ถ”์ƒ ๋ฉ”์†Œ๋“œ๋ฅผ ๋งŒ๋“ค๊ณ ->์ž์‹์—์„œ ์ƒ์†์‹œ ํ•จ์ˆ˜ ์ด๋ฆ„์€ ๋™์ผ but ์ƒ์„ธ ๊ตฌํ˜„๋งŒ ๋‹ค๋ฆ„

cf) ์˜ค๋ฒ„๋กœ๋”ฉ(Overloading) : ๋™์ผํ•œ ์ด๋ฆ„์˜ ํ•จ์ˆ˜๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ๊ธฐ๋Šฅ์œผ๋กœ ๋™์ž‘ํ•˜๊ฒŒ ํ•˜๋Š”๊ฒƒ

     ํŒŒ์ด์ฌ์—์ € ์ •์‹์œผ๋กœ ์ง€์›ํ•˜๋Š” ๊ฐœ๋…์€ ์•„๋‹˜

 

์˜ค๋ฒ„๋ผ์ด๋”ฉ๊ณผ ์˜ค๋ฒ„๋กœ๋”ฉ์˜ ๊ฒฝ์šฐ ์ด๋ฆ„๋„ ๋น„์Šทํ•˜๊ณ , ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ์˜ ์ฃผ์š” ๊ฐœ๋…์ด๋ผ ํ—ท๊ฐˆ๋ฆฌ์ง€ ์•Š๋Š”๊ฒƒ์ด ์ค‘์š”

์™ธ์šฐ๊ธฐํŒ.

ํ•จ์ˆ˜ ์ด๋ฆ„ ํ•˜๋‚˜๋‹น ๋งค๊ฐœ๋ณ€์ˆ˜์— ๋”ฐ๋ผ ์–ด๋–ค ํ•จ์ˆ˜๋ฅผ ๋ถˆ๋Ÿฌ์™€์•ผ ํ• ์ง€ ์„ ํƒํ•ด์•ผ ํ•˜๋‹ˆ๊นŒ loading ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆผ -> ์˜ค๋ฒ„๋กœ๋”ฉ!

 

3. Visibility

๊ฐ์ฒด์˜ ์ •๋ณด๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋Š” ๋ ˆ๋ฒจ์„ ์กฐ์ ˆํ•˜๋Š”๊ฒƒ(๋ณด์•ˆ)

- ์บก์Šํ™” ๋˜๋Š” ์ •๋ณด ์€๋‹‰์ด๋ผ๊ณ  ํ•จ -> ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉ

     __๋ณ€์ˆ˜๋ช… : private ๋ณ€์ˆ˜๋กœ ์„ ์–ธํ•˜๋Š”๊ฒƒ์œผ๋กœ ํƒ€ ๊ฐ์ฒด๊ฐ€ ์ ‘๊ทผํ•˜์ง€ ๋ชปํ•จ

- private ๋ณ€์ˆ˜์— ์ ‘๊ทผํ•˜๋Š” ๋ช‡๊ฐ€์ง€ ๋ฐฉ๋ฒ•

  • @property : property decorator๋กœ ์ˆจ๊ฒจ์ง„ ๋ณ€์ˆ˜๋ฅผ ๋ฐ˜ํ™˜

 

์˜ˆ์ œ) ์ƒ์„ฑ์ž์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ private์ธ Carํด๋ž˜์Šค๋ฅผ ๊ตฌํ˜„ํ•˜์—ฌ๋ผ.

๋‹จ, ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•ด์•ผํ•œ๋ฉฐ ์ฐจ์˜ ์•ž์ขŒ์„์— ๋ช‡๊ฐœ์˜ ๋ฌธ์ด ์—ด๋ ค์žˆ๋Š”์ง€ ์ถœ๋ ฅํ•˜๋Š” ๋กœ์ง์„ ํด๋ž˜์Šค ๋ฐ–์— ๊ตฌํ˜„ํ•˜์—ฌ์•ผ ํ•œ๋‹ค.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class Car():
    def __init__(self, frontleft, frontright):
        self.__frontleft = frontleft
        self.__frontright = frontright
    ##Decorator์ธ property๋ฅผ ์ด์šฉํ•˜์—ฌ private ๋ฐ์ดํ„ฐ์— ใ…“ใ…‚๊ทผ
    @ property
    def frontleft(self):
        return self.__frontleft
    @ property
    def frontright(self):
        return self.__frontright
 
 
#Car ํด๋ž˜์Šค ๊ฐ์ฒด ์„ ์–ธ
car = Car(TrueFalse)
 
# ์ฐจ์˜ ์—ด๋ฆฐ๋ฌธ ๊ฐœ์ˆ˜๋ฅผ ์„ธ๋Š” ํ•จ์ˆ˜
def frontdoor_open_num(leftdoor, rightdoor):
    if leftdoor & rightdoor == True:
        return 2
    elif leftdoor | rightdoor == True:
        return 1
    else:
        return 0
 
print(frontdoor_open_num(car.frontleft, car.frontright))
cs

 

cf) Decorator ๋ž€?

    - First-class objects

    - ์ผ๋“ฑํ•จ์ˆ˜ ๋˜๋Š” ์ผ๊ธ‰ ๊ฐ์ฒด

    - ๋ณ€์ˆ˜๋‚˜ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์— ํ• ๋‹น์ด ๊ฐ€๋Šฅํ•œ ๊ฐ์ฒด

    - ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ „๋‹ฌ or ๋ฆฌํ„ด๊ฐ’์œผ๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

   ํŒŒ์ด์ฌ์˜ ๋ชจ๋“  ํ•จ์ˆ˜๋Š” ์ผ๊ธ‰ํ•จ์ˆ˜์ด๋‹ค." => ํ•จ์ˆ˜์ž์ฒด๋ฅผ ํŒŒ๋ผ๋ฏธํ„ฐ์™€ ๋ฆฌํ„ด๊ฐ’์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ

    - ์‚ฌ์šฉ ๋ชฉ์  : ํ•จ์ˆ˜๋ฅผ ์ˆ˜์ •ํ•˜์ง€ ์•Š์€ ์ƒํƒœ์—์„œ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ => ํ•จ์ˆ˜๋งˆ๋‹ค ๋ฐ˜๋ณต๋˜๋Š” ์ผ์„ ํ•  ๋•Œ

 

์˜ˆ์ œ) ํ•จ์ˆ˜๋ฅผ ์‹œ์ž‘ํ•˜๊ณ  ๋๋‚ผ๋•Œ ํ•จ์ˆ˜์ด๋ฆ„+ํ•จ์ˆ˜์‹œ์ž‘, ํ•จ์ˆ˜์ด๋ฆ„+ํ•จ์ˆ˜ ๋์„ ์ถœ๋ ฅํ•ด ๋ณด์ž.

hi ํ•จ์ˆ˜ ์‹œ์ž‘
hi
hi ํ•จ์ˆ˜ ๋
bye ํ•จ์ˆ˜ ์‹œ์ž‘
bye
bye ํ•จ์ˆ˜ ๋

 

๊ตฌํ˜„1) ํ•จ์ˆ˜ ์•ˆ์—์„œ ํ•˜๋‚˜์”ฉ ๊ตฌํ˜„

1
2
3
4
5
6
7
8
def hi():
    print("hi ํ•จ์ˆ˜ ์‹œ์ž‘")
    print("hi")
    print("hi ํ•จ์ˆ˜ ๋")
def bye():
    print("bye ํ•จ์ˆ˜ ์‹œ์ž‘")
    print("bye")
    print("bye ํ•จ์ˆ˜ ๋")
cs

๋ชจ๋“  ํ•จ์ˆ˜๋งˆ๋‹ค print๋ฌธ์„ ์ž…๋ ฅํ•ด์•ผ ํ•˜๋ฏ€๋กœ ๋ฒˆ๊ฑฐ๋กญ๋‹ค.

 

๊ตฌํ˜„2) ํ•จ์ˆ˜๋กœ ๊ตฌํ˜„

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
def trace(func): #ํ˜ธ์ถœํ•  ํ•จ์ˆ˜๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฐ›๋Š” ํ•จ์ˆ˜
    def wrapper():
        print(func.__name__, 'ํ•จ์ˆ˜ ์‹œ์ž‘')
        func()
        print(func.__name__, 'ํ•จ์ˆ˜ ๋')
    return wrapper
 
def hi():
    print("hi")
 
def bye():
    print("bye")
 
trace_hi=trace(hi) #๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ํ•จ์ˆ˜ ์ „๋‹ฌ
trace_hi() #๋ฐ˜ํ™˜๋œ ํ•จ์ˆ˜ ํ˜ธ์ถœ
trace_bye=trace(bye) #๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ํ•จ์ˆ˜ ์ „๋‹ฌ
trace_bye() #๋ฐ˜ํ™˜๋œ ํ•จ์ˆ˜ ํ˜ธ์ถœ
cs

 

๊ตฌํ˜„3) decorator๋กœ ๊ตฌํ˜„ - @ ์‚ฌ์šฉ

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
def trace(func): #decorator : ํ˜ธ์ถœํ•  ํ•จ์ˆ˜๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ 
    def wrapper():
        print(func.__name__, 'ํ•จ์ˆ˜ ์‹œ์ž‘')
        func()
        print(func.__name__, 'ํ•จ์ˆ˜ ๋')
    return wrapper
 
@trace #decorator
def hi():
    print("hi")
@trace #decorator
def bye():
    print("bye")
 
hi()
bye()
cs
728x90