본문 바로가기
Computer-Sience/Etc

[CS] Iterator / Generator

by dev_ss 2023. 5. 4.

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 함수함께 사용되며,

필요한 부분만 꺼내서 사용할 수 있다는 것을 확인할 수 있다.

 

이를 잘 활용하면 컴퓨터 자원을 효율적으로 관리하며 코드 또한 더 간결하게 구현할 수 있을 것이다.

반응형