KOTLIN · 함수형
렌즈 패턴 (Lens)
불변 데이터 구조의 중첩된 필드를 안전하게 읽고 수정하는 함수형 패턴입니다.
함수형고급lensopticsimmutable-updatecomposition
핵심 설명
불변 데이터 구조의 중첩된 필드를 안전하게 읽고 수정하는 함수형 패턴입니다.
Kotlin code
data class Lens<S, A>(
val get: (S) -> A,
val set: (S, A) -> S
) {
fun modify(source: S, f: (A) -> A): S =
set(source, f(get(source)))
infix fun <B> compose(other: Lens<A, B>): Lens<S, B> = Lens(
get = { s -> other.get(get(s)) },
set = { s, b -> set(s, other.set(get(s), b)) }
)
}
data class Address(val city: String, val zip: String)
data class Person(val name: String, val address: Address)
// 렌즈 정의
val personAddress = Lens<Person, Address>(
get = { it.address },
set = { person, addr -> person.copy(address = addr) }
)
val addressCity = Lens<Address, String>(
get = { it.city },
set = { addr, city -> addr.copy(city = city) }
)
fun main() {
val person = Person("김철수", Address("서울", "06000"))
// 렌즈 합성으로 중첩 필드 접근
val personCity = personAddress compose addressCity
println(personCity.get(person)) // 서울
val moved = personCity.set(person, "부산")
println(moved)
// Person(name=김철수, address=Address(city=부산, zip=06000))
}학습 팁
렌즈는 깊게 중첩된 불변 데이터를 수정할 때 copy() 체인보다 훨씬 깔끔합니다.
주의할 점
렌즈를 매번 수동으로 작성하는 것은 번거롭습니다. Arrow Optics 라이브러리를 사용하면 KSP로 자동 생성됩니다.
자주 묻는 질문
렌즈 패턴 (Lens)란 무엇인가요?
불변 데이터 구조의 중첩된 필드를 안전하게 읽고 수정하는 함수형 패턴입니다.
렌즈 패턴 (Lens) 학습 시 주의할 점은 무엇인가요?
렌즈를 매번 수동으로 작성하는 것은 번거롭습니다. Arrow Optics 라이브러리를 사용하면 KSP로 자동 생성됩니다.
Continue Learning
Kotlin 학습을 이어가세요
총 200개의 독립 HTML 학습 문서 중 하나입니다. 각 문서는 고유 URL과 canonical 메타데이터를 가집니다.