Ruby map 메서드란?
map은 배열(Array), 해시(Hash), 범위(Range) 등에서 사용할 수 있는 Ruby 메서드입니다.
map의 핵심 용도는 데이터를 변환(transform)하는 것입니다.
예를 들어, 문자열 배열이 주어졌다면 각 문자열을 순회하면서 모든 문자를 대문자로 바꿀 수 있습니다.
또는 User 객체 목록이 있을 때, 이를 해당 사용자들의 이메일 주소, 전화번호 또는 User 클래스에 정의된 그 밖의 모든 속성 목록으로 변환할 수도 있습니다.
지금부터 구체적인 사용 방법을 하나씩 알아보겠습니다!
Ruby map 기본 문법
map의 기본 문법은 다음과 같습니다:
array = ["a", "b", "c"]
array.map { |string| string.upcase }
# ["A", "B", "C"]
먼저 배열이 필요하지만, 해시나 범위(Range)도 동일하게 사용할 수 있습니다.
그다음 블록(block)과 함께 map을 호출합니다.
블록이란 중괄호 { ... } 사이에 위치한 코드를 말합니다. 블록 안에는 배열의 각 요소를 어떻게 변환할지 정의하며, 쉽게 말해 하나의 함수라고 생각하면 됩니다.
그렇다면 map을 호출하면 어떤 일이 일어날까요?
map은 변환 결과를 담은 새로운 배열을 반환하며, 원본 배열은 절대 변경하지 않습니다.
만약 원본 배열 자체를 수정하고 싶다면 map!을 사용하면 됩니다.
Ruby map 실전 예제
실무에서 유용하게 활용할 수 있는 대표적인 예제들을 소개합니다.
숫자 두 배로 만들기
array = [1,2,3]
array.map { |n| n * 2 }
# [2, 4, 6]
문자열을 정수로 변환하기
array = ["11", "21", "5"]
array.map { |str| str.to_i }
# [11, 21, 5]
해시 값을 심볼(Symbol)로 변환하기
hash = { bacon: "protein", apple: "fruit" }
hash.map { |k,v| [k, v.to_sym] }.to_h
# {:bacon=>:protein, :apple=>:fruit}
이 해시 예제를 자세히 살펴보겠습니다.
블록 변수가 하나가 아니라 두 개인 것을 확인할 수 있는데, 이는 해시의 각 요소가 키(key)와 값(value)의 쌍으로 구성되어 있기 때문입니다.
블록은 변환된 키와 값으로 이루어진 새로운 배열을 반환하며, 마지막 단계에서 to_h를 사용해 이를 다시 해시 형태로 되돌립니다.
Ruby map vs each 차이점
map과 each는 무엇이 다를까요?
each는 map의 더 원초적인 버전이라고 볼 수 있습니다.
each는 각 요소를 하나씩 넘겨주어 작업을 수행할 수 있게 해주지만, 처리 결과를 수집하지는 않습니다.
즉, each는 항상 변경되지 않은 원본 객체를 그대로 반환합니다.
반면 map은 each와 동일하게 각 요소에 접근하지만, 변환된 요소들로 이루어진 새로운 배열을 반환한다는 결정적인 차이가 있습니다.
예제:
array.each { |n| n * 2 }
# [1, 2, 3]
array.map { |n| n * 2 }
# [2, 4, 6]
Ruby map vs collect
map과 collect는 완전히 동일한 메서드입니다.
같은 기능에 붙여진 서로 다른 이름일 뿐입니다!
그렇다면 어느 것을 사용해야 할까요?
실제 오픈소스 프로젝트의 코드를 살펴보면 가장 널리 사용되는 형태는 map입니다.
따라서 특별한 이유가 없다면 map을 사용하는 것이 좋습니다.
map에서 인덱스 함께 사용하기 (with_index)
요소 값과 함께 인덱스가 필요하다면 with_index 메서드를 활용할 수 있습니다.
예제:
array = %w(a b c)
array.map.with_index { |ch, idx| [ch, idx] }
# [["a", 0], ["b", 1], ["c", 2]]
추가 팁: 인덱스를 0이 아닌 다른 숫자부터 시작하고 싶다면 with_index에 시작값을 매개변수로 전달하면 됩니다.
Ruby map 축약 문법 (& 기호 활용)
인수가 필요 없는 메서드를 호출할 때는 map의 축약형 문법을 사용해 코드를 더 간결하게 만들 수 있습니다.
예제:
["11", "21", "5"].map(&:to_i)
예제:
["orange", "apple", "banana"].map(&:class)
이 & 문법은 map에만 국한되지 않으며, 다른 Enumerable 메서드에서도 동일하게 활용할 수 있습니다.
map 메서드 마인드맵

마치며
이번 글에서는 Ruby map 메서드의 개념과 사용법, 그리고 each, map, collect의 차이점까지 살펴보았습니다.
이 글이 도움이 되었다면 Ruby를 공부하는 지인들에게 공유해 주세요 🙂 읽어주셔서 감사합니다!