[TIL/Kotlin] 코틀린 고급문법_sealed 클래스, 위임된 프로퍼티, 클래스 위임
·
TIL/Kotlin
1. sealed 클래스 sealed 클래스는 자신의 중첩 클래스에만 상속을 허용하는 클래스이다. // Outer 클래스는 자신의 중첩 또는 내부 클래스에서만 상속이 가능하다. Outer 클래스 자체로는 인스턴스 생성 불가능 sealed class Outer { class One: Outer() class Two: Outer() class Three: Outer() } // Outer 클래스는 자신의 중첩 클래스에서만 상속이 가능하기 때문에 주석을 해제하면 오류 발생 // class Four: Outer() fun main() { val instance:Outer = Outer.Three() val test: Outer /* sealed 클래스는 서브클래스가 sealed 클래스 안에 모두 존재하므로, 모..
[TIL/Kotlin] 코틀린 고급문법_열거 클래스(Enum Class)와 열거 클래스에 프로퍼티와 멤버 함수 선언 및 활용하기
·
TIL/Kotlin
1. 열거 클래스(Enum Class) 클래스 선언문 앞에 enum 키워드를 붙이면 열거 클래스로 선언이 가능하다. 열거 클래스에 들어가는 식별자를 열거 상수라고 한다. 열거 클래스에 포함시킬 식별자를 쉼표를 이용해 나열하며, 식별자는 모두 대문자로 하는 것이 좋다. 열거 클래스.열거 상수 형태로 초기화 가능하다. enum class Mode { SELECTION, PEN, SHAPE, ERASER // 열거 상수 } fun main() { // 현재 선택된 모드 val mode: Mode = Mode.PEN when(mode) { Mode.SELECTION -> println("선택 모드") Mode.PEN -> println("펜 모드") Mode.SHAPE -> println("도형 모드") Mod..
[TIL/Kotlin] 코틀린 고급문법_반복자(Iterator)와 반복문 for문
·
TIL/Kotlin
1. 반복자(Iterator) 반복자란? 특정 구간 속에 있는 원소를 하나씩 반복적으로 꺼내기 위한 인터페이스를 뜻한다. 코틀린에는 Iterator라는 인터페이스가 기본적으로 선언되어 있으며, 다음과 같이 생겼다. interface Iterator { operator fun next(): T operator fun hasNext(): Boolean } 아래 예제를 통해 next와 hasNext 멤버 함수를 어떻게 사용하는지 살펴보자 fun main() { val range: IntRange = 1..3 // IntRange 클래스에는 operator fun iterator(): IntIterator 연산자 멤버 함수 선언되어있음 val iter: Iterator = range.iterator() // i..
[TIL/Kotlin] 코틀린 고급문법_in/out 키워드와 ..연산자와 범위 표현식
·
TIL/Kotlin
1. in/out 키워드 out 키워드를 붙이면 서브타입을 슈퍼타입에 대입 가능, in 키워드를 붙이면 슈퍼타입을 서브타입에 대입 가능, 타입 인수를 *로 지정하면 타입 인수가 무엇이든 상관없이 대입이 가능하다. // AAA 클래스의 타입 매개변수 앞에 out 키워드를 붙임 // out 키워드를 붙이면 AAA을 AAA에 대입할 수 있게 된다. // out T는 자바의 ?extends T와 같다. class AAA // BBB 클래스의 타입 매개변수 앞에 in 키워드를 붙임 // in 키워드를 붙이면 BBB을 BBB에 대입할 수 있게 된다. // in T는 자바의 ?super T와 같다. class BBB fun main() { val aaaSub = AAA() val aaaSuper: AAA = aaaS..
[TIL/Kotlin] 코틀린 고급문법_클래스와 인터페이스에서 제네릭 사용하기, 제네릭이 적용된 인터페이스/클래스 상속·구현하기, 특정 타입을 상속·구현하는 타입만 인수로 받기
·
TIL/Kotlin
1. 클래스와 인터페이스에서 제네릭 사용하기 클래스와 인터페이스에도 제네릭을 적용할 수 있다. 클래스나 인터페이스에서 타입을 인수로 받으려면 선언시 이름 옆에 를 붙인다. class Pair(val first: A, val second: B) { override fun toString() = "$first\n$second" } 제네릭이 적용된 클래스와 인터페이스에는 이름 옆에 를 붙여야 한다. 예제에서는 Int와 Double을 타입 인수로 지정했다. 생성자를 호출할 때도 생성자 이름 옆에 를 붙인다. 아래 예제에서는 생성자의 인수로부터 타입을 추론할 수 있어 생략이 가능하다. fun main() { val pair: Pair pair = Pair(15, 9.12) println(pair.toString(..
[TIL/Kotlin] 코틀린 고급문법_리시버가 붙은 함수리터럴, 제네릭(Generic), 여러 타입을 인수로 받기, 구체화된 타입 매개변수
·
TIL/Kotlin
1. 리시버가 붙은 함수 리터럴 함수 리터럴에 리시버를 적용하여 확장 함수처럼 만들 수 있다. 리시버가 붙은 함수 리터럴에는 리시버를 나타내는 this 키워드를 사용할 수 있다. 호출은 리시버.변수(인수) 형태로 호출한다. 일반 함수 타입으로 호출할 때는 리시버를 첫 번째 인수로 전달하면 된다. Int.(Int, Int) -> Int 타입은 (Int, Int, Int) -> Int 타입에 대입 fun main() { // Int 리시버를 [left, right] 범위 이내로 가공하여 반환하는 확장 함수 // Int.(left: Int, right: Int) 리시버 타입이 Int, 매개변수의 타입이 (Int, Int)이며, 반환타입이 Int인 함수 val makeSure: Int.(left: Int, ri..
[TIL/Kotlin] 코틀린 고급문법_함수 참조, 고차 함수, 클로저(Closure)
·
TIL/Kotlin
1. 함수 참조 함수 타입의 변수는 이미 선언되어 있는 함수나 객체의 멤버 함수를 가리킬 수도 있다. 함수 이름 앞에 :: 를 붙이면, 표현식의 값은 그 함수의 참조값이 되며, 타입은 그 함수의 시그니처에 맞는 함수 타입이 된다.(코틀린 1.1 버전까지는 ::plus가 아닌 this::plus 형태로 적어야 한다) 객체의 멤버 함수를 함수 타입의 표현식으로 바꾸려면 '참조 변수::멤버 함수'의 꼴로 적는다. fun plus(a: Int, b: Int) = println("plus 호출됨 ${a + b}") object Object { fun minus(a: Int, b: Int) = println("Object의 minus 호출됨 ${a - b}") } class Class { fun average(a:..
[TIL/Kotlin] 코틀린 고급문법_함수 리터럴과 람다식, 익명 함수, it 식별자
·
TIL/Kotlin
1. 함수 리터럴과 람다식 코틀린에서는 함수 리터럴을 두 가지 형태로 만들 수 있다. 하나는 람다식이고 다른 방법은 익명 함수이다. 람다식은 {매개변수 -> 반환 값} 형태를 가지고 있다. 아래 예제 코드와 주석을 통해 추가 설명을 적겠다. fun main() { // 함수타입 : 매개변수가 Int 타입, 반환 타입 Unit인 함수를 저장할 수 있는 타입 val instantFunc: (Int) -> Unit // 함수 리터럴 : 함수를 나타내는 리터럴 /* number: Int => 리터럴의 매개변수를 나타냄 -> 경계로 매개변수와 함수의 내용이 분리됨 매개변수가 없는 함수 리터럴을 만들고 싶다면, number: Int -> 부분 없이 함수 내용만 나오게 함수 리터럴에는 return을 적지 않는다. 리..
[TIL/Kotlin] 코틀린 고급문법_데이터 클래스와 객체 분해하기
·
TIL/Kotlin
1. 데이터 클래스(Data Class) 클래스에는 크게 데이터 자체의 역할만 하는 클래스와 데이터를 다루는 역할을 하는 클래스가 있다. 간단히 예를 들어 사원 데이터 자체만 속성으로 갖고 있는 사원 클래스와 사원의 인스턴스들을 관리하는 사원매니저 클래스 같은 식이다. 코틀린은 데이터에 특화된 클래스를 선언할 수 있는 문법을 제공하는데 데이터 클래스를 선언하기 위해서는 클래스 선언문 앞에 data 키워드를 붙이면 된다. 데이터 클래스를 선언하기 위해서는 아래와 같은 규칙들을 지켜야 한다. > 적어도 하나의 프로퍼티를 가져야 한다. > 생성자 매개변수에는 반드시 var이나 val을 같이 써야한다. 즉, 프로퍼티에 대응하지 않는 생성자 매개변수를 가질 수 없다. > abstract, open, sealed,..