본문 바로가기

분류 전체보기

(67)
공식 문서로 배우는 코틀린 - 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..
공식 문서로 배우는 코틀린 - 18. Visibility modifiers 열여덟 번째, 가시성 수정자입니다. 클래스, 객체, 인터페이스, 생성자, 함수, 프로퍼티와 해당 세터 모두는 가시성 수정자(visibility modifier)를 가질 수 있습니다. Kotlin에는 다음과 같은 네 개의 가시성 수정자가 있습니다. private protected internal public 기본 가시성은 public입니다. 여기서는 범위(scope) 유형에 따라 수정자가 어떻게 다르게 적용되는지 알아 보겠습니다. 패키지 함수, 프로퍼티, 클래스, 객체, 인터페이스는 패키지안의 최상위 수준(top-level)에 직접적으로 선언될 수 있습니다. // file name: example.kt package foo fun baz() { ... } class Bar { ... } 가시성 수정자를 사..
공식 문서로 배우는 코틀린 - 17. Functional (SAM) interfaces 열일곱 번째, 함수형 인터페이스입니다. 단지 하나의 추상 메소드만을 갖는 인터페이스를 함수형 인터페이스(functional interface), 또는 단일 추상 메소드(Single Abstract Method, SAM)라고 부릅니다. 함수형 인터페이스는 다수의 추상적이지 않은 멤버를 가질 수 있지만, 추상 멤버는 단 하나입니다. Kotlin에서 함수형 인터페이스를 선언할 때는 fun 수정자를 사용합니다. fun interface KRunnable { fun invoke() } SAM 변환(conversion) 함수형 인터페이스를 위해 SAM 변환을 사용할 수 있습니다. SAM 변환은 람다 표현식을 사용하여 코드를 보다 간결하고 가독성 있게 만들어 줍니다. 함수형 인터페이스를 구현하는 클래스를 직접 만드는..