코딩테스트를 준비하다가 역순을 사용하는 부분에서 객체의 메모리 주소를 보여주는 부분을 목격했다.
이 메모리 주소는 이터레이터의 객체 주소를 보여주는데, 이터레이터와 리스트의 차이가 무엇인지 찾아보다가 기록을 해둔다.
두 개념은 비슷해 보이지만, 데이터를 처리하는 방식과 사용 방법에서 큰 차이가 있다.
이터레이터는 마치 과자 자판기와 같다.
- 자판기에서는 버튼을 한 번 누를 때마다 과자가 하나씩 나온다.
- 하지만 모든 과자를 다 꺼내고 나면 더 이상 과자를 받을 수 없다.
이처럼 이터레이터의 특징을 볼 수 있는데, 이터레이터는 한번만 사용할 수 있고, 메모리에 모든 데이터를 저장하지 않고 필요할때만 생성한다는 점, 그리고 다시 사용하려면 새로 생성해야한다는 점이다.
l = [1, 2, 3, 4, 5]
iter_obj = iter(l)
print(next(iter_obj)) # 1
print(next(iter_obj)) # 2
print(next(iter_obj)) # 3
for value in iter_obj:
print(value) # 출력: 4, 5
# 더 이상 꺼낼 수 없음
for value in iter_obj:
print(value) # 출력 없음
이 코드에서 next(iter_obj)를 호출할 때마다 자판기에서 과자 하나를 꺼내는 것처럼 값이 하나씩 반환된다.
하지만 모든 값을 다 꺼낸 후에는 이터레이터가 비워져 아무것도 출력되지 않는다.
리스트는 과자 바구니다
- 바구니에는 모든 과자가 한 번에 담겨 있다.
- 원하는 만큼 여러 번 꺼낼 수 있고 순서를 바꿔서 꺼낼 수도 있고 마음대로 꺼낼 수 있다.
리스트의 특징은 여러 번 반복이 가능하고, 메모리에 모든 데이터를 저장한다. 또한 데이터를 인덱스로 직접 접근을 할 수도 있다는 점이다.
l = [1, 2, 3, 4, 5]
for value in l:
print(value) # 출력: 1, 2, 3, 4, 5
for value in l:
print(value) # 출력: 1, 2, 3, 4, 5
리스트는 몇 번이든 순회할 수 있고, 언제든지 처음부터 다시 사용할 수 있다.
이 점에서 이터레이터와 큰 차이가 있다.
리스트 | 이터레이터 |
모든 데이터를 메모리에 저장 | 필요할 때마다 데이터를 생성 |
데이터를 여러 번 순회할 수 있음 | 데이터를 한 번만 순회할 수 있음 |
데이터 크기가 작을 때 적합 | 데이터 크기가 클 때 적합 |
인덱스로 직접 접근 가능 | 순차적으로만 접근 가능 |
만약 이터레이터를 여러 번 사용해야 한다면, 리스트로 변환해서 사용할 수 있다.
iter_obj = iter([1, 2, 3, 4, 5])
l = list(iter_obj) # 이터레이터를 리스트로 변환
for value in l:
print(value) # 출력: 1, 2, 3, 4, 5
for value in l:
print(value) # 출력: 1, 2, 3, 4, 5
반응형