프로퍼티 위임 클래스 위임과 비슷하게 프로퍼티의 값 설정(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..
프로퍼티 자바에서는 필드의 개념으로 접근하지만 코틀린에서는 프로퍼티 개념으로 사용한다. 프로퍼티 = 필드 + 접근자 코틀린에서 접근자를 명시하지 않을경우 자동으로 생성해준다. class Person { val name = "park jin" var age = 31 var isMarried = false } fun main() { val person = Person() println("person name is ${person.name}") println("person age is ${person.age}") println("person is married ${person.isMarried}") } 커스텀 접근자 접근자에서 계산과 같은 동작을 해야한다면 직접 작성 가능하다. var [ : 타입] [= ] ..
발단 오브젝트가 함수형 인터페이스면 접두어로 인터페이스 파입을 가진 람다를 생성할 수 있다하여 따라해봄. @FunctionalInterface interface FunctionalInterface { fun apply() } fun main() { val f = FunctionalInterface { println() } // error?? } 그런데 생성이 안되고 에러가 발생함.. 뭐지?? 함수형 인터페이스를 잘못 선언했나 해서 기존에 있는 클래스를 가지고 다시 시도해봄. fun main() { val r = Runnable { println("run!") } r.run() // run! } 이건 잘됨;;; 뭐지?? 그래서 Runnable을 코틀린으로 가져와 다시 시도해봄 @FunctionalInter..
중첩 클래스 클래스 안에 또 다른 클래스를 중첩해서 사용할 수 있다. 중첩된 클래스는 외부 클래스의 멤버를 접근할 수 없다. 자바의 정적 중첩 클래스와 느낌이 비슷하다...? class Outer { private val outerMember = 10 fun outerFunc() = println("outer function call!!") class Nested { // 외부 클래스 접근 불가 // pinrtln(outerMember) // outerFunc() fun nestedFunc() = print("nested function call!!") } } fun main() { // 자바의 중첩 스태틱 클래스와 같다 Outer.Nested().nestedFunc() // nested function..