CodeGym /์ž๋ฐ” ์ฝ”์Šค /Python SELF KO /ํด๋ž˜์Šค์™€ ๊ฐ์ฒด ์ƒ์„ฑ

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

Python SELF KO
๋ ˆ๋ฒจ 15 , ๋ ˆ์Šจ 3
์‚ฌ์šฉ ๊ฐ€๋Šฅ

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 ๊ฐ์ฒด๋ฅผ ํ†ตํ•ด ๊ณตํ†ต ๋ฐ์ดํ„ฐ๋ฅผ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์–ด.

์ฝ”๋ฉ˜ํŠธ
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION