컬렉션에 대한 함수형 연산
데이터 변환을 위해 map, filter, fold, reduce 같은 일반적인 함수형 연산을 능숙하게 사용합니다.
컬렉션에 대한 함수형 연산은(는) 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 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- 불변 컬렉션 심층 학습
- 컬렉션에 대한 함수형 연산
- 오류 처리를 위한 Option, Try, Either