본문 바로가기

분류 전체보기

(67)
공식 문서로 배우는 코틀린 - 40. Destructuring declarations 마흔 번째, 구조 분해 선언입니다. 때때로 객체를 구조 분해하여 얼마간의 변수에 할당하는 것은 편리합니다. 예를 들면 다음과 같습니다. val (name, age) = person 이러한 구문을 구조 분해 선언(destructuring declaration)이라고 합니다. 구조 분해 선언은 한 번에 복수의 변수를 만듭니다. 위와 같이 하면, name, age 두 개의 변수가 선언되고, 각각을 독립적으로 사용할 수 있습니다. println(name) println(age) 구조 분해 선언은 다음과 같은 코드로 컴파일 됩니다. val name = person.component1() val age = person.component2() component1()과 component2() 함수는 Kotlin에서 폭..
공식 문서로 배우는 코틀린 - 39. Annotations 서른아홉 번째, 어노테이션입니다. 어노테이션은 코드에 메타데이터를 추가하는 방법입니다. 어노테이션을 선언하기 위해서는 클래스 앞에 annotation 수정자를 붙입니다. annotation class Fancy 어노테이션의 추가적인 속성은 다음과 같은 메타 어노테이션을 정의하는 어노테이션에 추가하는 방식으로 지정할 수 있습니다. @Target : 어노테이션이 붙을 수 있는 (클래스, 함수, 프로퍼티, 표현식 같은) 대상의 종류를 지정합니다 @Retention : 어노테이션은 컴파일된 클래스 파일 안에 저장되는지 여부와 실행 시간에 리플렉션을 불 수 있는지 여부를 지정합니다(기본 값은 둘 다 true입니다). @Repeatable : 하나의 대상에 여러 번 사용할 수 있게 해 줍니다. @MustBeDocu..
공식 문서로 배우는 코틀린 - 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..