학습
Scala 고차 함수 (Higher-Order Functions) 심화
Scala 고차 함수 (Higher-Order Functions) 심화 — 중급
고차 함수 (Higher-Order Functions) 심화
1. 도입 (왜 배워야 하는가)
고차 함수는 다른 함수를 인자로 받거나, 함수를 결과로 반환하는 함수입니다. 이는 함수형 프로그래밍의 핵심 개념 중 하나로, 코드의 재사용성과 가독성을 높여줍니다. 실무에서는 데이터 처리, 비동기 프로그래밍, 그리고 이벤트 핸들링 등 다양한 상황에서 고차 함수를 사용하게 됩니다.
고차 함수를 이해하지 못하면, 복잡한 로직을 처리할 때 코드가 길어지고 비효율적이 될 수 있으며, 함수형 프로그래밍의 장점을 누리지 못하게 됩니다. 예를 들어, 리스트를 다룰 때 고차 함수를 사용하면 간단하게 데이터를 필터링하거나 변환할 수 있지만, 고차 함수를 모른다면 복잡한 반복문을 작성해야 할 것입니다.
2. 핵심 개념 설명
- 고차 함수 (Higher-Order Function): 함수를 인자로 받거나, 함수를 반환하는 함수입니다.
- 익명 함수 (Anonymous Function): 이름이 없는 함수를 의미하며, 주로 고차 함수의 인자로 사용됩니다.
- 순수 함수 (Pure Function): 같은 입력에 대해 항상 같은 출력을 반환하고, 외부 상태를 변경하지 않는 함수입니다.
관련 용어 정리
| 용어 | 설명 |
|---|---|
| 고차 함수 | 함수를 인자로 받거나 반환하는 함수 |
| 익명 함수 | 이름이 없는 함수 |
| 순수 함수 | 동일한 입력에 대해 항상 동일한 출력을 반환 |
3. 기본 코드 예제
가장 간단한 고차 함수의 예를 살펴보겠습니다. 아래 코드는 두 개의 숫자를 더하는 함수를 인자로 받아서 계산하는 고차 함수입니다.
// 두 숫자를 계산하는 고차 함수
def calculate(a: Int, b: Int, operation: (Int, Int) => Int): Int = {
operation(a, b)
}
// 덧셈 함수
val add: (Int, Int) => Int = (x, y) => x + y
// 고차 함수 호출
val result = calculate(5, 3, add)
// 결과 출력
println(result) // 8
실행 결과
8
코드 한 줄씩 동작 설명
calculate함수는 두 개의 정수와 함수를 인자로 받습니다.add는 두 정수를 더하는 익명 함수입니다.calculate함수가 호출되면서5와3그리고add함수를 넘깁니다.calculate내부에서operation이add로 호출되어5 + 3이 계산됩니다.- 최종적으로
8이 출력됩니다. - 올바른 코드: 인자의 타입이 맞는지 확인해야 합니다.
- 올바른 코드: 익명 함수가 참조하는 변수는 적절한 스코프 내에 있어야 합니다.
- 고차 함수는 함수형 프로그래밍에서 코드의 재사용성과 가독성을 높이는 중요한 개념입니다.
- 익명 함수와 순수 함수의 개념은 고차 함수와 함께 이해해야 합니다.
- 실무에서 리스트 필터링, 데이터 변환 같은 다양한 상황에서 활용할 수 있습니다.
4. 실전 활용 예제
예제 1: 리스트 필터링
쇼핑몰에서 상품 리스트에서 특정 조건에 맞는 상품만 필터링할 때 사용할 수 있습니다.
val products = List("Apple", "Banana", "Cherry", "Date")
// 특정 조건에 맞는 상품을 필터링하는 고차 함수
def filterProducts(products: List[String], condition: String => Boolean): List[String] = {
products.filter(condition)
}
// 상품 이름의 길이가 6 이상인 상품을 찾는 조건
val longNameCondition: String => Boolean = name => name.length >= 6
// 필터링된 결과
val filteredProducts = filterProducts(products, longNameCondition)
println(filteredProducts) // List(Banana, Cherry)
예제 2: 데이터 변환
사용자 등록 시, 입력된 데이터를 처리하고 변환할 때 유용합니다.
val userNames = List("alice", "bob", "charlie")
// 사용자 이름을 대문자로 변환하는 함수
def transformNames(names: List[String], transform: String => String): List[String] = {
names.map(transform)
}
// 대문자로 변환하는 익명 함수
val toUpperCase: String => String = name => name.toUpperCase
// 변환된 결과
val upperCasedNames = transformNames(userNames, toUpperCase)
println(upperCasedNames) // List(ALICE, BOB, CHARLIE)
5. 흔한 실수와 주의사항
실수 1: 고차 함수에 잘못된 인자 전달
// 잘못된 코드
val wrongResult = calculate(5, "3", add) // Type mismatch error
실수 2: 익명 함수의 범위
// 잘못된 코드
def scopeExample(): Unit = {
val x = 10
val anonymousFunction = (y: Int) => x + y
}
6. 정리
다음에 학습하면 좋은 주제는 함수형 프로그래밍의 다른 개념인 모나드 또는 컬렉션 처리입니다. 이를 통해 더 복잡한 데이터 처리 방법을 익힐 수 있습니다.