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

Ruby 람다(Lambda) 완벽 가이드: 기본 개념부터 고급 활용법까지

블록(Block)은 Ruby 언어의 핵심 요소로, 블록 없는 Ruby를 상상하기 어려울 정도입니다. 하지만 람다(Lambda)는 어떨까요? 람다를 적극적으로 활용하는 개발자는 많지 않습니다. 몇 년 동안 한 번도 사용하지 않고 지낼 수도 있고, 마치 옛날 유물처럼 느껴지기도 합니다.

하지만 실제로는 그렇지 않습니다. 람다는 조금만 파고들면 흥미로운 기능들을 숨기고 있습니다.

이 글에서는 람다 사용의 기본부터 시작해 더 흥미로운 고급 활용법까지 차근차근 살펴보겠습니다. 이미 매일 람다를 사용하며 모든 것을 알고 계신 분이라면 바로 아래쪽으로 스크롤을 내리셔도 좋습니다.

람다에 대해 기억해야 할 가장 중요한 점은 함수처럼 동작한다는 것입니다. 블록과 Proc도 각각 쓸모가 있지만, 둘 다 실제 함수처럼 100% 동작하지는 않습니다. 반면 람다는 그렇습니다. 하나씩 살펴보겠습니다.

람다는 인자 개수를 엄격하게 검사합니다

Ruby 람다(Lambda) 완벽 가이드: 기본 개념부터 고급 활용법까지 Proc와 달리 람다는 올바른 인자 개수를 강제합니다

람다는 기본 인자값을 지원합니다

아래 예제에서는 기본 인자값이 "hello world"인 람다 함수를 생성합니다.

Ruby 람다(Lambda) 완벽 가이드: 기본 개념부터 고급 활용법까지 람다는 기본 인자값을 지원합니다

return 키워드가 예상대로 정확히 동작합니다

사소한 특징처럼 들릴 수 있지만, Proc 안에서 return을 사용해 본 경험이 있다면 결코 작은 문제가 아니라는 것을 잘 알 것입니다.

아래 예제를 통해 설명해 드리겠습니다. something이라는 메서드를 정의하고 그 안에서 Proc를 호출했습니다. 이 Proc에는 return 문이 있는데, 이 return 문이 함정입니다. 단순히 proc에서만 반환하는 것이 아니라 something 메서드 전체에서 반환해 버립니다.

하지만 람다로 비슷한 작업을 수행하면 return 문은 람다 자체에서만 반환됩니다. 일반적인 함수와 똑같이 동작하는 것이죠.

Ruby 람다(Lambda) 완벽 가이드: 기본 개념부터 고급 활용법까지 람다 내부에서 return 키워드를 사용하면 람다에서만 반환됩니다

람다는 클로저(Closure)입니다

훌륭한 Stack Overflow 게시글에서 발췌한 내용입니다:

클로저를 가장 단순하게 이해하는 방법은 변수에 저장할 수 있는 함수(일급 함수, first-class function), 즉 자신이 생성된 스코프의 지역 변수에 접근할 수 있는 특별한 능력을 지닌 함수로 생각하는 것입니다.

람다가 생성된 스코프의 지역 변수에 접근할 수 있다는 것은 어떤 의미일까요? 아래 예제를 살펴보겠습니다. marco라는 지역 변수를 만들었고, 람다 내부에서 이 변수를 사용할 수 있습니다. 그리고 변수 값을 변경하면 람다는 새로운 값을 인식합니다.

Ruby 람다(Lambda) 완벽 가이드: 기본 개념부터 고급 활용법까지 Ruby 람다는 클로저입니다

람다는 카멜레온입니다

람다의 진정으로 독특한 점 중 하나는 호출할 수 있는 방식이 다양하다는 것입니다. 아래 샘플은 람다를 호출하는 세 가지 방법을 보여주며, 세 방법 모두 동일하게 동작합니다.

Ruby 람다(Lambda) 완벽 가이드: 기본 개념부터 고급 활용법까지 Ruby에서 람다를 호출하는 방법은 최소 세 가지입니다

다소 이상하게 느껴질 수 있습니다. 저도 처음에는 그랬습니다. 솔직히 l.(arg) 문법은 여전히 저를 혼란스럽게 합니다. 하지만 l[arg] 문법은 꽤 흥미롭습니다. 이는 특정 범위 내에서 람다를 배열이나 해시를 사용하는 곳에 활용할 수 있다는 의미입니다.

계산된 해시와 배열처럼 람다 활용하기

테스트 스위트가 있고, 초기화 과정의 일부로 가짜 Person 레코드를 생성해야 한다고 상상해 보세요. 간단합니다. 새로운 FakePerson 레코드를 만들고 이름(first name)과 성(last name)을 전달하면 됩니다.

하지만 테스트를 실행할 때마다 서로 다른 이름과 성을 사용해 시스템을 "퍼즈 테스트(fuzz test)"하고 싶다면 어떻게 해야 할까요?

한 가지 방법은 해시 대신 람다 함수를 전달하는 것입니다. 이 예제에서는 훌륭한 Faker 젬(gem)을 활용해 람다 함수로 가짜 이름을 생성합니다.

Ruby 람다(Lambda) 완벽 가이드: 기본 개념부터 고급 활용법까지 여기서 람다는 해시인 척합니다

람다는 커링(Currying)을 기본 지원합니다

커링은 함수형 프로그래밍에서 널리 사용되는 강력한 기법입니다. 기존 함수로부터 새로운 함수를 만들어내는 방식이며, 실제 코드를 보면 이해하기 쉽습니다.

아래 코드에는 두 숫자를 더하는 add라는 람다 함수가 있습니다. 그런 다음 커링을 사용해 increment라는 더 특화된 함수를 만듭니다. 이 함수는 주어진 숫자에 1을 더하는 역할만 담당합니다.

Ruby 람다(Lambda) 완벽 가이드: 기본 개념부터 고급 활용법까지 Ruby에서는 모든 Proc를 커링할 수 있습니다

람다는 특수한 종류의 Proc입니다

코드 샘플에서 람다 함수를 정의할 때마다 그 결과로 Proc가 반환되는 것을 눈치채셨을 수도 있습니다. Ruby가 람다를 일종의 Proc로 구현하기 때문입니다. 따라서 이 글에서 소개한 많은 기능들은 람다뿐 아니라 Proc로도 구현할 수 있습니다.

스태비 람다(Stabby Lambda)

이 글에서는 명확성을 위해 lambda 키워드를 사용했습니다. 하지만 Ruby 1.9에서 도입된 "스태비 람다(stabby lambda)"라고 불리는 더 간결한 문법도 있습니다. 사용 방법은 다음과 같습니다:

Ruby 람다(Lambda) 완벽 가이드: 기본 개념부터 고급 활용법까지 Ruby의 스태비 람다 문법은 버전 1.9에서 도입되었습니다