일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- elastic search
- 제주
- Gradle
- Spring
- docker
- Angular2
- design pattern
- hadoop
- nginx
- DDD
- Java
- Storm
- hdfs
- Clean Code
- hibernate
- Spring Batch
- scala
- elasticsearch
- 엘라스틱서치
- 도메인주도설계
- Linux
- apache storm
- 스프링 배치
- Hbase
- spark
- intellij
- Spring XD
- 인텔리J
- Spring Boot
- SBT
- Today
- Total
욱'S 노트
불변 데이터/Immutable Data/Optics(Kotlin 함수형 프로그래밍 #2) 본문
불변 데이터/Immutable Data/Optics(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() }
참고자료 :
Arrow
Idiomatic functional programming for Kotlin
arrow-kt.io
코틀린 함수형 프로그래밍 - 예스24
함수형 프로그래밍을 들어본 개발자는 많지만 제대로 된 함수형 프로그래밍을 배우기 위해 하스켈이나 스칼라까지 배울 여유가 없는 독자도 많을 것이다. 이 책은 정석적인 함수형 프로그래밍
www.yes24.com
'Methdology > Functional Programming' 카테고리의 다른 글
불변 컬렉션/Immutable Collections (Kotlin 함수형 프로그래밍 #5) (4) | 2025.01.16 |
---|---|
Option을 사용해야하는 이유/Nested Nullability (Kotlin 함수형 프로그래밍 #4) (1) | 2025.01.15 |
타입 에러/Typed Errors (Kotlin 함수형 프로그래밍 #3) (0) | 2025.01.14 |
함수형 데이터구조/대수적 타입/Algebraic Data Type (Kotlin 함수형프로그래밍 #3) (0) | 2025.01.13 |
함수형 프로그래밍이란 (Kotlin 함수형 프로그래밍 #1) (0) | 2025.01.07 |