본문 바로가기

Kotlin

(43)
공식 문서로 배우는 코틀린 - 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 변환은 람다 표현식을 사용하여 코드를 보다 간결하고 가독성 있게 만들어 줍니다. 함수형 인터페이스를 구현하는 클래스를 직접 만드는..
공식 문서로 배우는 코틀린 - 16. Interfaces 열여섯 번째, 인터페이스입니다. 코틀린에서 인터페이스는 추상 메소드의 선언과 메소드의 구현을 모두 포함할 수 있습니다. 추상 클래스와 다른 점은 인터페이스는 상태(state)를 저장하지 못한다는 것입니다. 인터페이스는 프로퍼티를 가질 수는 있지만, 해당 프로퍼티는 추상적이거나 접근자 구현을 제공해야 합니다. 인터페이스는 interface라는 키워드를 가지고 정의합니다. interface MyInterface { fun bar() fun foo() { // optional body } } 인터페이스 구현 클래스나 객체는 하나 이상의 인터페이스를 구현할 수 있습니다. class Child : MyInterface { override fun bar() { // body } } 인터페이스의 프로퍼티 인터페이스에..
공식 문서로 배우는 코틀린 - 15. Properties 열다섯 번째, 프로퍼티입니다. 프로퍼티 선언Kotlin 클래스에서 프로퍼티는 var 키워드를 사용하요 가변되게 선언하거나, val 키워드를 사용하여 읽기 전용으로 선언할 수 있습니다.class Address { var name: String = "Holmes, Sherlock" var street: String = "Baker" var city: String = "London" var state: String? = null var zip: String = "123456"} 프로퍼티 사용은 단순히 해당 이름을 사용하면 됩니다.fun copyAddress(address: Address): Address { val result = Address() // 코틀린에는 new 키워드..
공식 문서로 배우는 코틀린 - 14. Inheritance 열네 번째, 상속입니다. Kotlin의 모든 클래스는 공통 수퍼 클래스로 Any를 가지고 있습니다. Any는 어떠한 수퍼 타입도 선언돼 있지 않은 클래스로 모든 클래스의 기본적인 수퍼 클래스입니다. class Example // 묵시적으로 Any를 상속 Any는 equals(), hashCode(), toString()이라는 3개의 메소드를 가지고 있습니다. 그러므로, Kotlin의 모든 클래스에 이 세가지의 메소드가 정의됩니다. 기본적으로 Kotlin 클래스들은 모두 final 이어서 상속 될 수 없습니다. 클래스를 상속 가능하게 하려면 open 키워드를 붙입니다. open class Base // 클래스가 상속을 위해 열린(open) 상태입니다. 상속하는 명시적 수퍼 타입을 선언하기 위해서는 클래스 ..