일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- Angular2
- elastic search
- nginx
- spark
- SBT
- Spring Batch
- intellij
- Hbase
- Spring
- design pattern
- elasticsearch
- 인텔리J
- apache storm
- Linux
- Spring Boot
- 제주
- Java
- Storm
- 엘라스틱서치
- 스프링 배치
- hadoop
- Clean Code
- docker
- hibernate
- DDD
- 도메인주도설계
- scala
- Gradle
- Spring XD
- hdfs
Archives
- Today
- Total
욱'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
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() }
참고자료 :
반응형
'Methdology > Functional Programming' 카테고리의 다른 글
함수형 프로그래밍이란 (Kotlin 함수형 프로그래밍 #1) (0) | 2025.01.07 |
---|