Computer >> 컴퓨터 >  >> 프로그래밍 >> Ruby

Ruby uniq 메서드 완벽 가이드: 배열에서 중복 요소 제거하는 방법

Ruby의 uniq 메서드를 사용하면 배열에서 모든 중복 요소를 손쉽게 제거할 수 있습니다.

지금부터 실제 동작 방식을 하나씩 살펴보겠습니다!

다음과 같은 배열이 있다고 가정해 보겠습니다:

n = [1,1,1,2,3,4,5]

여기서 숫자 1이 세 번 반복되어 있습니다.

이 배열에 uniq를 호출하면 중복된 값들이 제거되고, 고유한 숫자만 담긴 새로운 배열이 반환됩니다.

예시:

n.uniq

# [1,2,3,4,5]

주의할 점은 uniq는 원본 배열 n을 변경하지 않는다는 것입니다. 따라서 원본을 수정하려면 uniq!를 호출하거나, 새로 반환된 배열을 변수에 저장해야 합니다.

예시:

unique_numbers = n.uniq

아주 간단하죠?

그런데 많은 개발자가 모르는 사실이 있습니다. 바로 uniq블록(block)을 전달할 수 있다는 점입니다.

블록을 활용하면 훨씬 더 고급스러운 작업이 가능합니다.

자세히 설명해 드리겠습니다.

블록과 함께 uniq 메서드 사용하기

uniq가 호출되면 내부적으로 배열 요소들을 해시(hash)로 만드는 방식으로 동작합니다.

배열의 각 요소가 해시의 키(key)가 됩니다.

해시 키는 항상 고유하기 때문에, 해시의 모든 키 목록을 가져오면 그것이 곧 중복이 제거된 새로운 배열이 되는 것입니다.

그런데 여기서 중요한 점:

무엇을 기준으로 '고유함'을 판단할지 직접 정하고 싶다면 블록을 전달하면 됩니다.

예를 들어 보겠습니다:

fruits = %w(orange apple banana)

"orange"와 "banana"는 길이가 6자로 같습니다.

이렇게 uniq를 사용하면:

fruits.uniq(&:size)

# ["orange", "apple"]

문자열 길이를 기준으로 비교했을 때 "banana"는 중복이 되므로 제거됩니다.

또 다른 예시:

objects = [1, 2, "a", "b", :c, :d]

objects.uniq(&:class)

클래스를 기준으로 고유한 객체만 남긴 결과입니다:

[1, "a", :c]

이 기능의 강력함이 느껴지시나요?

uniq에 블록을 전달하면 어떤 규칙으로 고유성을 판단할지 정확하게 정의할 수 있습니다.

여러 조건으로 uniq 사용하기

조건을 여러 개 조합해서 사용할 수도 있습니다!

방법은 다음과 같습니다:

예를 들어 다음 속성을 가진 User 클래스가 있다고 해보겠습니다:

  • age (나이)
  • name (이름)
  • country (국가)

같은 나이를 가진 사람들 중에서 국가별로 한 명씩만 남기고 싶다고 가정해 봅시다.

블록을 사용하면 아주 쉽게 처리할 수 있습니다:

[david, petter, raphael].uniq { |person| [person.age, person.country] }

이 코드에서는 나이와 국가 두 조건이 모두 일치해야만 중복으로 판단됩니다. 즉, 두 조건이 모두 같은 경우에만 하나의 요소만 남게 됩니다.

내부 동작 원리

블록 없이 호출하면 객체 자체가 해시 키가 됩니다.

반면 블록을 전달하면 블록에서 반환된 값이 해시 키가 되고, 원래 객체는 해시의 값(value)이 됩니다.

그런 다음...

Ruby는 해시의 값들을 꺼내어 새로운 배열로 반환합니다.

물론 이것은 구현 세부사항에 불과하지만, 동작 원리를 이해하고 있으면 코드를 더 깊이 있게 활용할 수 있어서 공유해 봅니다.

마무리 정리

지금까지 Ruby의 uniq 메서드에 대해 배웠습니다! 기본적인 사용법부터 블록을 활용한 고급 기법, 그리고 내부 동작 원리까지 살펴보았습니다.

이제 직접 실습하면서 이 메서드를 확실히 익혀보세요.

읽어주셔서 감사합니다!