본문 바로가기

Kotlin14

Double Dispatch를 통해 유연하게 확장하기 (해당 내용은 토비님의 유튜브영상을 정리한 것임을 알립니다) GoF Design Pattern 에 행동 관련(Behavioral) 패턴 중 Visitor Pattern이 있는데 이 패턴을 알기 위해서 Double Dispatch 기법을 알면 보다 쉽게 이해할 수 있다. (사실 상 Visitor Pattern의 기반이 Double Dispatch 기법이다) Double Dispatch 기법은 말 그대로 디스패치를 두 번 한다는 것인데, 다형성을 통한 유연성은 높이되 각 구현체에 대해 특화된 로직을 적용해야하는 경우에 사용할 수 있다. 코드로 Double Dispatch에 대해 알아보자. 예제 코드 예제는 SNS에 Post를 올리는 간단한 코드이다. interface SNS { fun getName(): .. 2022. 2. 10.
[Spring with Kotlin] sealed class로 다양하게 요청 받기 예제 코드는 여기에서 확인할 수 있다. 서버 API를 만들다보면 동일한 리소스에 대해 다른 요청 파라미터를 받아야할 때가 있다. 기본적인 파라미터는 동일하지만 리소스의 타입에 따라 다른 파라미터를 추가적으로 받아야할 때 sealed class를 활용하여 하나의 리소스에 대한 다양한 요청 DTO를 관리할 수 있다. 예를 들어 유저를 등록하는 API가 있다고 하자. 기본적으로 서비스에서 가입 시 유저로부터 이름, (로그인 ID로써)이메일, 비밀번호를 받아야한다면 요청 파라미터는 다음과 같은 data class로 나타낼 수 있을 것이다. data class UserSignUpRequest( @field:NotBlank val name: String, @field:Email val email: String, @.. 2022. 1. 28.
Arrow Core: Tutorials - Functional Error Handling (작성 중) Functional Error Handling 함수형 에러 핸들링 https://arrow-kt.io/docs/patterns/error_handling/ Λrrow Functional companion to Kotlin's Standard Library arrow-kt.io When dealing with errors in a purely functional way, we try as much as we can to avoid exceptions. 순수한 함수형 방식으로 에러를 처리할 때, 예외들을 피할 수 있게 최대한 노력한다. Exceptions break referential transparency and lead to bugs when callers are unaware that they may.. 2021. 12. 31.
observable, vetoable를 통한 프로퍼티 변경 감지 Kotlin은 Delegates를 통해 프로퍼티의 변경을 감지할 수 있는 매우 편리한 기능을 제공한다. observable Delegates.observable은 단순하게 프로퍼티가 변경됨을 감지하는 역할을 한다. import kotlin.properties.Delegates fun main() { var watchedNumber by Delegates.observable(0) { property, oldValue, newValue -> println("`${property.name}` changed from `$oldValue` to `$newValue`") } watchedNumber = 1 watchedNumber = 2 watchedNumber = 3 } 위 코드를 실행 시키면 콘솔에 아래와 같이.. 2021. 11. 6.
by lazy를 통해 지연 초기화 적용하기 개발을 하다보면 가끔 지연 초기화를 적용해야할 때가 있을 수 있다. Kotlin을 사용하면 이를 쉽게 처리를 할 수 있다. 아래 코드를 보자. object Answer { val value = 42 } // 수행이 오래 걸리는 기능 fun longJob() { println("Job just started") Thread.sleep(2_000) println("Job has done") } fun main() { longJob() println(Answer.value) } 여기서 Answer에 value 프로퍼티는 사용되기 전에도 초기화가 되어있다. 이 값을 정말 사용되는 때(위 코드에서는 14번째 라인)까지 초기화를 지연시키고 싶다고 했을 때 by lazy 를 통해 쉽게 처리할 수 있다. object .. 2021. 11. 6.
by 키워드를 사용한 Delegation 다음과 같이 Worker와 Student에 대한 interface가 있다고 할 때, interface Worker { fun work() } interface Student { fun study() } 이 두 interface를 상속받는 클래스를 구현할 때는 다음과 같이 직접 상속받아 구현하는 방식을 주로 사용할 것이다. class Developer : Worker, Student { override fun work() { println("Work hard!") } override fun study() { println("Study hard!") } } Kotlin 에서는 by 키워드를 사용하면 interface를 상속하되 직접 구현하지 않고, 클래스의 프로퍼티에 해당 interface에 대한 역할을 위.. 2021. 11. 6.