Scala for Backend Engineering & Functional Programming · 강의

컬렉션에 대한 함수형 연산

데이터 변환을 위해 map, filter, fold, reduce 같은 일반적인 함수형 연산을 능숙하게 사용합니다.

레슨 2/311개 단계

컬렉션에 대한 함수형 연산은(는) CoddyKit의 무료 Scala for Backend Engineering & Functional Programming 강의입니다. 이것은 3개 중 2번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Scala for Backend Engineering & Functional Programming 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Scala for Backend Engineering & Functional Programming 강의에는 총 3개의 강의가 포함되어 있습니다.

함수형 연산: 사용하는 이유

컬렉션에 대한 함수형 연산을 사용하면 원본 컬렉션을 변경하지 않고 데이터를 변환하고 결합할 수 있습니다. 이러한 방식은 불변성을 지향하며 코드를 더 쉽게 읽고 테스트할 수 있게 합니다.

map, filter, reduce, fold와 같은 주요 연산을 살펴보겠습니다.

`map`으로 변환하기

map 연산은 컬렉션의 각 요소에 함수를 적용하고, 변환된 결과로 이루어진 새 컬렉션을 반환합니다. 원본 컬렉션은 변경되지 않습니다.

다음 예제를 실행해 보세요.

object Main {
  def main(args: Array[String]): Unit = {
    val numbers = List(1, 2, 3, 4)
    val doubled = numbers.map(n => n * 2)
    println(s"Original: $numbers")
    println(s"Doubled: $doubled")
  }
}

서로 다른 타입에 사용하는 `map`

map은 매우 유연합니다! 요소를 완전히 다른 타입으로 변환할 수 있습니다. 여기서는 숫자를 문자열로 변환하거나 문자열의 길이를 가져옵니다.

입력은 List[String]이었지만 결과는 List[Int]라는 점에 주목하세요.

object Main {
  def main(args: Array[String]): Unit = {
    val names = List("Alice", "Bob", "Charlie")
    val lengths = names.map(name => name.length)
    println(s"Names: $names")
    println(s"Lengths: $lengths")
  }
}

`filter`로 선택하기

filter 연산은 주어진 조건(술어 함수)을 만족하는 요소만 포함하는 새 컬렉션을 만듭니다. 원하지 않는 요소를 "걸러냅니다".

짝수를 찾아보겠습니다.

object Main {
  def main(args: Array[String]): Unit = {
    val numbers = List(1, 2, 3, 4, 5, 6)
    val evens = numbers.filter(n => n % 2 == 0)
    println(s"Original: $numbers")
    println(s"Evens: $evens")
  }
}

`filter` 추가 예제

필터 조건으로 어떤 불리언 표현식이든 사용할 수 있습니다. 단어 목록에서 길이가 4자를 초과하는 단어만 남겨 보겠습니다.

object Main {
  def main(args: Array[String]): Unit = {
    val words = List("apple", "cat", "banana", "dog", "elephant")
    val longWords = words.filter(w => w.length > 4)
    println(s"Words: $words")
    println(s"Long words: $longWords")
  }
}

`reduce`로 결합하기

reduce 연산은 컬렉션의 모든 요소를 하나의 결과로 결합합니다. 이 연산은 이항 연산(두 인수를 받아 하나를 반환하는 함수)을 사용하고, 이를 누적해서 적용합니다.

여기서는 모든 요소를 더합니다.

object Main {
  def main(args: Array[String]): Unit = {
    val numbers = List(1, 2, 3, 4)
    val sum = numbers.reduce((a, b) => a + b)
    println(s"Numbers: $numbers")
    println(s"Sum: $sum")
  }
}

곱과 최댓값을 구하는 `reduce`

reduce는 다양한 집계 작업을 수행할 수 있습니다. 숫자의 곱을 계산하거나 최댓값을 찾을 수 있습니다.

참고: 빈 컬렉션에서 reduce를 사용하면 오류가 발생합니다.

object Main {
  def main(args: Array[String]): Unit = {
    val numbers = List(1, 5, 2, 8)
    val product = numbers.reduce((a, b) => a * b)
    val maxNum = numbers.reduce((a, b) => if (a > b) a else b)
    println(s"Numbers: $numbers")
    println(s"Product: $product")
    println(s"Max: $maxNum")
  }
}

`fold`: 초기값 활용하기

fold는 reduce와 비슷하지만 중요한 차이가 있습니다. 초기값(또는 "누산기"라고도 함)을 사용합니다. 따라서 빈 컬렉션에서도 안전하며 결과를 다른 타입으로 만들 수도 있습니다.

10부터 시작해 숫자를 더해 보겠습니다.

object Main {
  def main(args: Array[String]): Unit = {
    val numbers = List(1, 2, 3)
    // foldLeft(initialValue)(operation)
    val sumWithInitial = numbers.foldLeft(10)((acc, n) => acc + n)
    println(s"Numbers: $numbers")
    println(s"Sum (starting from 10): $sumWithInitial")
  }
}

방향: `foldLeft`와 `foldRight`

Scala는 foldLeft와 foldRight를 제공합니다. 두 연산은 요소를 처리하는 순서와 누산기를 전달하는 방식이 서로 다릅니다.

  • foldLeft(initial)(op): 왼쪽에서 오른쪽으로 처리합니다.
  • foldRight(initial)(op): 오른쪽에서 왼쪽으로 처리합니다.

문자열 연결과 같은 연산에서는 방향이 중요합니다!

object Main {
  def main(args: Array[String]): Unit = {
    val chars = List('a', 'b', 'c')
    val leftFold = chars.foldLeft("")((acc, c) => acc + c)
    val rightFold = chars.foldRight("")((c, acc) => acc + c)
    println(s"Chars: $chars")
    println(s"foldLeft: $leftFold") // Output: abc
    println(s"foldRight: $rightFold") // Output: abc (due to string append order)

    // Example where order matters: (acc, char) => char + acc
    val rightFoldReversed = chars.foldRight("")((c, acc) => c + acc)
    println(s"foldRight (char + acc): $rightFoldReversed") // Output: abc

    // A common example where order matters is for operations like subtraction or division, but string concatenation also shows it.
  }
}

함수형 연산 확인

다음 Scala 코드 조각을 살펴보세요.

val data = List(10, 20, 30, 40)
val result1 = data.map(x => x / 10)
val result2 = data.filter(x => x > 25)
val result3 = data.reduce((a, b) => a + b)

다음 중 결과에 대해 TRUE인 설명은 무엇인가요?

복습: 함수형 연산의 강력함

필수 함수형 연산을 익히셨습니다!

  • map은 각 요소를 변환합니다.
  • filter는 조건에 따라 요소를 선택합니다.
  • reduce는 요소를 하나의 결과로 결합합니다(비어 있지 않은 컬렉션이 필요함).
  • fold는 초기값과 함께 요소를 결합합니다(빈 컬렉션에서도 안전함).

이러한 연산은 간결하고 불변이며 강력한 Scala 코드를 작성하는 데 핵심입니다. 다음으로 Option, Try, Either를 사용한 견고한 오류 처리를 살펴보겠습니다.

무료로 시작

AI 튜터와 함께 Scala을(를) 배우세요 — 무료

브라우저에서 실제 코드를 작성하고 실행하며, 24/7 AI 튜터로부터 즉각적인 도움을 받고, 웹이나 앱에서 중단한 부분부터 계속 학습하세요.

코스
39
레슨
143

자주 묻는 질문

“컬렉션에 대한 함수형 연산” 강의는 무료인가요?

네 — “컬렉션에 대한 함수형 연산” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Scala for Backend Engineering & Functional Programming 강의 전체를 잠금 해제할 수 있습니다. Scala for Backend Engineering & Functional Programming 강의에는 총 3개의 강의가 포함되어 있습니다.

“컬렉션에 대한 함수형 연산”에서 뭘 배우나요?

데이터 변환을 위해 map, filter, fold, reduce 같은 일반적인 함수형 연산을 능숙하게 사용합니다. 브라우저에서 직접 실행하는 실습 코드로 Scala for Backend Engineering & Functional Programming을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

Scala for Backend Engineering & Functional Programming을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 Scala for Backend Engineering & Functional Programming은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 3개 중 2번째 강의입니다.

“컬렉션에 대한 함수형 연산” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 Scala for Backend Engineering & Functional Programming 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 Scala for Backend Engineering & Functional Programming 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. 불변 컬렉션 심층 학습
  2. 컬렉션에 대한 함수형 연산
  3. 오류 처리를 위한 Option, Try, Either
← Scala for Backend Engineering & Functional Programming(으)로 돌아가기