일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- scala
- Angular2
- nginx
- hdfs
- Spring
- hadoop
- docker
- spark
- Spring Batch
- Hbase
- Java
- 엘라스틱서치
- 인텔리J
- Clean Code
- design pattern
- DDD
- elastic search
- Gradle
- elasticsearch
- intellij
- 제주
- Storm
- SBT
- Spring Boot
- Linux
- 도메인주도설계
- apache storm
- Spring XD
- hibernate
- 스프링 배치
- Today
- Total
목록2025/01 (22)
욱'S 노트
일단 모나드에 대한 용어에 신경쓰지 말고 시작해보자.모나드가 없을 때간단한 Either를 하나 작성해보자.sealed interface Either { data class Left(val error: A) : Either data class Right(val value: B) : Either} 계좌의 입출금 문제를 생각해보자sealed interface Error { data object NegativeAmount : Error}data class Account private constructor(val balance: BigDecimal) { companion object { fun create(initial: BigDecimal): Either { ..
자바나 스프링을 미리 경험했다면 의존성 주입(Dependency Injection)이라는 것에 익숙할 것이다. 그러나 기존의 방식은 런타임시에 의존성 주입이 발생한다. 앞에서 살펴봤듯이 함수형 프로그래밍에서는 최대한 컴파일러가 타입 안전을 검사하기를 원한다. 코틀린에서는 이 문제를 어떻게 해결할 수 있을지 살펴보자.Effects앞에서 효과가 무엇인지 알아봤다. 효과를 명시적으로 함수의 시그니처에 포함시키자는 것이 주요 아이디어이다. 기본적으로 순수 함수라면 함수는 연산만을 수행한다라고 얘기한다.fun add(x: Int, y: Int): Int = x + y 위의 간단한 순수 함수에 사이드 이펙트를 포함시켜 보자.fun loggingAdd(x: Int, y: Int): Int { println("x ..
함수형 도메인 모델링의 목적은 비즈니스 도메인을 정확하게 묘사하는 것이다. 컴파일러를 최대한 활용하여 타입-세이프하고, 버그를 방지하고 유닛테스트를 경감 시키는 것이 목적이다. 앞에서 살펴봤듯이 함수형 프로그래밍은 타입 주도 개발(Type Driven Development)을 따르기도 한다. 타입은 함수와 데이터가 준수해야 하는 엄격한 계약이다. 타입 시스템을 이를 어길 수 없다. 그러므로 다양한 케이스에 대한 유닛테스트도 경감시킬 수 있는 것이다.코틀린은 함수형 도메인 모델링에 적합하다. 코틀린은 data class, sealed class, enum class, value class를 제공한다. 그리고 애로우를 이용한다면, Either와 같은 흥미로운 데이터 타입을 제공 받을 수 있다.예제기본 타입 ..
방문일시 : 2025년 1월 18일주차장 : 과천향교카카오맵 : https://place.map.kakao.com/8652111 과천향교경기 과천시 자하동길 18 (중앙동 81)place.map.kakao.com 산행거리 : 총 6.4km (원점 회귀) 오늘도 일요일 일정이 있어서 가까운 거리에 있는 관악산으로 향했다. 내비게이션에서 과천향교 찍고 가면 노상 주차장이 많아서 쉽게 주차할 수 있다. 이때는 주차요금이 10분에 150원이였다. 산행을 끝내고 나니 6400원 나왔다. 만약 무료 주차를 하고 싶다면 과천시청에 주차를 하고 이동을 하는 방법도 있을 것 같다.https://place.map.kakao.com/11561761 과천시청경기 과천시 관문로 69 (중앙동 1-3)place.map.kakao..
방문일시 : 2025년 1월 12일주차장 : 용인시청카카오맵 : https://place.map.kakao.com/8021938 용인시청경기 용인시 처인구 중부대로 1199 (삼가동 556)place.map.kakao.com산행거리 : 왕복 8.4km (원점회귀) 일요일 오전 가볍게 동네 석성산 산행을 시작해본다. 주말 용인시청 주차장은 늘 한가한 편이다. 팁이 하나 있는데 용인시청보다는 용인우체국을 찍고 오면 들머리에 더욱 가깝게 주차를 할 수 있다. 주차를 하고 들머리로 이동했다. 길가에도 주차선이 있어서 주차를 할 수 있다. 코스를 보면 용인시청에서 가는 코스가 있고, 동백에서 올라오는 코스가 있다. 동백에서 올라오는 코스는 짧지만 가파르고, 용인시청에서 올라가는 코스는 평탄하면서 거리가 길다. ..
처음에 얘기했다시피 함수형 프로그래밍은 제약이 없다. FP에서 외부효과와 입출력을 다루는 방식이 대해서 알아보자. 핵심은 부수효과를 분리해 내는 것이다.엄격성과 지연성함수는 엄격(strict)할 수 있고, 지연(Lazy)될 수 도 있다. 지연성(Lazyness)를 활용하면 프로그램의 기술과 평가를 분리할 수 있다. Strict function항상 모든 즉시(eager) 탐욕적(greedy)으로 인자를 평가(eager, greddy)대부분의 프로그래밍 언어의 표준Lazy function내장 구문(&&, ||, if)에서 지원평가하지 않는 타입은 () → A와 같이 정의. 이와 같은 함수를 썽크(thunk)라고 부름fun lazyIf( cond: Boolean, onTrue: () -> A, /..
불변 컬렉션앞에서 보았듯이 함수형 프로그래밍에서는 항상 불변값과 대수적 타입으로 값을 다룬다. 이는 컬렉션의 경우에도 마찬가지이다. 리스트의 가장 기본적인 구현을 보면 아래와 같다.// sealed 키워드를 통해 패키지 안에서만 상속 가능하도록sealed class List// Empty를 표현object Nil : List()// 비어 있지 않는 리스트data class Cons(val head: A, val tail: List) : List() 데이터 공유불변 리스트 xs에 1이라는 원소를 추가한다면 Cons(1, xs) 새로운 리스트를 반환하면 된다. 삭제를 한다면 tail을 반환하면 됨. 이를 데이터 공유라고 한다. 데이터 변경이나 오염을 피하기 위해서 복사본을 만들 필요가 없다. 데이터 구조가 ..
예전에 자바를 사용했었다면, NullpointerException을 겪었을 것이다. 널의 가장 큰 문제점은 클라이언트 코드에서 예상할 수 어렵다는데 있었다. 코틀린에서는 ?을 베이스로 null-safety 문제를 해결하고 있다. 코틀린에는 nullable type이 있지만, Arrow에 Option 타입이 있는 이유에 대해서 알아보자.fun List.firstOrElse(default: () -> A): A = firstOrNull() ?: default()fun example() { emptyList().firstOrElse { -1 } shouldBe -1 listOf(1, null, 3).firstOrElse { -1 } shouldBe 1} 다음 코드를 예상해보자.fun example()..
예외(Exception)의 문제점예외를 던지는 것은 부수효과이다. 그로 인한 문제점은 제어 상실이다. 제어 상실은 예외가 처리되지 않아 프로그램이 중단되거나, 호출 스택위의 어떤 코드가 예외를 잡아서 예외를 처리하는 상황을 의미한다.아래의 코드를 보면 치환 모델이 제공하는 단순한 추론을 벗어나서 참조투명성이 깨지는 것을 확인할 수 있다. 예외를 사용하면 프로그램 전체에서 전역적 추론을 해야되는 문제가 발생한다.fun failingFn(i: Int): Int { val y: Int = throw Exception("boom") // return try { val x = 42 + 5 x + y } catch (e: Exception) { 43 // ..
대수적 타입(ADT)대수적 타입 즉 Algrebraic Data Type은 합타입과 곱타입으로 표현된 타입이다. 그렇다면 합타입과 곱타입이란 무엇인가?합타입대표적으로 enum class가 있다. 아래의 RGB 타입은 RED, GREEN, BLUE 3가지만 존재할 수 있다.enum class RGB { RED(), GREEN(), BLUE()}곱타입대표적인 예로 class가 있다.data class Person(val name: String, val age: Int, val email: String)val lazysoul = Person("lazysoul", 33, "kotlin@gmail.com")val goinhacker = Person("goinhacker", 36, "fp@gmail..