Kotlin (42) 썸네일형 리스트형 공식 문서로 배우는 코틀린 - 34. Type-safe builders 서른네 번째, 타입 안전한 빌더입니다. 수신자를 가진 함수 리터럴과 결합된 이름이 잘 지어진 함수를 빌더로서 사용함으로써, Kotlin에서는 타입 안전한, 정적 타입 빌더를 만들 수 있습니다. ※ 타입 안전한(type-safe)이라는 말은 정적 타입 확인을 통해 타입이 안 맞아서 생기는 문제에 대해서 안전하다는 뜻입니다. 빌더(builder)는 무언가를 만들어 내는 것을 말합니다. 보통, 빌더 패턴이라고 하여 복잡한 객체를 만드는 과정을 단계별로 분리하여 만들어 내는 방식의 패턴이 있는데, 그 일을 하는 걸 해당 패턴에서는 (말 그대로) 빌더라고 부릅니다. 여기서도, 뭔가를 만들어 내는 것인데, 특히 복잡한 데이터 구조를 만드는데 쓰면 좋다는 식으로 빌더를 생각해도 좋고, Kotlin에서 빌더 패터의 활.. 공식 문서로 배우는 코틀린 - 33. Operator overloading 서른세 번째, 연산자 오버로딩입니다. Kotlin은 타입들에 대해 미리 정의된 연산자를 맞춤화(custom)하는 것을 허용합니다. 이러한 연산자는 미리 정의된 기호(예, +, *)와 우선 순위를 가지고 있습니다. 연산자를 구현하기 위해서는 해당 타입에 맞는 특별한 이름을 갖는 멤버 함수나 확장 함수를 만들어야 합니다. 이 타입은 이항 연산의 경우에는 왼쪽 부분의 타입이 되며 단항 연산에서는 인수 타입이 됩니다. 즉, 이항 연산의 오버로딩의 경우에는 앞쪽 타입에 적용할 수 있는 구현이어야 하고, 단항 연산에서는 연산자의 인수(예를 들어, -a의 경우 a가 인수) 타입에 적용할 수 있는 구현이어야 합니다. 연산자를 오버로딩하기 위해서는 해당 함수에 operator 수정자를 추가합니다. interface In.. 공식 문서로 배우는 코틀린 - 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의 수.. 이전 1 2 3 4 5 6 다음