[CS] Iterator / Generator
1. Iterator (반복자)
프로그래밍에서는 다양한 타입의 객체가 존재한다.
문자를 나타내는 char, 문자열을 나타내는 string와 정수를 나타내는 integer와 같은 타입과
Array나 List와 같은 다양한 형식을 객체는 가질 수 있는데,
그중에서 Array와 List 같이 각각의 원소를 순회할 수 있는 객체를 Iterable 하다고 칭한다.
이러한 점에서 유추할 수 있는 것처럼 Iterator 또한 크게 다르지 않다.
다음은 Python에서 반복자의 예시이다.
Example :
# 예제 리스트
a = [1,2,3,4,5]
# 예제 리스트의 Iterator 객체
iter_a = iter(a)
# 첫 번째 원소
print(next(iter_a))
# 두 번째 원소
print(next(iter_a))
# 세 번째 원소
print(next(iter_a))
# 네 번째 원소
print(next(iter_a))
# 다섯 번째 원소
print(next(iter_a))
위와 같은 코드가 있을 때, 리스트를 Iterator 객체로 변환 시키면 원소를 순서대로 꺼낼 수
있다는 것을 볼 수 있을 것이다.
Result :
1
2
3
4
5
예시에서 보듯, Iterator는 객체의 원소를 순차적으로 꺼내서 사용할 수 있는 객체인 것이다.
(프로그래밍 언어에 따라 다음 순서로만 갈 수 있거나 앞 뒤의 지정된 순서로 이동하는 차이가 존재)
2. Generator (생성자)
생성자는 일반적으로 Coroutine을 지원하는 언어에서 사용되며, 반복자를 반환하는 함수이다.
생성자는 Lazy한 특성을 가지고 있기 때문에, 실제 값이 이용될 때 컴퓨터 자원을 사용하므로
효율적으로 컴퓨터 자원을 관리할 수 있다.
다음은 Python에서 생성자 예시이다.
Example :
# Generator 함수
def generator():
yield 1
yield 2
yield 3
yield 4
yield 5
# 생성자 객체
func_g = generator()
# 생성자 클래스 반환
print(func_g)
# Iterator 객체이기에 next 이용 가능
print(next(func_g)) # 1 반환
print(next(func_g)) # 2 반환
print("------------------")
# 순회가 가능
for g in func_g: # 나머지 원소들 반환 : 3, 4, 5
print(g)
결과는 다음과 같다.
Result :
<generator object generator at 0x00000267531D6500>
1
2
------------------
3
4
5
이러한 예시를 통해, 생성자와 반복자는 for문 또는 next 함수와 함께 사용되며,
필요한 부분만 꺼내서 사용할 수 있다는 것을 확인할 수 있다.
이를 잘 활용하면 컴퓨터 자원을 효율적으로 관리하며 코드 또한 더 간결하게 구현할 수 있을 것이다.