본문 바로가기

코틀린

Kotlin - Inline functions https://kotlinlang.org/docs/inline-functions.html Inline functions | Kotlin kotlinlang.org 고차함수를 사용하면 모든 함수가 개별 객체로 생성되고, 클로저가 발생하는 등의 런타임시의 단점들이 발생한다. 이는 람다 표현식을 인라인 (컴파일시에 함수 호출 코드를 함수 본문으로 대체하는 방법)으로 해결 할 수 있다. inline fun lock(lock: Lock, body: () -> T): T { ... } 인라인 함수는 아래 처럼 함수에 "inline" 수정자를 붙이면 되고, 컴파일 시 inline함수를 호출하는 모든곳에 함수 본문이 인라인 된다. 인라인 대상은 인라인 함수 본문 뿐만 아니라 매개변수로 전달되는 람다식 마저 인라인 한다.. 더보기
Kotlin - 고차함수와 람다식 (Higher-order functions and lambdas) https://kotlinlang.org/docs/lambdas.html 코틀린 함수는 일급 함수이기 때문에 함수 내부에 변수나 데이터 구조를 저장할 수 있고, 함수를 인자로 전달하거나 다른 고차 함수를 통해 반환 값이 될 수 있다. 람다 표현식을 통해 이를 편하게 사용 할 수 있다. 고차함수 (Higher-order functions) 고차 함수는 함수를 리턴하거나 함수를 파라미터로 받는 함수를 말한다. 좋은 예로 함수형 프로그래밍에서 주로 사용하는 fold 함수가 있다. 이 함수는 초기값과 결합 함수를 파라미터로 받아서 모든 원소에 대해 결합함수를 수행한다. fun Collection.fold( initial: R, combine: (acc: R, nextElement: T) -> R // 함수를 파.. 더보기
Kotlin - 함수 (Functions) https://kotlinlang.org/docs/functions.html Functions | Kotlin kotlinlang.org 코틀린 함수는 fun 키워드를 이용해서 선언한다. fun double(x: Int): Int { return 2 * x } 사용법 (Function usage) // 기본 사용법 val result = double(2) // 점(.)을 이용해서 멤버 함수를 사용 Stream().read() 파라미터 함수의 파라미터는 파스칼 작성법 (이름: 타입)으로 작성한다. 파라미터는 콤마로 구분하며 각 파라미터는 반드시 타입이 명시 되어야 한다. trailing 콤마 (마지막 파라미터에 붙는 콤마)가 사용 가능 하다. fun powerOf( number: Int, exponent:.. 더보기
Kotlin - 타입 별칭 (Type aliases) 타입 별칭은 말 그대로 원래 존재하는 타입에 또다른 이름을 제공한다. 타입 이름이 너무 긴 경우 짧은 대체 이름을 설정해서 사용 할 수 있다. 특히 아래와 같이 제네릭 타입을 간결하게 표현 할 수 있다. typealias NodeSet = Set typealias FileTable = MutableMap 함수에도 적용 할 수 있다. typealias MyHandler = (Int, String, Any) -> Unit typealias Predicate = (T) -> Boolean 내부 클래스나 중첩 클래스에도 적용 가능하다. class AForTypeAlias { inner class Inner } class BForTypeAlias { class Inner } typealias AInner = AF.. 더보기
Kotlin - Delegated properties 아래와 같은 몇가지 종류의 속성들은 필요할 때 마다 매번 구현 하는 것 보다 한번 구현해서 라이브러리에 추가하고 필요할 때 마다 재 사용하는 것이 편하다. Lazy 속성: 속성에 처음 접근할때 그 값이 계산된다. Observable 속성: 이 속성 값이 변경되면 리스너들이 벼녀경 내용에 대해 알게 된다. 개별 필드에 저장하지 않고 map 에 저장하는 경우 이런 경우들을 위해 Kotlin에서는 delegated 속성을 지원한다. class Example { var P: String by Delegate() } “val/var : by ” 형태로 작성한다. 표현식은 위임받는 클래스로 어떤 인터페이스를 구현해야하지는 않지만 get() 역할을 하는 getValue() 함수를 꼭 제공해야한다. (var 변수인 경.. 더보기
Kotlin - Deligation Delegation(위임) 패턴은 상속의 대안으로 적합하다고 증명되었고, Kotlin 은 별다른 코드 필요없이 이를 지원한다. 아래 예에서 DerivedClass는 특정 객체를 위임 함으로서 BaseInterface를 구현할 수 있다. by 절을 이용해서 b가 DerivedClass 내부에 저장 되고 컴파일러는 BaseInterface의 모든 메소드를 b를 바라보는 방법으로 생성하게 된다. interface BaseInterface { fun print() } class BaseImpl(val x: Int) : BaseInterface { override fun print() { print(x) } } class DerivedClass(b: BaseInterface) : BaseInterface by b.. 더보기
Kotlin - 인라인 값 클래스 (inline value classes) https://kotlinlang.org/docs/inline-classes.html Inline value classes | Kotlin kotlinlang.org 종종 어떤 값을 도메인 특화된 타입의 클래스로 감싸는 것이 효율 적인 경우들이 있다(wrapper class 처럼). 하지만 힙 메모리의 오버헤드가 발생 하고, 감싸는 값이 원시타입(primitive) 인 경우에는 특별히 더 비효율적이다. 왜냐하면 primitive 타입은 런타임 시에 강하게 최적화 되지만 래퍼 클래스는 그렇지 못하기 때문이다. 이러한 문제를 해결하기 위해서 코틀린은 inline class 라는 특별한 클래스 기능을 제공한다. inline 클래스는 값 기반 클래스(value-based classes)이고, 정체성 없이 값의 .. 더보기
Kotlin - 인터페이스 (Interface) https://kotlinlang.org/docs/interfaces.html Interfaces | Kotlin kotlinlang.org Kotlin 에서 인터페이스는 추상 메소드와 구현된 메소드를 모두 가질 수 있다. 상태를 저장 할 수 없다는 점이 추상 클래스(abstract)와 다르다. 인터페이스가 속성을 가질 수는 있지만 속성이 추상화 되어 있거나, 접근자(accessor)를 구현 해야 한다. 선언 과 구현 인터페이스는 interface 키워드를 이용해서 정의하고 클래스에서는 하나 이상의 인터페이스를 구현 할 수 있다. interface MyInterface { fun bar() fun foo() { // body } } class Child: MyInterface { override fun .. 더보기