저번 게시글에서는 백준 1000번의 정답과 문제를 분석했습니다.
하지만 map함수를 좀 더 확실하게 알아야 앞으로의 코딩문제를 접하고 이해하는데 있어서 더욱 더 깊어질 수 있다고 생각하여 블로깅하게 되었습니다.
map 함수를 사용할 때 list()를 호출하지 않는 경우, 반환되는 값은 map 객체, 즉 이터레이터입니다. 이 이터레이터는 계산된 값을 메모리에 저장하지 않고, 요청 시(예를 들어, 반복하거나 다른 함수에서 사용할 때) 실시간으로 해당 값을 계산하여 반환합니다.
map 객체 이해하기
map 객체는 단순히 요소들에 대한 연산을 정의하고 있지만, 이 연산들을 실제로 실행하지는 않습니다. 이는 "지연 계산" (lazy evaluation) 또는 "지연 로딩" (lazy loading)이라고 하며, 데이터가 실제로 필요할 때까지 계산을 미루는 기법입니다. 이는 메모리 사용을 효율적으로 관리하고, 필요할 때만 계산을 수행하도록 합니다.
map 객체 사용 예시
numbers = map(int, ['1', '2', '3'])
# map 객체 출력
print(numbers) # <map object at 메모리_주소>
# map 객체를 리스트로 변환하여 실제 값 확인
print(list(numbers)) # [1, 2, 3]
map 직관적인 예시
map 객체의 특징
- 지연 계산: 요소들에 대한 연산이 실제로 필요할 때만 실행됩니다.
- 한 번만 사용 가능: map 객체는 한 번만 반복할 수 있습니다. 모든 요소를 한 번 순회한 후에는, 다시 요소를 얻기 위해서는 map 함수를 다시 호출해야 합니다.
list를 붙이지 않는 경우의 처리
map 객체를 직접 반복하거나 다른 함수에 전달할 수 있습니다. 예를 들어, sum 함수에 직접 전달할 수 있습니다:
numbers = map(int, ['1', '2', '3'])
total = sum(numbers) # map 객체를 sum 함수에 직접 사용
print(total) # 6
이 예시에서 map 객체는 sum 함수에 의해 내부적으로 순회되며, 모든 요소에 대한 연산이 실행되고 그 결과가 합산됩니다. 하지만 이후 numbers 객체를 다시 사용하려고 하면, 이미 모든 요소가 소모된 상태이기 때문에 더 이상의 요소를 얻을 수 없습니다.
요약하자면, map 함수를 사용할 때 list()를 호출하지 않으면, 계산 결과를 즉시 얻지 못하고 이터레이터 형태로 결과를 처리하게 됩니다. 이는 때때로 메모리 사용 최적화에 도움이 되지만, 결과를 다시 사용하려면 주의해야 합니다.