[코틀린 완벽 가이드] 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..
[코틀린 완벽 가이드] 5장 : 고급 함수와 함수형 프로그래밍 활용하기
·
Kotlin/코틀린 완벽 가이드
1. 코틀린을 활용한 함수형 프로그래밍 코드 추상화와 합성이 더 쉽게 가능한 유연성을 제공하는 고차 함수 1. 고차 함수 정수 배열의 원소의 합계를 계산하는 함수를 정의했다. fun sum(numbers: IntArray): Int { var result = numbers.firstOrNull() ?: throw IllegalArgumentException("Empty array") for (i in 1..numbers.lastIndex) result += numbers[i] return result } fun main() { println(sum(intArrayOf(1, 2, 3))) // 6 } 이 함수를 곱셈이나 최댓값/최솟값처럼 다양한 집계 함수를 사용하게 하려면 함수 자체의 루프 로직은 그대로 ..
[코틀린 완벽 가이드] 4장 : 클래스와 객체 다루기
·
Kotlin/코틀린 완벽 가이드
1. 클래스 정의하기 1. 클래스 내부 구조 클래스는 class 키워드 다음에 클래스 이름이 오고 그다음에 클래스 본문이 오는 형태로 정의된다. 클래스 안에는 프로퍼티와 함수가 정의될 수 있다. class Person { // 프로퍼티 부분 var firstName: String = "" var familyName: String = "" var age: Int = 0 // 함수 부분 fun fullName() = "$firstName $familyName" fun showMe() { println("${fullName()}: $age") } } 이 정의는 인스턴스에 firstName, familyName, age라는 프로퍼티와 fullName, showMe라는 함수가 들어있음을 알려준다. 일반적으로 프로..
[코틀린 완벽 가이드] 3장 : 함수 정의하기
·
Kotlin/코틀린 완벽 가이드
1. 함수 1. 코틀린 함수의 구조 코틀린 함수는 어떤 입력(파라미터(parameter))를 받아 자신을 호출한 코드 쪽에 출력값(결괏값)을 반환(return)할 수 있는 재사용 가능한 코드 블록이다. import kotlin.math.PI fun circleArea(radius: Double): Double { return PI*radius*radius } fun main() { print("Enter radius: ") val radius = readLine()!!.toDouble() println("Circle area: ${circleArea(radius)}") } circleArea 함수를 구성하는 요소를 살펴보면, fun 키워드 뒤의 함수 이름을 변수 이름과 마찬가지로 아무 식별자나 쓸 수 있..