욱'S 노트

불변 데이터/Immutable Data (Kotlin 함수형 프로그래밍 #2) 본문

Methdology/Functional Programming

불변 데이터/Immutable Data (Kotlin 함수형 프로그래밍 #2)

devsun 2025. 1. 9. 09:54
반응형

불변 데이터(Immutable Data)

이전 회차에서 살펴보았다시피 부수효과란 함수 내부의 구현이 함수 외부의 상태에 영향을 끼치면 안된다는 것을 의미한다. 가장 기본적인 룰은 기존 데이터를 변경하지 않고, 새로운 데이터를 만들어 내면 된다. 코틀린에서는 copy라는 내장함수를 제공하기 때문에 쉽게 다를수 있다.

data class Deposit(val amount: Int) {
    fun withdraw(amount: Int): Deposit = 
        copy(amount = this.amount - amount)
}
    
val deposit = Deposit(100)
val newDeposit = deposit.withdraw(50)

 

Optics

기본적으로 코틀린의 Data클래스는 불변 데이터 도메인 모델링을 위한 훌륭한 레시피이다.

data class City(val name: String, val country: String)
data class Street(val name: String, val number: Int?)
data class Address(val street: Street, val city: City)
data class Person(val name: String, val age: Int, val address: Address)

fun Person.capitalizeCountry(): Person =
    copy(
        address =
        address.copy(
            city =
            address.city.copy(
                country =
                address.city.country.capitalize()
            )
        )
    )

 

하지만 위와 같은 경우 copy 메소드를 활용하다보면, 연관 관계가 깊을때 변경이 쉽지 않다. 이런 경우 Arrow의 옵틱을 활용할 수 있다. 애로우에 대한 기본 설정은 아래 글을 참고하자.

https://opennote46.tistory.com/266

 

Arrow KT 시작하기 - Getting Started

개요애로우의 목적은 관용적인(idiomatic) 함수형 프로그래밍을 코틀린에 적용하는 것을 목표로 한다. 애로우는 다른 함수형 프로그래밍 커뮤니티에서 만들어진 라이브러리들의 영향을 받았다.설

opennote46.tistory.com

 

companion object가 어노잉한데, 이건 KSP 스펙이라 어쩔 수 없다.

@optics data class City(val name: String, val country: String) {
    companion object
}

@optics data class Street(val name: String, val number: Int?) {
    companion object
}

@optics data class Address(val street: Street, val city: City) {
    companion object
}

@optics data class Person(val name: String, val age: Int, val address: Address) {
    companion object
}

 

사용법은 다음과 같다. 깊은 단계의 프로퍼티를 간단히 변경할 수 있다.

fun Person.capitalizeCountry(): Person =
    Person.address.city.country.modify(this) { it.capitalize() }

 

참고자료 : 

https://arrow-kt.io/ 

 

Arrow

Idiomatic functional programming for Kotlin

arrow-kt.io

https://www.yes24.com/Product/Goods/120236288?pid=123487&cosemkid=go16903580741098008&utm_source=google_pc&utm_medium=cpc&utm_campaign=book_pc&utm_content=ys_240530_google_pc_cc_book_pc_12306%EB%8F%84%EC%84%9C&utm_term=%EC%BD%94%ED%8B%80%EB%A6%B0%ED%95%A8%EC%88%98%ED%98%95%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D&gad_source=1&gclid=CjwKCAiAm-67BhBlEiwAEVftNp4rJHRMrNaBE2YyQCT-r4Gxu_X9K6NdakIvehx_Mxsi48Jj3rZ45BoCbUsQAvD_BwE

 

코틀린 함수형 프로그래밍 - 예스24

함수형 프로그래밍을 들어본 개발자는 많지만 제대로 된 함수형 프로그래밍을 배우기 위해 하스켈이나 스칼라까지 배울 여유가 없는 독자도 많을 것이다. 이 책은 정석적인 함수형 프로그래밍

www.yes24.com

 

반응형