본문 바로가기
프로그래밍/함수형 프로그래밍

스칼라(Scala) 핵심 고차 함수 - map, flatten, flatmap

by bantomak 2024. 7. 24.
반응형

map 메서드

map 함수는 객체 컬렉션과 해당 객체에 정의된 함수 f를 사용하고, 컬렉션의 n번째 객체가 f에 의해 변환된 객체인 새로운 컬렉션을 반환한다. 

def square(n: Int): Int = n * n
List(1, 2, 3, 4, 5).map(square)

 

그러면 컬렉션이 반환된다.

List(1, 4, 9, 16, 25)

 

다음은 숫자 리스트를 가져와 각각의 제곱한 다음 제곱한 수를 모두 더하는 함수다. 표현식이 얼마나 간결한지 확인해 보자.

def squreAndSum(lst: List[Int]): Int = list.map(square).sum

 

간단한 타입이 아닌 리스트가 있다면 어떻게 해야 할까? 예를 들어 Option을 확인하면 다음과 같다.

def getUser(userName: String): Option[User] = ???
val names: List[String] = List("username1", "username2", "username3")
names.map(getUser)

 

다음과 같은 결과가 나올 것이다.

List(None, Some(user1), Some(user2))

 

flatten 메서드

스칼라에는 flatten이라는 메서드가 있는데 유용하게 사용된다.

names.map(getUser).flatten

 

이는 다음과 같이 처리된다.

List(user1, user2)

 

이 방법의 장점은 Some 인스턴스를 병합하고, None을 버린다는 점이다.

 

  • Some(user1) -> user1
  • None -> 버림

 

flatMap 메서드

컬렉션을 매핑한 다음 평면화를 하려면 flatMap이라는 또 다른 메서드를 사용한다.

 

flatten의 예를 다시 살펴보고 flatMap이 처리하는 방식을 살펴보자.

names.map(getUser).flatten // List(user1, user2)로 처리된다.
names.flatMap(getUser)     // 마찬가지로 List(user1, user2)로 처리된다.

 

flatMap은 map과 flatten을 동시에 처리하는 메서드라고 생각하면 이해가 쉽다.

댓글