본문 바로가기

분류 전체보기

(81)
공식 문서로 배우는 코틀린 - 38. This expressions 서른여덟 번째, this 표현식입니다. 현재 수신자를 나타내기 위해서 this 표현식을 사용할 수 있습니다. 클래스의 멤버에서 this는 클래스의 현재 객체를 나타냅니다. 확장 함수나 수신자가 있는 함수 리터럴에서 this는 마침표의 왼쪽 부분으로 지정되는 수신자 매개변수를 나타냅니다. this에 한정자(qualifier)가 없으면 가장 깊은 단계로 감싸고 있는 유효 범위(scope)를 나타냅니다. 다른 유효 범위(scope)의 this를 나타내개 위해서는 라벨 한정자를 사용합니다. 한정된 this (Qualified this) 바깥 범위(클래스나 확장 함수나 라벨이 있는 수신자 있는 함수 리터럴)의 this를 접근하기 위해서는 this@label 를 사용합니다. @label 부분은 this의 유효범위 ..
공식 문서로 배우는 코틀린 - 37. Equality 서른일곱 번째, 동등성입니다. Kotlin에는 두 가지 유형의 동등성이 있습니다. 구조적 동등성 ( == ) - equals() 함수를 사용한 검사 참조적 동등성( === ) - 두 개의 참조가 같은 객체를 가리키고 있는지 검사 동일성 vs 동등성 보통 두 대상이 같은지 비교하는 데는 참조적으로 같은 동일성과 구조적으로 같은 동등성을 얘기합니다. 이와 관련해서 동일성 쪽에는 identity를 동등성 쪽에는 equality라는 단어를 사용하는 경우가 국내 및 영어권에 많이 있습니다. 하지만, 보통 equality 한데 이게 어떤 식으로 equality 하냐고 정의하는 경우도 많습니다. 예를 들어 Java 언어 명세에 보면 == 연산자를 단순히 equality operator라고 있습니다. 이 걸 우리말로 ..
공식 문서로 배우는 코틀린 - 36. Null safety 서른여섯 번째, 널 안전성입니다. 널 안전성에서는 ALGOL W에서 널 참조 개념을 고안한 토니 호어가 (바로 아래 언급되는) 십억 달러의 실수라고도 언급한 문제를 언어 차원에서 해결하기 위한 Kotlin의 방법을 설명합니다. Java를 사용하다 Kotlin을 쓰게 됐을 때 처음에는 많은 불편을 느끼게 되는 부분이기도 합니다. 하지만, 좀 익숙해 지면 불편함은 사라지게 되고 NPE의 위험으로부터 벗어나서 좀 더 안전한 프로그램을 작성할 수 있음을 느끼게 됩니다. Kotlin 사용 초기에 반드시 익숙해져야 할 내용입니다. 널 가능한(nullable) 타입과 가능하지 않은(non-nullable) 타입 Kotlin의 타입 체계는 십억 달러의 실수라고도 알려져 있는 null 참조의 위험성을 제거하는 것을 목표..
공식 문서로 배우는 코틀린 - 35. Using builders with builder type inference 서른다섯 번째, 빌더 타입 추론과 함께 빌더 사용하기입니다. Kotlin은 빌더 타입 추론(또는 빌더 추론)을 지원하는데, 이는 제네릭 빌더와 함께 사용할 때 유용합니다. 빌더 추론은 람다 인수 안의 다른 호출에 대한 타입 정보에 기반하여 빌더 호출의 타입 인수를 추론할 수 있도록 컴파일러를 돕습니다. buildMap()의 사용 예를 살펴 보겠습니다. fun addEntryToMap(baseMap: Map, additionalEntry: Pair?) { val myMap = buildMap { putAll(baseMap) if (additionalEntry != null) { put(additionalEntry.first, additionalEntry.second) } } } 정규적인 방법으로 타입 인수..
공식 문서로 배우는 코틀린 - 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..