개발 환경 Intelli J java 8 kotlin 1.2.71 mysql spring boot 2.1 spring data jpa gradle 설정 Intelli J 최신버전으로 유지해줘야 원활한 개발이 가능합니다. (사용 버전: 2019.1.3) Intelli J 코틀린 플러그인 설치 https://plugins.jetbrains.com/plugin/6954-kotlin/ Kotlin - Plugins | JetBrains The Kotlin plugin provides language support in IntelliJ IDEA and Android Studio. plugins.jetbrains.com 코틀린 프로젝트 생성 Intelli J → File → New Project → Spring I..
람다 표현 람다식은 항상 중괄호로 감싼다. 파라미터 -> 몸체 형식으로 선언한다. 인자는 형식 추론이 가능하면 생략 가능하다. 바로 실행시 run을 사용한다. fun main () { val f: () -> String = { "hello lambda" } println(f()) // hello lambda run { println("hello lambda") } // hello lambda } 람다 사용 규칙 함수의 맨마지막이 람다면 ()안에서 빼내어 사용 가능하다. 인자가 하나라면 람다식 내부에서 it키워드로 대체해서 사용가능하다. 인자가 하나이면서 인자 타입이 람다라면 ()를 생략 가능하다. fun calculator(a: Int, b: Int, f: (a: Int, b:Int) -> Int) = ..
함수 선언 fun키워드를 이용해 선언한다. fun printAll(list: List) { for (e in list) { println(e) } } 기본 인자 함수의 파라미터는 기본 인자를 가질수 있으며 생략시 기본인자를 가진다. (오버로딩을 줄일수 있음) fun join(list: List, join: String = "_"): String { return list.joinToString(join) } fun main() { println(join(listOf("park", "jin"))) // park_jin println(join(listOf("park", "jin"), "~")) // park~jin } 기본 인자를 갖는 메서드를 오버라이드 할때는 기본인자를 생략해 주어야만 한다. open cl..
프로퍼티 위임 클래스 위임과 비슷하게 프로퍼티의 값 설정(set)/가져오기(get)에서 위임을 사용할 수 있다. 읽기 전용(val)일 경우에는 getValue()만 읽기/쓰기(var)가 가능할 경우 getValue()/setValue()를 구현한다. by키워드를 이용하여 위임할 객체를 프로퍼티 뒤에 명시한다. import kotlin.reflect.KProperty class PropertyDelegate(var value: String) { operator fun getValue(thisRef: Any?, property: KProperty): String { println("${property.name} get value ${this.value}") return value } operator fun ..
상속의 문제점 상위 클래스와 하위 클래스의 결합도가 높아져 상위 클래스의 변화가 하위 클래스에 주는 영향을 예측하기 어렵다. 불필요한 상위 클래스의 메서드까지 구현해야 한다. 하위 클래스로 내려갈수록 기능이 더해져 파악하기 어렵다. final클래스의 경우 상속이 불가능하다. 상속의 대안 위임 특정 처리를 다른 객체에게 넘기는 것을 의미한다. 다른 객체는 클래스 내부(포함)에 가지고 있는다. 코틀린 에서는 by키워드로 클래스 위임을 만들 수 있다. interface Attackable { fun attack() } class Knife: Attackable { override fun attack() { println("attack with knife") } } class Gun: Attackable { o..
Enum 자바와 같이 Enum클래스를 사용할 수 있음. 일반 클래스와 같이 프로퍼티 및 생성자를 선언할 수 있다. 프로퍼티와 함수를 구분하기 위해 세미콜론을 사용한다. enum class ActiveType(val value: String) { ACTIVE("Y"), INACTIVE("N"); // semicolon fun activeTypeToBoolean() = this == ACTIVE companion object { fun booleanToActiveType(isActive: Boolean) = if (isActive) ACTIVE else INACTIVE } } fun main() { println("status is ${ActiveType.ACTIVE}") // status is ACTIVE..