• Domain Driven Design

    chap01. Domain Driven Design
  • Redis Basic

    Redis 특징
  • Effective Java Ch12. 직렬화

    Chap 12. 직렬화
  • Effective Java Ch11. 동시성

    Chap11. 동시성
  • Rabbit MQ 와 Application 아키텍처

    AMQP 와 Rabbit MQ
  • Spring Document

    Spring API Documentation
  • Kafka Test

    개요
  • Kotlin 애노테이션과 리플렉션

    애노테이션과 리플렉션 어떤 함수를 호출하기 위해서는 그 함수가 정의된 클래스의 이름과 함수 이름, 파라미터 이름 등을 알아야한다. Annotation과 Reflection을 사용하면 그런 제약을 벗어나서 미리 알지 못하는 임의의 클래스를 다룰 수 있다. Annotation을 사용하면 라이브러리가 요구하는 의미를 클래스에게 부여할 수 있다 Reflection을 사용하면 실행 시점에 컴파일러 내부 구조를 분석할 수 있다. 코틀린에서 Annotation을 사용하는 방법은 자바와 똑같지만 Annotation을 선언할 때 사용하는 문법은 자바와 약간 다르다. Reflection 역시 일반 구조는 자바와 같지만 세부 사항에는 약간의 차이가 있다.
  • Kotlin 제니릭

    제네릭 타입 파라미터 제네릭 타입의 인스턴스를 만들기 위해서는 타입 파라미터를 구체적인 타입 인자(Type Argument)로 치환해야 한다. List 타입이 있다고 했을 때, 명확하게 문자열을 담는 리스트 List<String> Map 타입은 제네릭 타입변수로 Map<K, V>형태로 선언이 되어 있고, 이를 인스턴스화 할때 Map<String, Person>처럼 구체적인 타입 인자를 넘겨 인스턴스화 할수 있다. 코틀린 컴파일러의 경우, 보통 타입과 마찬가지로 타입 인자도 추론이 가능하다 val authors = listOf("John", "Sveltna") 빈 리스트의 경우, 추론할 값이 없기 때문에 직접 타입을 명시 해줘야 한다. val authors: List<String> = emptyList(); val authors = emptyList<String>(); 제네릭 함수를 호출할 때는 반드시 구체 타입으로 타입 인자를 넘겨줘야 한다. 아래 List의 slice 확장 함수를 예로 들면, 타입 파라미터 T가 수신객체와 반환 타입으로 사용된다. 타입 추론이 가능한 구체 타입으로 사용 시, 별도로 제네릭 지정이 불필요하다. public fun <T> List<T>.slice(indices: IntRange): List<T> 타입 파라미터 선언은 클래스, 인터페이스, 클래스/인터페이스의 메소드, 확장 함수, 최상위 함수에서 선언이 가능하다. 코틀린에서는 아래와 같이 제네릭 확장 프로퍼티 선언이 가능하다. 확장 프로퍼티에 대해서만 가능하며 일반 프로퍼티는 타입 파라미터를 가질 수 없다. val <T> List<T>.penultimate: T get() = this[size - 2] 자바와 마찬가지로 제네릭 클래스를 확장/구현하기 위해서는 하위 클래스에서 기저 클래스의 구체 타입을 명시하거나 혹은 타입 파라미터로 받은 타입을 넘겨줘야 확장/구현이 가능하다. class StringList: List<String> { ... } class ArrayList<T>: List<T> { ... } 타입 파리미터는 사용할 수 있는 타입을 제한할 수 있다. 타입 파라미터에 대한 상한(upper-bound) 을 지정한다고 표현하며 제네릭 타입을 인스턴스화 하는 시점에는 상한 타입이거나 혹은 상한 타입의 하위 타입만 가능하게 된다. 상한을 지정하게 되면 해당 타입의 값은 상한 타입으로 취급이 가능하게 된다. fun <T : Number> List<T>.sum(): T // Kotlin ```java T sum(List list) // Java ``` 두 인자값 중 큰 값을 찾는 제네릭 함수를 만든다고 할때, Comparable 인터페이스를 활용하여 코드를 작성한다고 해보자. ```kotlin fun <T: Comparable> max(first: T, second: T): T { // 코틀린 컴파일러에 의해 first.compareTo(second) > 0으로 변한다. return if (first > second) first else second }
  • Kotlin 람다와 고차함수

    람다