목록Kotlin/코틀린 완벽 가이드 (14)
안드로이드 개발자 노트
1. 코테스트 명세 1. 코테스트 시작하기 코테스트 io.kotest:kotest-runner-junit5-jvm:4.5.0 을 사용한다. 2. 명세 스타일 코테스트는 여러 명세 스타일을 지원한다. 프로젝트에서 여러 스타일을 섞어 쓰거나 AbstractSpec 클래스 또는 AbstractSpec 클래스의 하위 클래스 중 하나인 AbstractStringSpec과 같은 클래스를 구현함으로써 명세 스타일을 커스텀할 수 있다. 테스트 케이스를 정의하려면 명세 클래스 중 하나를 상속해야 한다. 그 후 클래스 생성자에 테스트를 추가하거나 상위 클래스 생성자에게 전달하는 람다 안에 테스트를 추가한다. 테스트 자체를 정의하는 방법은 스타일에 따라 달라지며, 대부분의 경우 DSL과 비슷한 API를 통해 테스트를 정의한..
1. 코루틴 1. 코루틴과 일시 중단 함수 코루틴 라이브러리의 기본 요소는 일시 중단 함수(suspend function) 이다. 이 함수는 원하는 지점에서 함수의 실행을 중단하거나 다시 실행을 계속 진행하게 할 수 있다. suspend fun foo() { println("Task started") delay(100) println("Task finished") } delay() 함수는 일시 중단 함수다. 이 함수는 현재 스레드를 블럭시키지 않고 자신을 호출한 함수를 일시 중단시키며 스레드를 다른 작업을 수행할 수 있게 풀어준다. 일시 중단 함수가 아닌 일반 함수에서는 사용할 수 없다. 동시성 코드의 동작을 제어할 때 공통적인 생명 주기와 문맥이 정해진 몇몇 작업이 정의된 구체적인 영역 안에서만 동시성..
1. 연산자 오버로딩 연산자 오버로딩은 +, -, *, / 등 코틀린 내장 연산자에 대해 새로운 의미를 부여할 수 있게 해주는 언어 기능이다. 1. 단항 연산 단항 연산은 피연산자가 한 개인 연산으로 오버로딩할 수 있는 단항 연산자로는 전위+나 -,! 연산자가 있다. 컴파일러는 이런 연산자를 적절한 함수 호출로 펼쳐준다. 식 의미 +e e.unaryPlus() -e e.unaryMinus() !e e.not() 예를 들어 색을 표현하는 이넘 클래스가 있다고 생각해보면, enum class Color { BLACK, RED, GREEN, BLUE, YELLOW, CYAN, MAGENTA, WHITE; operator fun not() = when (this) { BLACK -> WHITE RED -> CY..
1. 애너테이션 애너테이션은 커스텀 메타데이터를 정의하고 이 메타데이터를 소스코드 상의 선언, 식, 전체 파일 등의 요소에 엮을 수 있는 수단이다. 1. 애너테이션 클래스 정의하고 사용하기 애너테이션은 선언의 앞쪽 변경자 위치에 @이 붙은 애너테이션의 이름을 놓는다. import org.junit.Test class MyTestCase { @Test fun testOnePlusOne() { assert(1 + 1 == 2) } } 코틀린은 애너테이션을 식에 적용할 수 있으며, 애너테이션을 여럿 붙이고 싶다면 각괄호([ ])로 애너테이션들을 감쌀 수 있다. val s = @Suppress("UNCHECKED_CAST") object as List // 식에 적용 @[Synchronized Strictfp]..
1. 타입 파라미터 1. 제네릭 선언 선언을 사용할 때는 파라미터 실제 타입을 지정해줘야한다. val map = HashMap() val list = arrayListOf() 인자 타입을 추론할 수 있으면 생략할 수 있다. val map: Map = HashMap() // 타입을 명시했기 때문에 추론 가능 val list = arrayListOf("abc", "def") // 전달된 인자 타입으로 추론 가능 다음은 주어진 타입의 값을 저장할 수 있는 트리를 표현하는 클래스이다. class TreeNode(val data: T) { private val _children = arrayListOf() var parent: TreeNode? = null val children: List get() = _chi..
2. 추상 클래스와 인터페이스 (클래스 계층 이해하기)1. 추상 클래스와 추상 멤버 추상 클래스는 직접 인스턴스화할 수 없고 다른 클래스의 상위 클래스 역할만 할 수 있는 클래스를 뜻한다. 클래스를 추상 클래스로 만들려면 abstract 라는 변경자 키워드를 붙여야 한다.abstract class Entity(val name: String)// ok: 하위 클래스에서 위임 호출class Person(name: String, val age: Int) : Entity(name)// error: Cannot create an instance of an abstract classval entity = Entity("Unknown") 추상 클래스에도 생성자가 있을 수 있다. 추상 클래스와 비추상 클래스의 차이는 ..
상속 (클래스 계층 이해하기) 1. 하위 클래스 선언 클래스 정의에서 주생성자 뒤에 :을 넣고 상위 클래스가 될 클래스의 이름을 넣으면 클래스를 상속할 수 있다. class 앞에 open 키워드는 클래스가 상속에 대해 열려있다는 뜻으로, 디폴트로 모든 클래스가 열려있고 상속을 금지하려면 final을 명시해야하는 자바와는 달리 코틀린 클래스는 디폴트가 final이고 이 변경자가 붙여야만 상속할 수 있다. open class Vehicle { var currentSpeed = 0 fun start() { println("I'm moving") } fun stop() { println("Stopped") } } open class FlyingVehicle : Vehicle() { fun takeOff() { ..
2. 파일과 I/O 스트림 (컬렉션과 I/O 자세히 알아보기) 1. 스트림 유틸리티 코틀린은 자바 I/O 스트림에 대한 확장 함수를 다수 제공한다. 다음은 스트림 전체 콘텐츠를 읽어오는 함수들이다. fun InputStream.readBytes(): ByteArray fun Reader.readText(): String fun Reader.readLines(): Line readLines() 함수는 스트림 끝까지 콘텐츠를 읽어오지만, readLine() 함수는 스트림에서 한 줄만 가져온다. 또한 readLines() 함수는 값을 반환하면서 스트림을 닫아주지만, readText()는 그렇지 않다. FileWriter("data.txt").use { it.write("One\nTwo\nThree") } //..
컬렉션 (컬렉션과 I/O 자세히 알아보기) 컬렉션을 조작하는 모든 연산이 인라인 함수이다. 따라서 이런 연산을 사용해도 함수 호출이나 람다 호출에 따른 부가 비용이 들지 않는다. 1. 컬렉션 타입 코틀린 컬렉션 타입은 기본적으로 네 가지로 분류된다. 배열, 이터러블, 시퀀스, 맵 컬렉션은 기본적으로 원소의 타입을 지정하는 제네릭 타입이다. 이터러블 이터러블은 Iterable 타입으로 표현된다. 일반적으로 즉시 계산(eager)되는 상태가 있는(stateful) 컬렉션을 표현한다. 즉시 계산: 필요한 시점에 원소가 초기화되지 않고 컬렉션을 최초로 생성할 때 초기화된다는 뜻 상태가 있다: 컬렉션이 원소를 필요할 때 생성하는 제너레이터 함수를 유지하지 않고 원소를 저장한다는 뜻 이터러블 타입은 원소를 순회할 ..
1. 이넘 클래스 이넘 클래스는 미리 정의해둔 상수들로 이뤄진 제한된 집합을 표현하는 클래스이다. enum class WeekDay { MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY } fun WeekDay.isWorkDay() = this == WeekDay.SATURDAY || this == WeekDay.SUNDAY fun main() { println(WeekDay.MONDAY.isWorkDay()) // false println(WeekDay.SATURDAY.isWorkDay()) // true } 1. 빠뜨린 부분이 없는 when 식 when 식에서 모든 이넘 상수를 다룬 경우에는 else 가지를 생략할 수 있다. enum cl..