[코틀린 완벽 가이드] 14장 : 코틀린 테스팅
·
Kotlin/코틀린 완벽 가이드
1. 코테스트 명세 1. 코테스트 시작하기 코테스트 io.kotest:kotest-runner-junit5-jvm:4.5.0 을 사용한다. 2. 명세 스타일 코테스트는 여러 명세 스타일을 지원한다. 프로젝트에서 여러 스타일을 섞어 쓰거나 AbstractSpec 클래스 또는 AbstractSpec 클래스의 하위 클래스 중 하나인 AbstractStringSpec과 같은 클래스를 구현함으로써 명세 스타일을 커스텀할 수 있다. 테스트 케이스를 정의하려면 명세 클래스 중 하나를 상속해야 한다. 그 후 클래스 생성자에 테스트를 추가하거나 상위 클래스 생성자에게 전달하는 람다 안에 테스트를 추가한다. 테스트 자체를 정의하는 방법은 스타일에 따라 달라지며, 대부분의 경우 DSL과 비슷한 API를 통해 테스트를 정의한..
[코틀린 완벽 가이드] 13장 : 동시성
·
Kotlin/코틀린 완벽 가이드
1. 코루틴 1. 코루틴과 일시 중단 함수 코루틴 라이브러리의 기본 요소는 일시 중단 함수(suspend function) 이다. 이 함수는 원하는 지점에서 함수의 실행을 중단하거나 다시 실행을 계속 진행하게 할 수 있다. suspend fun foo() { println("Task started") delay(100) println("Task finished") } delay() 함수는 일시 중단 함수다. 이 함수는 현재 스레드를 블럭시키지 않고 자신을 호출한 함수를 일시 중단시키며 스레드를 다른 작업을 수행할 수 있게 풀어준다. 일시 중단 함수가 아닌 일반 함수에서는 사용할 수 없다. 동시성 코드의 동작을 제어할 때 공통적인 생명 주기와 문맥이 정해진 몇몇 작업이 정의된 구체적인 영역 안에서만 동시성..
[코틀린 완벽 가이드] 11장 : 도메인 특화 언어
·
Kotlin/코틀린 완벽 가이드
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..
[코틀린 완벽 가이드] 10장 : 애너테이션과 리플렉션
·
Kotlin/코틀린 완벽 가이드
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]..
[코틀린 완벽 가이드] 9장 : 제네릭스
·
Kotlin/코틀린 완벽 가이드
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..
[코틀린 완벽 가이드] 8-2장 : 추상 클래스와 인터페이스
·
Kotlin/코틀린 완벽 가이드
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") 추상 클래스에도 생성자가 있을 수 있다. 추상 클래스와 비추상 클래스의 차이는 ..
[코틀린 완벽 가이드] 8-1장 : 상속
·
Kotlin/코틀린 완벽 가이드
상속 (클래스 계층 이해하기) 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() { ..
[코틀린 완벽 가이드] 7-2장 : 파일과 I/O 스트림
·
Kotlin/코틀린 완벽 가이드
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") } //..
[코틀린 완벽 가이드] 7-1장 : 컬렉션
·
Kotlin/코틀린 완벽 가이드
컬렉션 (컬렉션과 I/O 자세히 알아보기) 컬렉션을 조작하는 모든 연산이 인라인 함수이다. 따라서 이런 연산을 사용해도 함수 호출이나 람다 호출에 따른 부가 비용이 들지 않는다. 1. 컬렉션 타입 코틀린 컬렉션 타입은 기본적으로 네 가지로 분류된다. 배열, 이터러블, 시퀀스, 맵 컬렉션은 기본적으로 원소의 타입을 지정하는 제네릭 타입이다. 이터러블 이터러블은 Iterable 타입으로 표현된다. 일반적으로 즉시 계산(eager)되는 상태가 있는(stateful) 컬렉션을 표현한다. 즉시 계산: 필요한 시점에 원소가 초기화되지 않고 컬렉션을 최초로 생성할 때 초기화된다는 뜻 상태가 있다: 컬렉션이 원소를 필요할 때 생성하는 제너레이터 함수를 유지하지 않고 원소를 저장한다는 뜻 이터러블 타입은 원소를 순회할 ..
[코틀린 완벽 가이드] 6장 : 특별한 클래스 사용하기
·
Kotlin/코틀린 완벽 가이드
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..