728x90

✅ 1. 순수 함수 (Pure functions)
순수 함수는 같은 입력에 같은 출력, 외부 상태를 변경하거나 부수효과(side-effect)를 만들지 않는 함수 입니다. 부수효과는 애플리케이션의 경계(I/O, DB, println 등)로 몰아두고 내부 로직은 순수하게 유지하면 테스트와 재사용성에 좋습니다.
object PureFunctionExample {
// 순수 함수
def add(a: Int, b: Int): Int = a + b;
// 비순수 (부수효과 포함) 예시 - 테스트/재사용성 떨어지는 코드
def addAndPrint(a: Int, b: Int): Int = {
val r = a + b
println(s"result = $r") // 부수 효과
}
def main(args: Array[String]): Unit = {
var result1 = add(3,5)
var result2 = add(3,5)
println(s"result1 = $result1") // result1 = 8
}
}
}
✅ 2. 고차 함수 (Higher-order functions)
함수를 인자로 받는(또는 반환하는)함수입니다.
object HigerOrderExample {
// 함수를 인자로 받음
def applyTwice(f: Int => Int, x: Int): Int = f(f(x))
def main(args: Array[String]): Unit = {
val double = (n: Int) => n * 2
val result = applyTwice(double, 5)
println(s"applyTwice(double, 5) = $result") // applyTwice(double, 5) = 20
}
}
✅ 3. 익명 함수 (Anonymous Function, Lambda)
익명 함수는 이름 없이 즉석에서 정의할 수 있는 함수로서 더욱 축약된 문법을 가집니다.
object AnonymousFunctionExample {
def main(args: Array[String]): Unit = {
val nums = List(1, 2, 3, 4);
val doubled = nums.map(n => n * 2)
println(s"doubled = $doubled") // doubled = List(2, 4, 6, 8)
// 더 축약된 문법
val tripled = nums.map(_ * 3)
println(s"tripled = $tripled") // tripled = List(3, 6, 9, 12)
}
}
✅ 4. 컬렉션 함수(map, filter, reduce)
object CollectionFunctionExample {
def main(args: Array[String]): Unit = {
val nums = List(1, 2, 3, 4, 5)
val squared = nums.map(n => n * n)
println(s"squared = $squared") // squared = List(1, 4, 9, 16, 25)
val evens = nums.filter(_ % 2 == 0)
println(s"evens = $evens") // evens = List(2, 4)
val sum = nums.reduce(_ + _)
println(s"sum = $sum") // sum = 15
}
}
✅ 5. 불변성 (Immutable & val 중심 코딩)
불변성은 val을 기본으로 사용하며 var은 거의 사용하지 않습니다. Scala의 기본 컬렉션은 immutable이 기본(Scala 2.13/3 기준 List, Vector, Map등이 immutable)
object ImutabilityExample {
def main(args: Array[String]): Unit = {
val nums = List(1, 2, 3)
// nums(0) = 10 // 🚫 불변 컬렉션 수정 불가
val newNums = nums :+ 4 // 새로운 리스트 생성
println(s"원본: $nums") // 원본: List(1, 2, 3)
println(s"수정본: $newNums") // 수정본: List(1, 2, 3, 4)
}
}
✅ 6. Option, Some, None
Null 대신 안전하게 값을 다루는 방법으로 Option[T]는 값이 있거나(Some)없거나(None)를 표현하며 Java의 null을 만나면 Option(null)을 사용해 None으로 안전하게 리핑할 수 있습니다.
object OSNExample {
def findName(id: Int): Option[String] = {
val names = Map(1 -> "Alice", 2 -> "Bob")
names.get(id) // 값이 없으면 None
}
def main(args: Array[String]): Unit = {
val name1 = findName(1)
val name2 = findName(3)
println(s"name1 = $name1") // name1 = Some(Alice)
println(s"name2 = $name2") // name2 = None
// 안전한 처리
println(name1.getOrElse("Unknown")) // Alice
println(name2.getOrElse("Unknown")) // Unknown
}
}
GitHub - Koras02/scala-bloging: https://thinky.tistory.com/category/Back-End/Scala
https://thinky.tistory.com/category/Back-End/Scala - Koras02/scala-bloging
github.com
728x90
LIST
'Back-End > Scala' 카테고리의 다른 글
| [Scala] 6장 - 에러 처리 (1) | 2025.08.18 |
|---|---|
| [Scala] 5장 - 패턴 매칭 & Case 클래스 (4) | 2025.08.14 |
| [Scala] 3장 - 객체지향 프로그래밍(OOP) (1) | 2025.08.09 |
| [Scala] 2장 - 기초 문법 배우기 (2) | 2025.08.09 |
| [Scala] 1장 - Scala란? (3) | 2025.08.07 |