Python/파이썬 심화

병행성 - 기본 (2)

monstro 2025. 9. 14. 23:29
728x90
반응형

- 개요

클래스를 통해 iterable한 객체를 사용하는 방법을 알아본다

이때 다음의 2가지 방식을 사용하여 구현한다

  • __next__ 매직 메서드를 오버라이드
  • Generator를 사용

 

1) __next__ 매직 메서드를 오버라이드하여 iterable한 객체 사용

class WordSplitter:
    def __init__(self, text):
        self._idx = 0
        self._text = text.split(' ')

    def __next__(self):
        try:
            word = self._text[self._idx]
        except IndexError:
            raise StopIteration('Stop Iteration')
        self._idx += 1
        return word

    def __repr__(self):
        return f"WordSplit {self._text}"

ex1 = WordSplitter("Hello Python")
print(next(ex1))
print(next(ex1))

 

WordSplitter 클래스를 생성하여 Iterable한 객체를 사용한다

해당 클래스의 구성은 다음과 같다

  • __init__ 매직 메서드 : 클래스의 인스턴스를 정의
    • 문자열을 인자로 받아 인스턴스 생성
    • 문자열의 인덱스0으로 초기화
    • 공백을 기준으로 문자열을 분리
  • __next__ 매직 메서드 : 오버라이드하여 try-catch 문을 통해 인덱스별분리된 문자열 반환
  • __repr__ 매직 메서드 : 클래스의 인스턴스에 대한 문장 출력

 

 

코드를 실행한 결과는 위와 같다

"Hello Python"의 문자열을 공백으로 분리하고 next 메서드를 통해 iterable한 객체의 데이터를 추출한다

 

2) generator를 통한 iterable한 객체 사용

class WordSplitterWithGenerator:
    def __init__(self, text):
        self._text = text.split(' ')

    def __iter__(self):
        for word in self._text:
            yield word
        return

    def __repr__(self):
        return f"WordSplitWithGenerator {self._text}"

ex2 = WordSplitterWithGenerator("Hello Python")
ex3 = iter(ex2)
print(next(ex3))
print(next(ex3))

 

1)의 예제와 다르게 __next__ 메서드를 오버라이드하지 않고, 대신 __iter__ 메서드를 오버라이드한다

이때 오버라이드한 로직에서 yield 키워드를 사용한다

yield 키워드generator를 생성하기 위해 사용하는데, generator의 특징은 다음과 같다

  • generator iterator를 생성하는 함수
  • generatornext 함수와 동일하게 값을 하나씩 반환하면서 함수의 상태를 유지
  • 필요에 따라 함수를 중지하고 중지한 시점에서 재개할 수 있음
  • 모든 메모리한번에 저장하지 않고, 필요할 때마다 값을 생성하므로 효율적인 메모리 처리가 가능

 

 

코드를 실행한 결과는 위와 같다

WordSplitterWithGenerator 클래스의 인스턴스 ex2를 생성하고 iter 메서드를 통해 iterable한 ex3를 생성한다

ex3 인스턴스를 next 함수에 인자로 넘겨주어 값을 하나씩 추출한다 

728x90
반응형

'Python > 파이썬 심화' 카테고리의 다른 글

코루틴 (1)  (0) 2025.10.12
제너레이터 + itertools 모듈  (0) 2025.09.28
병행성 - 기본 (1)  (0) 2025.09.14
데코레이터  (0) 2025.09.02
클로저 (2)  (0) 2025.08.21