ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Python] 객체와 클래스, 스페셜 메소드
    Coding/Python 2022. 12. 19. 18:01

    파이썬의 class 문을 이용해서 새로운 객체 타입을 정의할 수 있다.

     

    다음은 간단한 pop, push 연산을 수행하는 스택을 정의하는 Stack class이다.

    class Stack:
        def __init__(self):		# 스택 초기화
        	self._items = []	# underbar 하나가 앞에 붙은 변수는 private 변수로 간주한다
        def push(self, item):	# push 연산 정의 : stack 에 값을 추가한다
        	self._items.append(item) 
        def pop(self):		# pop 연산 정의 : stack 맨 위의 값을 삭제하고 리턴한다
        	return self._items.pop()

    파이썬에서 클래스를 정의할 때, underbar 2개가 앞 뒤에 붙은 메소드가 정의되어있는 것을 자주 볼 수 있다.

    위의 경우에도 __init__ 이라는 메소드가 정의되어있다. 

    이것을 스페셜 메소드라고 한다. 

    참고로 underbar 2개를 double under를 줄여 dunder라고 부르기도 한다. 

     

    스페셜 메소드란?

    스페셜 메소드란 직접 정의한 객체에 파이썬의 내장 함수를 사용할 수 있도록 클래스에 추가해준 메소드를 말한다. 

     

    파이썬에서 사용할 수 있는 스페셜 메소드는 미리 정해져있다.

    여기에서는 그중 많이 사용되는 일부를 소개하겠다. 

     

    초기화 __init__

    객체를 초기화할 때 사용하는 스페셜 메소드이다. 

    객체를 처음 정의할 때 값을 대입하도록 인자를 줄 수 있다. 

    class Stack:
        def __init__(self, initItems):		# 리스트를 초기값으로 받는다
        	self._items = initItems
        def push(self, item):
        	self._items.append(item) 
        def pop(self):
        	return self._items.pop()

     

    길이 __len__

    객체의 길이를 반환하도록 하는 스페셜 메소드이다. 

    위의 클래스에서 아래와 같이 추가할 수 있다. 

    class Stack:
        def __init__(self, initItems):
        	self._items = initItems
        def __len__(self):				# stack의 길이를 리턴
        	return len(self._items)
            
        def push(self, item):
        	self._items.append(item) 
        def pop(self):
        	return self._items.pop()

    이는 객체에 파이썬 내장함수 len 을 사용할 수 있게 해준다. 

    >>> stack = Stack([1,2])
    >>> stack.push(3)
    >>> len(stack)
    3

     

    사칙연산

    객체에 사칙연산을 정의할 수 있다. 

    덧셈은 __add__, 뺄셈은 __sub__, 곱셈은 __mul__, 나눗셈은 __truediv__로 정의한다. 

     

    Stack class에서 곱셈을 정의할 수 있겠다.

    정수를 입력받아 stack 전체를 해당 정수만큼 반복하도록 해보자. 

    class Stack:
        def __init__(self, initItems):
        	self._items = initItems
        def __len__(self):
        	return len(self._items)
        def __mul__(self, n):			# 정수를 입력받고 그 정수만큼 stack 반복
        	return Stack(self._items*n)
            
        def push(self, item):
        	self._items.append(item) 
        def pop(self):
        	return self._items.pop()

    이제 stack을 n번 반복하도록 할 수 있다.

    >>> stack = Stack([1,2,3])
    >>> stack2 = stack*2
    >>> len(stack2)
    6
    >>> stack2.pop()
    3
    >>> stack2.pop()
    2
    >>> stack2.pop()
    1
    >>> stack2.pop()
    3
    >>>

     

    문자열 변환 __str__

    객체에 str 함수를 사용할 수 있게 해준다. 정의하기 나름이다. 

    class Stack:
        def __init__(self, initItems):
        	self._items = initItems
        def __len__(self):
        	return len(self._items)
        def __mul__(self, n):
        	return Stack(self._items*n)
        def __str__(self):				# stack을 string으로 변환해 리턴
        	return str(self._items)
            
        def push(self, item):
        	self._items.append(item) 
        def pop(self):
        	return self._items.pop()
    >>> stack = Stack([1,2,3])
    >>> stack.push(4)
    >>> str(stack)
    '[1, 2, 3, 4]'

     

    이 외에도 다양한 스페셜 메소드가 존재한다. 

    스페셜 메소드를 적절히 활용하면 'Pythonic'한 코드를 작성하는데 도움이 된다고 한다.

     

    'Coding > Python' 카테고리의 다른 글

    [Python] 반복 가능한 객체의 언패킹  (0) 2022.12.22

    댓글

Designed by Tistory.