PHpullh
학습 라이브러리/Kotlin/렌즈 패턴 (Lens)

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로 자동 생성됩니다.