728x90

Kotlin 48

Kotlin Coroutines - Basic

Kotlin Coroutines 는 다른 언어에 있는 async / await 과 유사한 부분을 구현할 수 있게 만든 library 라고한다. Kotlin 의 suspend function 은 비동기 함수를 다루는데 Java 의 Future 보다도 안전하고 더 적은 버그가 있다고 한다. 일단 백문이 불여 일타 라고 코드로 먼져 보도록 하자 실습 fun main() = runBlocking { // this: CoroutineScope launch { // launch a new coroutine and continue delay(1000L) // non-blocking delay for 1 second (default time unit is ms) println("World!") // print afte..

Kotlin 2022.05.29

[EffectiveKotlin-Item02] 변수의 스코프를 최소화 해라

변수의 스코프를 최소화 해라 만약 loop 안에서만 변수가 쓰인다면 loop 안으로 변수를 넣어서 scope 를 최소화 해라. 보통의 언어 에서 변수의 scope 는 보통 curly braces 안으로 생성지만, Kotlin 에서는 외부의 변수에도 접근 가능하다. 음, 내가 생각해도 뭔가 잘 읽기 힘들게 적은거 같아 코드로 적어보려고 한다. val a = 1 fun fizz() { val b = 2 print(a+b) } val buzz = { val c = 3 println(a + c) } 위의 예시를 보면, buzz 와 fizz 의 curly braces 지역 scope 에서 외부 변수인 a 에 접근할 수 있음을 알 수 있다. 반대로 모두 알고 있겠지만 Outer area 에서 inner functi..

Kotlin 2022.05.29

Effective Kotlin - Item01

가변성을 제한해라 들어가기에 앞서 이건 완전한 번역글이 아닙니다. 원서를 읽고 느낀점을 적은 글 입니다. 본문 일단 첫장 부터 가변성을 제한하라고 적혀있다. 책에서 나온 글귀중 이런 글이 있다. When an element holds state, the way it behaves depends not only on how you use it, but also on its history 나는 이뜻을 이렇게 해석했는데 element 가 상태를 지니고 있을때 상태를 다루는 방법은 오직 어떻게 사용하는 것에만 의존하는 것이 아니라 그것의 History(객체의 변화 상태를 보여주는 것이라고 나는 해석했다) 에도 관련있다. 그래서 아래 예시가 나오는데 같이 한번보자. class BankAccount { var ba..

Kotlin 2022.05.25

GC 분석해보기

이번에 새로 진행하는 신규 프로젝트를 작업중이였는데 모니터링을 하던 도중 의도치 않게 MinorGC 가 자주 발생하고, 시간 또한 긴것을 발견하였다. 그래서 이를 어떻게 개선했는지 그 방법에 대해서 적어보려고 한다. 탐색 일단 Spring Application Proccess 의 번호를 알아야 한다. jps 프로세스를 알았다면 현재 HeapDump 를 떠서 확인해야 한다. (내 프로세스 번호는 6485번 이였다.) jmap -dump:format=b,file=heapdump.hprof 6485 잘 dump 가 떠졌다면 아래와 같이 heapdump.hprof 라는 파일을 확인할 수 있을 것이다. 이 파일을 열기 위해서 GC 를 Monitoring 할 수 있는 도구인 VisualVM 을 이용했다. Dump ..

Kotlin 2022.05.24

Kotlin Delegation

Delegation 은 코틀린에서 지원하는 문법적 기능 중 하나인데, 이는 Delegation Pattern 의 Boiler Plate 를 줄여주는 Sugar Syntex 중 하나이다. Delegation Pattern 은 쉽게 말해 상속이 아닌 다른 객체에게 세부 구현을 위임하는 것이다. 공식문서의 예제를 한번 살펴보자. interface Base { fun print() } class BaseImpl(val x: Int) : Base { override fun print() { print(x) } } class Derived(b: Base) : Base by b fun main() { val b = BaseImpl(4) Derived(b).print() } 위의 예제는 Derived 의 내부 인터페이..

Kotlin 2022.05.16

Kotlin Class 내부 object 에서 Class Property 참조하는 법

오늘 Kotlin 을 사용하다가 objcet 로 만든 곳에서 Class 내부 Property 를 참조해야 하는 일이 생겼다. 코드는 대략적으로 아래와 비슷한 상황이였다. interface Roach { fun roa() } class Test( val testProperty: String, ) { fun test() { object : Roach { override fun roa() { // testProperty 에 접근하고 싶음 } } } } 처음에는 음 this 를 사용하면 붙어질까? 라는 생각을 했지만 당연히도 익명 클래스의 안이기 때문에 오히려 this 에 맵핑되어 있는 객체는 익명 클래스의 인스턴스 라는 것을 깨닫게 됬다. 그래서 어떻게 할까 하다가 아래와 같은 방법이 되는지도 테스트 해봤다...

Kotlin 2022.05.11

고차함수에서 Return 이 안되는 이유

코틀린에서 가끔씩 고차함수에서 Return 을 할 경우에 안되는 경우가 있다. 바로 아래 코드와 같은 상황일 경우에 말이다. fun forEach(a: IntArray, action: (Int) -> Unit) { for (n in a) action(n) } fun main() { forEach( intArrayOf(1, 2, 3, 4)) { if (it 3) return println(it) } ) } 이 이유는 무엇일까? 이건 일단 람다 안에서의 return 에 대해서 생각해봐야 하는데, 일단 lambda 안에서의 return 은 가까운 함수 혹은 무언가 람다를 둘러싸고 있는 환경을 반환하려고 시도한다. 즉 위의 코드에서는 return 이라는 함수가 main() 함수를 반환하려고..

Kotlin 2022.05.03

Kotlin DSL

코틀린이란 언어는 상당히 문법적으로 코드를 간결하게 작성할 수 있는 기능을 많이 제공한다. "중위 연산자", "확장 함수", "람다구문의 it" 등 을 지원하고 있다. 우리는 이러한 방법을 이용해 좀 더 간결하게 코드를 작성할 수 있다. 예를 들면 아래와 같이 말이다. 1.to("one") 1 to "one" 확장함수를 이용하면 아래처럼 조금 더 객체지향 적인 코드를 짤 수 있다고 생각한다. StringUtil.capitalize(s) // java s.capitalize() // kotlin 내부 DSL 또한 코틀린에서는 좀 더 가독성 좋은 코드를 작성할 수 있도록 내부 DSL 또한 지원한다. 여기서 짚고 넘어가야 할 점이 있는데 DSL 에 대해서 조금 알아보자. 우리가 보통 잘 알고 있는 DSL 은 ..

Kotlin 2022.03.28

Kotlin 의 확장함수가 좋은 이유

사실 우리가 특정 클래스를 이용하다보면 자신이 수동으로 생성한 Mapper 혹은 라이브러리로 만들어진 Mapper 를 통해서 해당 클래스를 변환해야 하는 일이 생길 수 있다. 근데 나는 이런 Mapper 를 쓰는게 좋은 코딩이지는 잘 모르겠다. 너무 번잡하게 만드는 것이 아닌가? 라는 생각이 든다. 그래서 공통모듈 Mapper 를 쓰는걸 좋아하지 않는다. 코드로 설명하면 대략적으로 아래와 같다. Integer a = 10; String b = StringMapper.from(a); System.out.println(b) // "10" 위의 코드가 Mapper 를 쓰는 예시인데 나는 이게 객체지향스러운가 라는 의문도 있긴하다. 사실 대부분 위처럼 쓰는 사람은 많지 않을테고, 아래처럼 쓰는 경우가 훨씬 많다..

Kotlin 2022.03.18

Ko-Test Framework 사용해보기

코틀린 하면서 처음에는 잘 이해하지 못했던 DSL 문법의 간결함을 알게 되면서 infix 로 연계하여 만들 수 있는 DSL 구조가 좋은 것 같다는 생각이 들었다. 예를 들면 원래 Java + QueryDSL 을 사용한다면 아래와 같은 코드가 작성될 수 있을 것이다. selectFrom(person).where(person.name.eq("roach)) 하지만 코틀린의 infix 를 이용한다면 다르게 풀어볼 수도 있을 것이다. selectFrom person where person.name is "roach" 내 생각엔 Kotlin 에서 QueryDSL 을 쓰는건 계속해서 JPA + QueryDSL 을 써왔기때문이라고 생각하는데 Kotlin + Spring + JPA 를 이용한다면 QueryDSL 보다 i..

Kotlin 2022.01.21
728x90