아침에 시리얼을 먹으려고 상자를 열었는데, 내용물이 하나씩 쏟아져 나오는 경험, 다들 한 번쯤 있으시죠?
프로그래밍에서도 이와 비슷한 개념이 있습니다.
바로 이터레이터(iterator)와 iterable입니다.
데이터를 효율적으로 관리하고 순회하는 데 핵심적인 역할을 하는 이 두 가지 개념을 완벽하게 정리해 보겠습니다.
Iterable이란 무엇일까요?
Iterable은 '반복 가능한' 객체를 의미합니다.
쉽게 말해, 여러 개의 원소를 담고 있어서 하나씩 차례대로 꺼내 쓸 수 있는 객체라고 생각하면 됩니다.
파이썬에서는 리스트(list), 튜플(tuple), 문자열(string), 딕셔너리(dictionary) 등이 대표적인 iterable 객체에 해당합니다.
이들은 모두 내부에 원소들을 가지고 있으며, 반복문을 통해 각 원소에 접근할 수 있습니다.
Iterable 객체는 `__iter__` 메서드를 가지고 있다는 특징이 있습니다.
이 메서드는 해당 객체에 대한 iterator를 반환합니다.
Iterator는 어떻게 동작할까요?
Iterator는 iterable 객체의 원소들을 순차적으로 접근할 수 있도록 해주는 객체입니다.
시리얼 상자에서 시리얼을 하나씩 꺼내 먹는 손과 같은 역할을 한다고 볼 수 있습니다.
Iterator는 `__next__` 메서드를 가지고 있으며, 이 메서드를 호출할 때마다 다음 원소를 반환합니다.
만약 더 이상 반환할 원소가 없다면, `StopIteration` 예외를 발생시켜 순회를 종료합니다.
`iter()` 함수를 사용하면 iterable 객체로부터 iterator를 생성할 수 있습니다.
Iterator는 메모리 효율성이 뛰어나다는 장점이 있습니다.
모든 원소를 한 번에 메모리에 올리는 것이 아니라, 필요할 때마다 하나씩 꺼내서 사용하기 때문입니다.
Generator: Iterator를 만드는 마법사
Generator는 iterator를 쉽게 만들 수 있도록 해주는 특별한 함수입니다.
함수 내부에 `yield` 키워드를 사용하면 해당 함수는 generator가 됩니다.
Generator 함수가 호출되면 iterator 객체가 반환되는데, 실제 함수 코드는 실행되지 않습니다.
`__next__` 메서드가 호출될 때마다 함수 코드가 실행되며, `yield` 문을 만나면 해당 값을 반환하고 함수는 일시 중단됩니다.
다음에 `__next__` 메서드가 호출되면 중단되었던 지점부터 다시 실행됩니다.
Generator는 특히 대용량 데이터를 처리할 때 유용합니다.
모든 데이터를 메모리에 저장하지 않고 필요할 때마다 생성해서 사용하기 때문에 메모리 사용량을 크게 줄일 수 있습니다.
Iterable과 Iterator, 직접 만들어보기
Iterable 객체와 iterator 객체를 직접 만들어서 동작 방식을 이해해 봅시다.
Iterable 객체는 `__iter__` 메서드를 구현하여 iterator를 반환하도록 만들 수 있습니다.
Iterator 객체는 `__next__` 메서드를 구현하여 다음 원소를 반환하고, 더 이상 반환할 원소가 없으면 `StopIteration` 예외를 발생시키도록 만들 수 있습니다.
최근에는 파이썬 버전이 업데이트되면서 더욱 간결하고 효율적인 방식으로 구현이 가능해졌습니다.
이터레이터와 iterable은 파이썬 프로그래밍의 핵심 개념 중 하나입니다.
이들을 이해하고 활용하면 코드를 더욱 효율적이고 가독성 좋게 만들 수 있습니다.
Iterable 객체는 반복 가능한 객체를 의미하며, Iterator는 Iterable 객체의 원소들을 순차적으로 접근할 수 있도록 해주는 객체입니다.
Generator는 iterator를 쉽게 만들 수 있도록 해주는 함수입니다.
이 세 가지 개념을 잘 이해하고 활용하여 더욱 멋진 파이썬 코드를 작성해 보세요.
프로그래밍 실력 향상에 큰 도움이 될 것입니다.
'개발' 카테고리의 다른 글
| map, filter, reduce 제대로 쓰는 법 (0) | 2026.01.31 |
|---|---|
| lambda 함수, 쓰지 말라는 사람도 많은 이유 (0) | 2026.01.31 |
| 리스트 vs 제너레이터, 메모리 차이 직접 확인 (0) | 2026.01.31 |
| 파이썬의 모든 것은 객체다, 진짜일까? (0) | 2026.01.31 |
| 파이썬 오버라이딩(Overriding)을 잘못 쓰면 생기는 문제 (0) | 2026.01.31 |