1. 람다 소개
- 함수형 프로그래밍에서는 함수를 값처럼 다루는 방식을 통해 코드를 함수에 넘기거나 변수에 저장할 수 있게 한다. 클래스를 선언하고 그 클래스의 인스턴스에 함수를 넘기는 대신, 함수형 언어에서는 함수를 직접 다른 함수에 전달할 수 있다. 람다 식을 이용하면 함수를 선언할 필요가 없고 코드 블록을 직접 함수의 인자로 전달할 수 있다.
2. 람다와 컬렉션
- 람다를 사용해 컬렉션 검색하기
>>> val people = listOf(Person("Alice", 29), Person("Bob", 31))
>>> println(people.maxBy{ it.age })
Person(name=Bob, age=31)
maxBy는 가장 큰 원소를 찾기 위해 비교에 사용할 값을 돌려주는 함수를 인자로 받는다. 중괄호로 둘러싸인 코드 { it.age }는 비교에 사용할 값을 돌려주는 함수이다. 이 코드는 컬렉션의 원소를 인자로 받아서 비교에 사용할 값을 반환한다. 이런 식으로 단지 함수나 프로퍼티를반환하는 역할을 수행하는 람다는 멤버 참조로 대치할 수 있다.
- 멤버 참조를 사용해 컬렉션 검색하기
people.maxBy(Person::age)
위의 컬렉션 검색 코드와 동일한 역할을 수행한다.
3. 람다 식의 문법
{ x: Int, y: Int -> x + y }
- 람다는 값처럼 여기저기 전달할 수 있는 동작의 모음이다. 함수에 인자로 넘기면서 람다를 바로 정의하는 방식이 일반적이다. 코틀린 람다 식은 항상 중괄호로 둘러싸여 있으며 화살표가 인자 목록과 람다 본문을 구분해준다.
>>> val sum = { x:Int, y:Int -> x+y }
>>> println(sum(1,2))
3
- 람다 식을 변수에 저장할 수 있다. 람다가 저장된 변수를 다른 일반 함수와 마찬가지로 다룰 수 있다.
>>> run{ println(42) }
42
- run은 인자로 받은 람다를 실행해주는 라이브러리 함수이다.
people.maxBy( { p:Person -> p.age } )
- 람다 식을 maxBy 함수에 넘기고 있다. 람다 식은 Person 타입의 값을 인자로 받아서 인자의 age를 반환한다.
- 이 코드는 구분자가 너무 많이 쓰여서 가독성이 떨어진다. 또한 컴파일러가 유추할 수 있는 인자 타입을 굳이 적지 않아도 되며, 인자가 하나뿐인 경우 인자에 이름을 붙이지 않아도 된다는 점을 이용해 코드를 개선할 수 있다.
1) 코틀린에서는 함수 호출 시 맨 뒤에 있는 인자가 람다 식이라면 그 람다를 괄호 밖으로 빼낼 수 있다.
people.maxBy() { p:Person -> p.age }
2) 람다가 어떤 함수의 유일한 인자이고 괄호 뒤에 람다를 썼다면 호출 시 빈 괄호를 없애도 된다.
people.maxBy { p:Person -> p.age }
3) 컴파일러는 람다 파라미터의 타입을 추론할 수 있다. 따라서 파라미터 타입을 명시할 필요가없다. maxBy 함수의 경우 파라미터 타입은 항상 컬렉션 원소 타입과 같으므로 추론 가능하다.
people.maxBy { p -> p.age }
4) 람다의 파라미터 이름을 디폴트 이름인 it을 바꿀 수 있다. 람다의 파라미터가 하나뿐이고 그 타입을 컴파일러가 추론할 수 있는 경우 it을 바로 쓸 수 있다.
people.maxBy { it.age }
'Dev Book > Kotlin IN ACTION' 카테고리의 다른 글
CH5(5.3). 지연 계산 컬렉션 연산 (0) | 2022.01.02 |
---|---|
CH5(5.2). 컬렉션 함수형 API (0) | 2021.12.24 |
CH4(4.2). 뻔하지 않은 생성자와 프로퍼티를 갖는 클래스 (0) | 2021.11.27 |
CH4(4.3~4.4). 데이터 클래스와 클래스 위임, object 키워드 (0) | 2021.11.27 |
CH4(4.1). 클래스 계층 정의 (0) | 2021.11.21 |