[Python] 기초 - OOP 메서드(Object-Oriented Programming)

ITmakesmeSoft·2022년 9월 3일
0

PYTHON [BASIC]

목록 보기
10/13
post-thumbnail

OOP 메서드(Object-Oriented Programming)

  • 특정 데이터 타입/클래스의 객체 에 공통적으로 적용 가능한 행위(함수)
class Person:
	def __init__(self.name):
		self.name=name

	def eat(self, food):
		print(f'{food} 냠냠')

person1=Person('홍길동')
person1.eat('피자') # 피자 냠냠
  • 메서드 종류

    • 인스턴스 메서드

      • 호출한 인스턴스를 의미하는 self 매개 변수를 통해 인스턴스를 조작

      • 인스턴스 메서드는 클래스 변수, 인스턴스 변수 둘 다 사용 가능

        class MyClass:
        	def instance_method(self):
        		return 'instance method', self
        
        my_instance = MyClass()
        print(my_instance.instance_method()) 
        # ('instance method', <__main__.MyClass at 0x184fd086a00>)
      • self

        • 인스턴스 자기 자신
        • 파이썬에서 인스턴스 메서드는 호출 시 첫번째 인자로 인스턴스 자신(self)이 전달되게 설계됨
      • __init__ (생성자 메서드)

        • 인스턴스 객체가 생성될 때 자동으로 호출되는 메서드
        • 인스턴스 변수들의 초기값을 설정
      • __del__ (소멸자 메서드; destructor)

        • 인스턴스 객체가 소멸(파괴)되기 직전에 호출되는 메서드
        • 파이썬은 메모리를 효율적으로 사용하기 위해 코드가 종료되면 자동으로 del 실행됨.
      • 매직 메서드( __ )

        • Double underscore(__)가 있는 메서드는 특수한 동작을 위해 만들어진 메서드로, 스페셜 메서드 혹은 매직 메서드라고 불림
        • 특정 상황에서 자동으로 불리는 메서드
        • 매직 메서드도 인스턴스 메서드
        • ex)
          • __str__(self) : 해당 객체의 출력 형태를 지정
          • __gt__ : 부등호 연산자 (>, greater than)
            - __len(self)__, __repr__(self)
        # 매직 메서드 예시
        class Circle:
            def __init__(self, r):
                self.r = r
        
            def area(self):
                return 3.14 * self.r * self.r
        
            def __str__(self): # 출력
                return f'[원] radius: {self.r}'
        
            def __gt__(self, other): # 부등호
                return self.r > other.r
        
            c1 = Circle(10)
            c2 = Circle(1)
        
            print(c1) # __str__ 실행 => [원] radius : 10
            print(c2) # __str__ 실행 => [원] radius : 1
            print(c1 > c2) # __gt__ 실행 => True
            print(c1 < c2) # __gt__ 실행 => False 
    • 클래스 메서드

      • 클래스가 사용할 메서드

      • @classmethod 데코레이터를 사용하여 정의

      • 클래스를 의미하는 cls 매개 변수를 통해 클래스를 조작

      • 클래스 메서드는 인스턴스 변수 사용 불가

        class MyClass:
        	@classmethod  # 클래스 메서드라고 선언해줘야함
        	def class_method(cls):
        		return 'class method', cls
        
        MyClass.class_method()
        # 클래스 메서드 활용
        class Person:
            count = 0
            def __init__(self, name):
                self.name = name
                Person.count += 1
        
            @classmethod
            def number_of_population(cls):
                print(f'인구수는 {cls.count}명 입니다.')
        
        person1 = Person('아이유')
        person2 = Person('이찬혁')
        Person.**number_of_population()** # 인구수는 2명 입니다.
    • 데코레이터

      • 함수를 어떤 함수로 꾸며서 새로운 기능을 부여

      • @데코레이터(함수명) 형태로 함수 위에 작성

      • 순서대로 적용되기 때문에 작성 순서가 중요

        # 데코레이터 X
        def hello():
            print("hello")
        
        def add_print(original): # 파라미터로 함수를 받는다
        	def wrapper(): # 함수 내에서 새로운 함수 선언
        		print("함수 시작") # 부가기능 -> original 함수를 꾸밈
        		original()
        		print("함수 끝") # 부가기능 -> original 함수를 꾸밈
        	return wrapper # 함수를 return # 뒤에 ()가 붙지 않음!!
        								 # 이 개념을 이해하기 위해서는 '클로저' 학습 필요
        
        add_print(hello)() # 함수 시작
        									 # "hello"
        									 # 함수 끝
        #아래와 같이도 호출 가능
        print_hello = add_print(hello) 
        print_hello()
        # 데코레이터 O
        def add_print(original): # 파라미터로 함수를 받는다
        	def wrapper(): # 함수 내에서 새로운 함수 선언
        		print("함수 시작") # 부가기능 -> original 함수를 꾸밈
        		original() 
        		print("함수 끝") # 부가기능 -> original 함수를 꾸밈
            return wrapper # 함수를 return # 뒤에 ()가 붙지 않음
                          # 클로저 개념으로, 함수를 실행하지 않고 오브젝트만 반환
        
        @add_print # add_print를 사용해서 print_hello()함수를 꾸며주도록 하는 명령어
        def print_hello():
        	print('hello')
        
        print_hello()
      • 데코레이터에 대한 자세한 내용 참고

      • 클로저에 대한 자세한 내용

    • 정적 메서드(Static Method)

      • 인스턴스 변수, 클래스 변수를 전혀 다루지 않는 메서드

      • self, cls 가 필요없음

      • 속성을 다루지 않고 단지 기능(행동)만을 하는 메서드를 정의할 때 사용

      • 즉, 객체 상태나 클래스 상태를 수정할 수 없음

      • @staticmethod 데코레이터를 사용하여 정의

      • 일반 함수처럼 동작하지만, 클래스의 이름 공간에 귀속됨.
        - 주로 해당 클래스로 한정하는 용도로 사용

        class MyClass:
        	@staticmethod
        	def static_method(arg1, ...):
        
        MyClass.static_method(...)
        # 스태틱 메서드 사용 예시
        class Person:
        	count = 0
        	def __init__(self, name):
        		self.name = name
        		Person.count += 1
        	
        	@staticmethod
        	def check_rich(money):
        		return money > 10000
        
        person1 = Person('아이유')
        person2 = Person('이찬혁')
        # 스태틱 메서드는 클래스 메서드와 인스턴스 메서드로도 접근 가능
        print(Person.check_rich(100000)) # True => 클래스 메서드에서 접근 
        print(person1.check_rich(100000)) # True => 인스턴스 메서드에서 접근
    • 인스턴스와 클래스 간의 이름 공간(namespace)

      • 클래스를 정의하면, 클래스와 해당하는 이름 공간 생성

      • 인스턴스를 만들면, 인스턴스 객체가 생성되고 이름 공간 생성

      • 인스턴스에서 특정 속성에 접근하면, 인스턴스-클래스 순으로 탐색

        # Person 정의
        class Person:
            name= 'Unknown'
            def talk(self):
                print(self.name)
        
        p1 = Person()
        # p1은 인스턴스 변수가 정의되지 않아 클래스 변수(Unknown)가 출력됨.
        p1.talk() # Unknown 
        
        p2 = Person()
        p2.talk() # Unknown
        # p2에 인스턴스 변수를 정의하면 출력됨.
        p2.name = '홍길동'
        p2.talk() # 홍길동
        
        print(Person.name)
        print(p1.name) # unknown <= 클래스 변수
        print(p2.name) # 홍길동 <= 인스턴스 변수
profile
💎 Daniel LEE | SSAFY 8th

0개의 댓글