본문 바로가기

Kotlin

(42)
공식 문서로 배우는 코틀린 - 26. Object expressions and declarations 스물여섯 번째, 객체 표현식과 선언입니다. 때때로, 명시적인 새로운 하위 클래스 선언 없이, 특정 클래스를 살짝 변경한 객체 생성이 필요할 때 있습니다. 코틀린에서는 이런 경우 객체 표현식과 객체 선언을 사용할 수 있습니다. 객체 표현식 객체 표현식은 class 키워드를 사용하여 명시적으로 선언되 않은 익명 클래스의 객체를 만듭니다. 이러한 클래스는 일회용일때 유용합니다. 이러한 클래스는 맨 처음부터, 또는 다른 클래스를 상속 받거나 인터페이스를 구현하여 정의할 수 있습니다. 익명 클래스의 인스턴스는 이름이 아니라 표현식으로 정의되기 때문에, 익명 객체(anonymous objects)라고도 불립니다. 맨 처음부터(from scratch) 익명 객체 만들기 객체 표현식은 object 키워드로 시작합니다...
공식 문서로 배우는 코틀린 - 25. Inline value classes 스물다섯 번째, 인라인 클래스입니다. 때때로, 보다 도메인에 특화된 타입을 만들기 위해 값을 클래스로 감싸는(wrap) 것은 유용합니다. 하지만, 래퍼 클래스를 사용하면 추가적인 힙 메모리 할당이 필요하기 때문에 실행시간 오버헤드가 생깁니다. 게다가, 만약에 감싸는 대상이 원시 타입이라면 성능이 상당히 저하됩니다. 왜냐하며, 원시 타입은 보통 실행 시간에 많은 최적화가 행해지는 반면, 래퍼 클래스에 대해서는 어떤 특별한 처리도 수행되지 않기 때문입니다. 이러한 문제를 해결하기 위해, Kotlin은 인라인 클래스(inline class)라고 불리는 특별한 종류의 클래스를 도입했습니다. 인라인 클래스는 값 기반 클래스(value-based classes)의 하위 집합입니다. 인라인 클래스는 클래스로서의 정체..
공식 문서로 배우는 코틀린 - 24. Enum classes 스물네 번째, enum 클래스입니다. enum 클래스의 가장 기본적인 사용 사례는 타입에 안전한 열거형을 구현하는 것입니다. enum class Direction { NORTH, SOUTH, WEST, EAST } 각각의 enum 상수는 객체입니다. enum 상수는 콤마로 구분합니다. 각각의 enum은 enum 클래스의 인스턴스이며, 다음과 같이 초기화할 수 있습니다. enum class Color(val rgb: Int) { RED(0xFF0000), GREEN(0x00FF00), BLUE(0x0000FF) } 익명 클래스 enum 상수는 각각 자신의 메소드가 있는 익명 클래스를 가질 수 있습니다. 그리고, 기본 메소드를 오버라이딩 할 수도 있습니다. enum class ProtocolState { W..
공식 문서로 배우는 코틀린 - 23. Nested and inner classes 스물세 번째, 중첩과 내부 클래스입니다. 클래스는 다른 클래스에 중첩될 수 있습니다. class Outer { private val bar: Int = 1 class Nested { fun foo() = 2 } } val demo = Outer.Nested().foo() // == 2 인터페이스도 중첩할 수 있습니다. 클래스와 인터페이스의 모든 조합이 가능합니다. 즉, 클래스에 인터페이스, 인터페이스에 클래스, 인터페이스에 인터페이스 모두 가능합니다. interface OuterInterface { class InnerClass interface InnerInterface } class OuterClass { class InnerClass interface InnerInterface } 내부 클래스 in..
공식 문서로 배우는 코틀린 - 22. Generics: in, out, where 스물두 번째, 제네릭입니다. Kotlin에서 클래스는 Java처럼 타입 매개변수(parameter)를 가질 수 있습니다. class Box(t: T) { var value = t } 이런 클래스를 인스턴스화 하기 위해서는 (단순히) 타입 인수(argument)를 제공합니다. val box: Box = Box(1) 하지만, 예를 들어 생성자의 인수 같은 것으로부터 타입 매개변수를 추론할 수 있다면, 타입 인수를 생략할 수 있습니다. // 1 은 정수이기 때문에 컴파일러는 Box임을 알 수 있습니다. val box = Box(1) 변성(variance) Java의 타입 시스템에서 가장 까다로운 부분중 하나는 와일드카드 타입입니다(참고, Java 제네릭 FAQ). Kotlin은 와일드 카드 타입이 없습니다. ..
공식 문서로 배우는 코틀린 - 21. Sealed classes and interfaces 스물한 번째, 봉인된 클래스와 인터페이스입니다. ※ sealed를 번역해서 봉인된 클래스라고도 하고 그냥 실드 클래스라고도 부르기도 합니다. 여기서는 "봉인된"으로 칭하도록 하겠습니다. 봉인된(sealed) 클래스와 인터페이스 클래스 계층 구조의 제어된 상속을 제공합니다. 봉인된 클래스의 모든 직접적인 하위 클래스(direct subclass)는 컴파일 시점에 알 수 있습니다. 어떤 하위 클래스도 봉인된 클래스가 정의된 모듈과 패키지 바깥에 나타날 수 없습니다. 같은 로직이 봉인된 인터페이스와 그 구현에도 적용됩니다. 일단 한 번 봉인된 인터페이스를 포함하는 모듈이 컴파일되고 나면 더 이상 새로운 구현은 생성할 수 없습니다. 직접적인 하위 클래스(direct subclasses)는 수퍼클래스로 부터 바로..
공식 문서로 배우는 코틀린 - 20. Data classes 스무번 째, 데이터 클래스입니다. ※ 데이터 클래스는 DTO, JPA의 Entity 등과 같이 데이터를 다룰 때 사용하는 클래스를 위한 것입니다. Java(16 이전)에서는 Lombok 같은 별도의 라이브러리를 통해서 기본적으로 필요한 메소드들을 추가했다면, Kotlin은 아예 언어 차원에서 다양한 기능성 메소드들을 추가해 주는 데이터 (전용) 클래스를 제공합니다. 성격상 매우 자주 사용될 수 밖에 없으므로 전체적인 내용에 대해서 정확히 이해하고 기억하면 좋습니다. ※ Java의 경우 14에서 프리뷰로 추가됐고, 16에서 정식 채택된 레코드(record) 클래스가 Kotlin의 데이터 클래스에 해당합니다. Kotlin의 데이터 클래스는 주로 데이터를 담는데 사용합니다. 각각의 데이터 클래스를 위해서 컴파..
공식 문서로 배우는 코틀린 - 19. Extensions 열아홉 번째, 확장입니다. Kotlin에서는 상속을 받거나 데코레이터 패턴 같은 디자인 패턴을 사용하지 않고도 새로운 기능으로 클래스나 인터페이스를 확장할 수 있습니다. 이는 확장(extensions)이라고 불리는 특별한 선언을 통해서 가능합니다. 예를 들어, 수정할 수 없는 써드 파티 라이브러리의 클래스나 인터페이스에 새로운 함수를 작성할 수 있습니다. 이러한 함수는 마치 원래 클래스의 멤버였던 것처럼 일반적인 방법으로 호출할 수 있습니다. 이러한 메커니즘은 확장 함수라고 부릅니다. 또한, 기존의 클래스에 새로운 프로퍼티를 정의하는 확장 프로퍼티도 있습니다. 확장 함수 확장함수를 정의할 때는 이름 앞에 확장될 타입을 나타내는 수신자 타입(receiver type)을 붙입니다. 다음은 MutableLis..