본문으로 건너뛰기

가독성 높은 조건문을 위해 include? 대신 Active Support의 in? 사용하기

Prefer in? Over include? for Readable Conditions

작성자
발행일
2026년 02월 02일

핵심 요약

  • 1 Rails의 in? 메서드는 주어와 목적어의 위치를 바꾸어 영어 문장 구조와 유사한 자연스러운 가독성을 제공한다.
  • 2 in?은 내부적으로 include?를 호출하므로 성능 차이가 없으며 배열, 범위, 세트, 문자열 등 다양한 객체에서 동작한다.
  • 3 nil 값에 대해 예외를 발생시키지 않고 false를 반환하는 안정성을 갖추고 있으나 Rails 환경이 아닐 경우 의존성 고려가 필요하다.

도입

Ruby에서 특정 값이 컬렉션에 포함되어 있는지 확인하는 작업은 프로그래밍 과정에서 매우 빈번하게 발생합니다. 표준 라이브러리인 include? 메서드가 이 역할을 수행하지만, Rails의 Active Support 라이브러리는 이를 더욱 직관적으로 표현할 수 있는 in? 메서드를 제공합니다. 본 글에서는 코드의 가독성을 높이고 문맥을 명확하게 만드는 in? 메서드의 장점과 구체적인 사용 사례, 그리고 사용 시 주의해야 할 환경적 제약 사항에 대해 심도 있게 살펴봅니다.

1. 가독성 측면에서의 문법적 차이

Ruby 프로그래밍에서 조건문은 코드의 의도를 가장 명확하게 드러내야 하는 부분입니다. 표준 Ruby의 include? 메서드는 객체 지향적인 관점에서 컬렉션이 특정 요소를 가지고 있는지를 묻는 방식입니다. 예를 들어 ["Justin", "JC"].include?(member)와 같은 코드는 “이 배열이 이 멤버를 포함하는가?”라는 논리를 따릅니다. 하지만 인간의 사고 방식, 특히 영어 문장 구조에서는 “이 멤버가 이 그룹에 속해 있는가?”라고 묻는 것이 훨씬 자연스럽습니다. Rails의 Active Support가 제공하는 in? 메서드는 바로 이 지점을 파고듭니다. member.in?(["Justin", "JC"])라고 작성하면 “멤버가 이 배열 안에 있는가?”라고 읽히며, 코드를 읽는 개발자의 인지 부하를 줄여줍니다. 특히 복잡한 조건문 내에서 주어(Subject)가 무엇인지 명확히 해야 할 때 in?은 빛을 발합니다.

2. 기술적 유연성과 호환성

in? 메서드는 단순히 배열에서만 작동하는 것이 아닙니다. Rails의 구현 방식을 살펴보면, 이 메서드는 인자로 전달된 객체가 include? 메서드에 응답하기만 하면 어떤 타입이든 수용합니다.

  • 문자열(Strings): "JC".in?("JC Chasez")와 같이 부분 문자열 포함 여부를 확인할 때 유용합니다.
  • 범위(Ranges): 5.in?(1..10)과 같이 특정 숫자가 범위 내에 있는지 확인할 때 수학적인 기호보다 훨씬 서술적인 코드를 작성할 수 있습니다.
  • 세트(Sets): 중복을 허용하지 않는 데이터 집합인 Set 객체와도 완벽하게 호환됩니다.

이러한 범용성은 개발자가 데이터 구조를 변경하더라도 조건문 로직을 수정할 필요 없이 일관된 인터페이스를 유지할 수 있게 해줍니다.

3. 안정적인 예외 처리: Nil Handling

프로그래밍 실수의 많은 부분은 nil 객체에 대한 메서드 호출에서 발생합니다. include? 메서드를 사용할 때 컬렉션 변수가 예상치 못하게 nil인 경우 NoMethodError가 발생하여 애플리케이션이 중단될 수 있습니다. 하지만 in? 메서드는 이를 우아하게 처리합니다. "Justin".in?(nil)을 호출하면 에러를 던지는 대신 false를 반환합니다. 이는 별도의 nil 체크 로직(if list && list.include?(item))을 줄여주어 코드를 더 간결하고 안전하게 만듭니다.

4. 성능과 의존성 고려사항

성능 면에서 in?include? 사이에는 유의미한 차이가 없습니다. in? 메서드의 내부 구현은 단순히 인자로 받은 컬렉션에 대해 include?를 다시 호출하는 래퍼(Wrapper) 메서드에 불과하기 때문입니다. 따라서 성능 최적화를 위해 in?을 기피할 이유는 전혀 없습니다. 그러나 의존성 측면에서는 신중해야 합니다. in?은 Ruby 표준 라이브러리가 아닌 Rails의 Active Support 구성 요소입니다. Rails 프레임워크를 사용하지 않는 경량 Ruby 스크립트나 다른 프레임워크 기반 프로젝트에서 이 메서드 하나를 쓰기 위해 거대한 activesupport 젬을 추가하는 것은 배보다 배꼽이 더 큰 상황이 될 수 있습니다. 또한, Rails의 컨벤션에 익숙하지 않은 개발자들에게는 in?이 낯설게 느껴질 수 있다는 점도 협업 시 고려해야 할 요소입니다.

5. 실무적인 권장 사용 패턴

결론적으로, 다음과 같은 상황에서 in? 사용을 적극 권장합니다. 인라인 컬렉션 사용 시 if status.in?([:pending, :active, :archived])와 같이 리터럴 배열을 직접 사용할 때 가독성이 극대화됩니다. 또한 비즈니스 로직상 컬렉션 자체보다 검사 대상이 되는 객체의 상태가 더 중요할 때 in?을 사용하면 문맥 파악이 쉬워집니다. 반면, 이미 의미가 명확한 변수명을 가진 컬렉션(admin_ids.include?(user.id))의 경우 기존 방식을 유지해도 무방합니다. 중요한 것은 팀 내에서 일관된 스타일을 유지하여 코드의 가독성을 높이는 것입니다.

결론

in? 메서드는 단순한 문법적 설탕(Syntactic Sugar) 이상의 가치를 제공하며, 특히 인라인 컬렉션을 다룰 때 코드의 의도를 명확히 전달하는 강력한 도구입니다. Rails 프로젝트에서는 가독성과 코드의 안전성을 위해 in? 사용이 적극 권장되지만, 순수 Ruby 환경이거나 팀 내에서 표준 라이브러리 지향성이 강한 경우에는 include?를 유지하는 것이 합리적인 선택입니다. 결국 프로젝트의 성격과 팀의 컨벤션에 맞춰 가장 가독성이 좋은 방식을 선택하는 것이 중요합니다.

댓글0

댓글 작성

댓글 삭제 시 비밀번호가 필요합니다.

이미 계정이 있으신가요? 로그인 후 댓글을 작성하세요.

0/1000
정중하고 건설적인 댓글을 작성해 주세요.