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

스칼라(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을 동시에 처리하는 메서드라고 생각하면 이해가 쉽다.

댓글