Kotlin in Action : 코틀린 컴파일러 개발자가 직접 알려주는 코틀린 언어 핵심

이 책은 좀 마음에 든다. 그래도 돈이 없어서 사진 않겠다.

개념설명과 예시가 잘 나와있고 번역도 걸리는거 없이 자연스럽게 읽힌다.
책의 수준은 자바를 어느정도 알아야 제대로 볼 수 있을 것 같다.
람다까지는 어느정도 할 줄 알아야…

본인쨩은 자바도 할 줄 알고 코틀린도 튜토리얼보면서 대강 익힌 후에 책을 봐서 좀 더 편하게 본것같기도 하다.

자바 특징

자바를 소개하는 책에는 자바가 간결하고 쉽다고 했지만… 그건 C,C++하던 사람들 얘기고
본인쨩은 C#을 먼저 하고 자바를 시작해서 그런지
처음에 자바 문법 극혐스러웠다. 

코틀린 써본 느낌

코틀린은 완성된 자바같다.
자바의 혐오스러운 부분을 배제해서 간결하고 직관적이다.

자바와의 호환성을 유지하기 위해 많은 부분을 희생한 것 같다.
자바코드 가져올 때 null타입 체크를 포기한거나 …
그런거나…또 뭐가 있더라
패키지 구조에서 인터널 스코프, sealed도 뭔가 문제가 있었던 것같은데, immutableCollection이 바이트코드에선 퍼블릭이라거나

몇 가지 문제 때문에 코틀린에서 만든 라이브러리를 자바에서 쓰면 좀 불편할 것 같다.

자바도 8에서 람다, 9에서 모듈을 적용하면서 열심히 따라오고는 있는데
자바19정도 되면 코틀린처럼 변하지 않을까

no-java kotlin 버전???

레거시 지원도 좋지만 가끔은 과감하게 포기하면서 발전 해 가면 좋겠다.

Kotlin DSL – BeanDefinitionDSL.kt

코틀린 DSL Bean 선언.

이거 공부 좀 하면 커스텀 빈도 만들 수 있지 않나

샘플코드
https://github.com/sdeleuze/spring-kotlin-functional
가이드 페이지
https://spring.io/blog/2017/08/01/spring-framework-5-kotlin-apis-the-functional-way

한글 번역이나 어설프게 소스코드 붙여놓고 설명하면 더 헷갈릴 것 같다.

이해할 것도 없고 간단하니 그냥 소스 리포지터리 보는게 더 쉬움.

Kotlin에서 slf4j 로거 선언


SLF4J loggers in 3 ways from Kotlin


자바에서 lombok을 쓰면서 고민도 하지 않았던 부분인데… 여기서는 왠지 신경쓰이는 부분.


class SimpleClass {
private val log = LoggerFactory.getLogger(SimpleClass::class.java)
}

이렇게 해야되는데.. 이렇게 매번쓰기 귀찮으니

CoreUtil.kotlin

inline fun logger(): Logger {
return LoggerFactory.getLogger(T::class.java)
}
inline fun logger2(): Logger {
return LoggerFactory.getLogger(MethodHandles.lookup().lookupClass())
}

이걸 선언 해 두고 가져다 쓴다.
오브젝트에 선언하면 스태틱처럼 선언도 가능하지만 클래스 밖에 선언해두면 전역전역펑션으로 선언된다
인라인이 아니었다면… 클래스를 파라미터로 전달했겠지만 이렇게 해서 좀 더 간단해진다.

refied는 여기 참고.
https://medium.com/@joongwon/kotlin-kotlin-%ED%82%A4%EC%9B%8C%EB%93%9C-%EB%B0%8F-%EC%97%B0%EC%82%B0%EC%9E%90-%ED%95%B4%EB%B6%80-part-3-59ff3ed736be

logger2는 댓글에 써 있는 방법.. 좀 더 간단해 보이는데 검증은 필요.

h2. 처리방법 1

companion object 길어서 좀 꼴뵈기 싫다

class MemberService {
companion object {
private val log = logger()
}
}

h2. 처리방법 2

위에다 선언… intellij에서 클래스 표시가 꺼진다. 왠지 기분나쁨

private val log = logger()
class MemberService {
}

h3. 처리방법 3

인터페이스, 앱스트랙트 사용

선언이 좀 성가셔 보이는데 코드가 제일 깔끔해보인다.

매번 호출하는건 아니겠지?


interface Logger {
fun logger() = LoggerFactory.getLogger(this.javaClass)
}

class SimpleClass {
companion object : Logger
fun testfun(){
logger().info("aaa")
}
}


abstract class Logger {
val logger: Logger = LoggerFactory.getLogger(this.javaClass)
}

class SimpleClass {
companion object : Logger()
fun testfun(){
logger.info("aaa")
}
}