본문 바로가기

전체 글

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 - Object 표현과 정의 간혹 어떤 클래스를 살짝 변경해서 사용하고 싶은데 사용범위가 넓지 않아서 새로운 타입을 정의하기는 부담스러운 경우들이 있다. Kotlin은 object표현식과 object 정의를 통해 이러한 상황들을 지원한다. Object 표현 (Object expressions) Object 표현은 명시적으로 class로 정의하지 않은 익명 클래스의 객체를 생성한다. 익명클래스는 일회용으로 사용하는 경우 적합하며, 기존 클래스를 상속하거나 인터페이스를 구현 할수도 있다. 익명 클래스의 인스턴스는 익명 객체로도 부르기도 한다. 기본 익명 객체 생성하기 Object 표현은 object 키워드로 시작한다. 상위타입이 없다면, 멤버들을 object 이후에 나오는 괄호({ }) 안에 작성 하는 것으로 생성 할 수 있다. val.. 더보기
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)이고, 정체성 없이 값의 .. 더보기