얼마전 코틀린 1.4 버전이 릴리즈됐다. 추가된 기능들에 대해 간략히 살펴보자. # SAM conversions for Kotlin interfaces 지금까지 코틀린은 SAM(Single Abstract Method, 추상메서드가 하나뿐인 인터페이스) 에 대해 람다 표현식을 지원하지않았다. 함수 자체를 타입으로 나타낼 수 있었기때문에 함수 타입에만 람다를 지원하고, 자바의 함수형 인터페이스(마찬가지로 추상메서드가 1개인 인터페이스)만 람다로 표현할 수 있었다. fun main() { val calculator = object: Calculator { override fun add(n1: Int, n2: Int): Int = n1 + n2 } } interface Calculator { fun add(n..
처음 자바를 배울때만해도 getter, setter 는 객체지향 언어인 java 의 캡슐화의 산물이었다. 하지만 개발자로써 경험을 하고, 공부해오면서 getter, setter 로는 충분한 캡슐화를 제공하기 어렵고, 특히 setter 는 캡슐화를 넘어 객체 상태를 변경하기때문에 더 주의깊게 사용하고자 하고있다. 객체를 조작하고, 코드를 작성하다보면 객체의 상태를 변경해야하는 경우도 발생하는데 이럴때도 단순히 setter 를 호출하기보다는 좀 더 의미있는 이름의 메서드를 제공하고자했고, 특히 2개 이상의 상태를 변경해야한다면 클라이언트 코드에서 연속적인 setter 를 호출하는것 보다는 필요한 상태를 모두 원자적으로 변경하는 메서드를 제공하는 형태의 코드를 작성하고있다. - setter 를 이용한 상태 변..
이번 포스팅 내용은 kotlin 과 jackson 조합시에만 발생하므로 java 이용시엔 해당하지않는다. 정확히말하면 jackson 에서 kotlin 지원을 위한 모듈인 jackson-module-kotlin 의 문제다. jackson-module-kotlin 2.10.0 까지는 data class 를 json 으로 serialize 시 is 로 시작하는 프로퍼티에 대해 is 를 제거한 key 로 serialize 했다. 쉽게 코드를 보고 얘기하자면 data class Person( val isDeveloper: Boolean ) 이 클래스를 serialize 시 json 형태는 이런 형태였다. {"developer":true} jackson-kotlin-module 2.10.1 부터는 이 스펙이 변경되..
기본적으로 kotlin의 generics 는 자바와 많은 부분에서 비슷하다. 하지만 몇가지 달라진점, 추가된점들이 있는데 그 것들을 정리한다. 기본적으로 자바의 generics 을 어느정도 이해하고있다는 가정하에 얘기가 진행되므로 generics 전체를 자세히 설명하지는 않는다. 1. Star Projection * 를 이용해서 표현한다. 특정 타입을 지정하지않을때 사용하며, 자바의 와일드카드라고 생각하면 된다. 와일드카드와 동일하게 타입을 캡쳐하지않기때문에 타입안정성을 보장받지못한다. 다만 자바의 와일드카드처럼 한정적 와일드카드(bounded wildcard) 문법은 지원하지않는다. // 와일드카드처럼 사용 가능. val list: List = listOf(1, 2, 3) // 타입을 캡쳐하지않기때문에..
1. collection val evens: List = listOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) .filter { it % 2 == 0 } 코를린에서 처음 이런 코드를 봤을때 아무 생각없이 난 이렇게 생각했었다. '오 코틀린은 stream 호출안해도 알아서 stream 으로 바꿔주나보다' 이렇게 생각한 근거는 딱히 없다. 그냥 stream 과 동일한 API 를 제공하고있어서 그렇게 생각했던것 같다. (많이 알겠지만 filter, map 과 같은 api들은 매우 범용적인 네이밍이라 프로그래밍 언어 차원을 넘어서서 여기저기서 많이 제공하고있는 명칭이다.) 하지만 그게 아니란걸 알게되어 이 포스팅을 작성하게됐다. 사실 신중히 고민해봤다면 이상한걸 느꼈어야한다. stream 으로 변..
1. 자바의 지역변수 스레드 세이프 자바에서 지역변수는 람다나 익명클래스 내에서 값을 변경할 수 없다. 람다나 익명클래스에서만 값을 변경할 수 없을뿐아니라 람다나 익명클래스에서 읽고(read) 있다면 외부 메서드 내에서도 값을 변경할 수 없다. 이 규약을 지키기위해 람다가 없던 자바7까지는 익명클래스에서 외부 메서드의 지역변수를 읽기위해선 지역변수를 final 로 선언했어야했고, 람다가 추가된 자바8 이상에서는 effectively final(사실상 final) 이라는 규약으로 final 변수가 아니더라도 람다나 익명클래스에서 읽고있다면 사실상 final 이 되어 어디서도 값을 변경할 수 없다. public void test() { int number = 100; new Runnable() { @Over..
요근래 kotlin+spring boot2 로 개발을 하고있다. 이중에 코드를 리팩토링하고싶은 부분이 있었고, 이를 리팩토링하는 과정에서 꽤나 삽질을 하게만든 경험을 포스팅하려한다. 뭔가 특정한 내용에 대해 포스팅한다기보다 실제 상황에서 이슈를 만나고, 그 이슈를 해결해가는 과정을 남겨보려한다. 실제 이슈는 회사에서 프로덕션 코드를 리팩토링하는 과정에서 발생한부분이고, 포스팅에서 나오는 코드는 해당 코드를 예제화한 코드이다. 참고로 아래 예제코드를 위한 개발환경은 다음과같다. - kotlin - spring boot 2.1.5 - spring boot stater web - spring boot starter jdbc (필수) 1. 코드작성 abstract class BaseApiRepository(pr..
기존 운영중인 자바 프로젝트에서 테스트코드를 코틀린으로 작성하고자했다.어떤 것들을 해줘야하는지 찾아봤는데 정말 별거 없다. plugins { id 'org.jetbrains.kotlin.jvm' version '1.3.20' } 이것만 추가해주면 바로 코틀린 클래스를 만들어서 테스트 코드를 작성할 수 있다. class KotlinTest { @Test fun `안녕 코틀린`() { assertThat("hello").isEqualTo("hello") } }
kotlin 에서 jackson 사용시 kotlin/reflect/KotlinReflectionInternalErrorjava.lang.NoClassDefFoundError: kotlin/reflect/KotlinReflectionInternalError 이런 에러를 내뿜는 경우가 있다. 나같은경우 코틀린은 1.2.10 을 사용하고있고, 스프링부트를 이용해서 작업하고있었는데 스프링부트에서 포함하고있는 jackson 이 2.8.10 이라서 코틀린 jackson 모듈도 동일 버전으로 추가했었다. compile("com.fasterxml.jackson.module:jackson-module-kotlin:2.8.10") 그리고 저 에러를 만난건데 코틀린 jackson 버전을 2.9 이상으로 올려주면 해결된다.j..
요즘 슬슬 코틀린에 대해 알아보고있다. 이제 막 시작하는단계라 거창하게 적을건없고 간략하게 코틀린 테스트 프레임워크인 spek을 이용해 테스트 코드를 작성하는 법을 알아보자. 일단 IntelliJ에서 개발한다는 전제하에 작성한다. 1. Spek plugin 설치 Spek 플러그인을 설치하자. 2. DependenciesSpek을 사용하기 위해서는 일단 "org.jetbrains.spek:spek-api" 의존성이 당연히 필요하고, "org.jetbrains.spek:spek-junit-platform-engine" 의존성도 필요하다. Spek 의존성만 있어도 아무런 문제없이 컴파일이 되겠지만 junit이 있어야 실행이된다. (junit이 없으면 런타임에 예외가 발생하며 테스트가 진행되지 않는다.) gra..
- Total
- Today
- Yesterday
- Kotlin
- JavaScript Core
- 정규표현식
- frontcode
- Git
- servlet
- toby
- frontend개발환경
- mariadb
- go-core
- Jackson
- EffectiveJava
- java8
- generics
- DesignPattern
- backend개발환경
- MySQL
- OOP
- http
- db
- javascript
- Spring
- spring cloud
- code
- java
- clean code
- JPA
- programming
- Design Pattern
- TEST
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |