본문 바로가기

분류 전체보기

(67)
공식 문서로 배우는 코틀린 - 32. Inline functions 서른두 번째, 인라인 함수입니다. ※ 인라인 함수는 간단히 얘기하면, 함수가 호출되는 지점에 함수 객체의 참조를 가지고 호출하는 것이 아니라 해당 함수가 실행하는 실제 코드로 대체하는 것을 말합니다. 코드의 '추가', '적용' 등등의 표현되신 영어 그대로 읽는 것이기는 하지만 혼동이 없게 '인라인화하다', '인라인하면' 등으로 표현하도록 하겠습니다. 고차 함수의 사용은 특정한 실행 시간 불이익을 가져옵니다. 각각의 함수는 객체이며, 각 함수는 클로저를 갖습니다(capture). 클로저는 함수 몸체에서 접근할 수 있는 변수들의 유효 범위(scope)입니다. (함수 객체나 클래스 모두를 위한) 메모리 할당과 가상 호출은 실행 시간 오버헤드를 가져옵니다. 하지만, 이런 종류의 오버헤드는 많은 경우 람다 표현식..
공식 문서로 배우는 코틀린 - 31. Higher-order functions and lambdas 서른한 번째, 고차 함수와 람다입니다. Kotlin의 함수는 일급(first-class)입니다. 이 말은 함수가 변수와 데이터 구조에 저장될 수 있고, 다른 고차 함수에 인수로 전달 되거나 그로부터 반환될 수 있다는 의미입니다. 함수가 아닌 값들에 가능한 연산은 함수에도 모두 가능합니다. 이를 위해 Kotlin은 정적 타입 프로그래밍 언어로서 함수를 표현하기 위한 함수 타입 패밀리를 사용하고 람다 표현식 같은 특별한 언어 구조 집합을 제공합니다. 고차 함수 (Higher-order functions)고차 함수는 매개변수로 함수를 갖거나 함수를 반환하는 함수입니다. 고차 함수의 좋은 예는 컬렉션을 위한 함수형 프로그래밍에서의 관용구 fold입니다. fold는 초기 누산기 값(accumula..
공식 문서로 배우는 코틀린 - 30. Functions 서른 번째, 함수입니다. Kotlin 함수는 fun 키워드를 사용하여 선언합니다. fun double(x: Int): Int { return 2 * x } 함수 사용법 함수는 표준적인 접근 방법으로 호출됩니다. val result = double(2) 멤버 함수는 마침표 표기법(dot notation)을 사용합니다. Stream().read() // Stream 클래스의 인스턴스를 생성하고 read() 호출 ※ (익히 알고 있는 것처럼) 클래스나 객체 멤버에 속한 함수는 멤버 함수나 메소드로 불립니다. 이 연재 전체에 걸쳐서 이 용어들은 혼용되고 있습니다. 매개변수 함수의 매개변수는 파스칼 표기법 - 이름: 타입으로 정의됩니다. 매개변수는 콤마로 구분되고, 각각은 명시적으로 타입이 지정돼야 합니다. fu..
공식 문서로 배우는 코틀린 - 29. Type aliases 스물아홉 번째, 타입 별칭입니다. 타입 별칭(type aliases)은 기존 타입에 대안이 되는 이름을 제공합니다. 타입 이름이 너무 긴 경우, 새롭게 짧은 이름을 추가하고 이를 대신 사용할 수 있습니다. 타입 별칭은 특히 긴 제네릭 타입을 줄일때 유용합니다. 예를 들어, 때때로 컬렉션 타입을 줄이고 싶은 유혹이 들 때가 있습니다. typealias NodeSet = Set typealias FileTable = MutableMap 함수 타입을 위해서 사용할 수도 있습니다. typealias MyHandler = (Int, String, Any) -> Unit typealias Predicate = (T) -> Boolean 내부나 중첩 클래스에 새 이름을 부여할 수도 있습니다. class A { inn..
공식 문서로 배우는 코틀린 - 28. Delegated properties 스물여덟 번째, 위임 프로퍼티입니다. 본 연재에서는 다음과 같이 용어를 사용합니다. - 위임 프로퍼티(delegated property): 대리자(delegate)에 접근자 기능을 위임한 프로퍼티. (누구에게) '위임된 프로퍼티'라고도 할 수 있으나 일반적으로 위임 프로퍼티로 많이 사용하고 있어 '된'을 붙이지 않았습니다. - 대리자(명사 delegate): 권한을 위임 받아 대행하는 대상 - 위임하다(동사 delegate): 말 그대로 접근자 기능을 위임한다는 뜻 원문을 보면 delegated로 명사를 수식할 때, 대부분 명사가 다른쪽으로 위임된 것을 표현하지만, 간혹 위임을 받아 대리 수행하는 대상 명사에도 사용하는 경우가 있습니다. 원문을 보시는 경우에는 (약간의) 주의가 필요합니다. 일부 공통적인..
공식 문서로 배우는 코틀린 - 27. Delegation 스물일곱 번째, 위임입니다. 위임 패턴은 구현 상속의 좋은 대안이라는 것이 입증돼 왔습니다. Kotlin은 이를 위한 기본적인 코드(bolierplate code) 없이 언어 차원에서 위임을 지원합니다. 클래스 Derived는 인터페이스 Base의 모든 public 멤버를 특정 객체에게 위임하는 방식으로 구현할 수 있습니다. interface Base { fun print() } class BaseImpl(val x: Int) : Base { override fun print() { print(x) } } class Derived(b: Base) : Base by b fun main() { val b = BaseImpl(10) Derived(b).print() } /* 결과 10 */ Derived의 수..
공식 문서로 배우는 코틀린 - 26. Object expressions and declarations 스물여섯 번째, 객체 표현식과 선언입니다. 때때로, 명시적인 새로운 하위 클래스 선언 없이, 특정 클래스를 살짝 변경한 객체 생성이 필요할 때 있습니다. 코틀린에서는 이런 경우 객체 표현식과 객체 선언을 사용할 수 있습니다. 객체 표현식 객체 표현식은 class 키워드를 사용하여 명시적으로 선언되 않은 익명 클래스의 객체를 만듭니다. 이러한 클래스는 일회용일때 유용합니다. 이러한 클래스는 맨 처음부터, 또는 다른 클래스를 상속 받거나 인터페이스를 구현하여 정의할 수 있습니다. 익명 클래스의 인스턴스는 이름이 아니라 표현식으로 정의되기 때문에, 익명 객체(anonymous objects)라고도 불립니다. 맨 처음부터(from scratch) 익명 객체 만들기 객체 표현식은 object 키워드로 시작합니다...
공식 문서로 배우는 코틀린 - 25. Inline value classes 스물다섯 번째, 인라인 클래스입니다. 때때로, 보다 도메인에 특화된 타입을 만들기 위해 값을 클래스로 감싸는(wrap) 것은 유용합니다. 하지만, 래퍼 클래스를 사용하면 추가적인 힙 메모리 할당이 필요하기 때문에 실행시간 오버헤드가 생깁니다. 게다가, 만약에 감싸는 대상이 원시 타입이라면 성능이 상당히 저하됩니다. 왜냐하며, 원시 타입은 보통 실행 시간에 많은 최적화가 행해지는 반면, 래퍼 클래스에 대해서는 어떤 특별한 처리도 수행되지 않기 때문입니다. 이러한 문제를 해결하기 위해, Kotlin은 인라인 클래스(inline class)라고 불리는 특별한 종류의 클래스를 도입했습니다. 인라인 클래스는 값 기반 클래스(value-based classes)의 하위 집합입니다. 인라인 클래스는 클래스로서의 정체..