Kotlin 공식 문서 살펴보기 (2) - Idioms

DTO

data class Customer(val name: String, val email: String)

data 키워드와 함께 사용한 Customer 클래스는 아래의 기능을 제공한다.

  • 모든 속성의 getter(var 일 경우에는 setter 포함)
  • equals()
  • hashCode()
  • toString()
  • copy()
  • 모든 속성에 대해 component1()부터 componentN()까지

함수 매개변수 기본값 설정

fun foo(a: Int = 0, b: String = "") { ... }

리스트 필터링

val positives = list.filter { x -> x > 0 }

더 짧게도 가능하다!

val positives = list.filter { it > 0 }

콜렉션에 요소가 있는지 확인하기

if ("tom@test.com" in emailsList) { ... }
if ("jane@test.com" !in emailsList) { ... }

문자열 넣기

println("I am $name.")

인스턴스 확인

when (x) {
  	is Foo -> ...
  	is Bar -> ...
  	else   -> ...
}

읽기 전용 list & map

val list = listOf("a", "b", "c")
val map = mapOf("a" to 1, "b" to 2, "c" to 3)

map 탐색하기

for ((k, v) in map) {
  	println("$k -> $v")
}

범위 반복하기

for (i in 1..100) { .. } // 100을 포함한다
for (i in 1 until 100) { .. } // 100을 포함하지 않는다
for (x in 2..10 step 2) { .. }
for (x in 10 downTo 1) { .. }
(1..10).forEach { .. }

Lazy Property

val p: String by lazy {
  ..
}

싱글톤

object Resource {
  	val name = "Name"
}

추상클래스 인스턴스화

abstract class MyAbstractClass {
  	abstract fun doFirstThing()
  	abstract fun doSecondThing()
}

fun main() {
  	val myObject = object : MyAbstractClass() {
      	override fun doFirstThing() {
           // ..
        }
      	
      	override fun doSecondThing() {
           // ..
        }
    }
  	myObject.doFirstThing()
}

if not null 줄이기

val files = File("Test").listFiles()

println(files?.size) // files 가 null 이 아닐 경우에만 size 가 출력된다

if not null else 줄이기

val files = File("Test").listFiles()

println(files?.size ?: "empty") // files 가 null 이면 'empty' 출력

null 일 경우, 명령문 실행하기

val values = ...
val email = values["email"] ?: throw IllegalStateException("Email is missing.")

비어있을 수 있는 콜렉션에서 첫번째 아이템 가져오기

val emails = ..
val firstEmail = emails.firstOrNull() ?: ""

when 문에서 반환하기

fun transform(color: String): Int {
  	return when (color) {
      	"Red"		->	0
      	"Green"	->	1
      	"Blue"	->	2
      	else 		-> throw IllegalArgumentException("Invalid color")
    }
}

try-catch 식

fun test() {
  	val result = try {
      	count()
    } catch (e: ArithmeticException) {
      	throw IllegalStateException(e)
    }
}

if 식

val y = if (x == 1) {
  	"one"
} else if (x == 2) {
  	"two"
} else {
  	"other"
}

Unit을 반환하는 메소드의 builder 스타일 사용법

fun arrayOfMinusOnes(size: Int): IntArray {
  	return IntArray(size).apply { fill(-1) }
}

인스턴스에서 여러 메서드 호출하기

with 를 사용해서 여러 메서드를 호출한다.

class Turtle {
  	fun penDown()
  	fun penUp()
  	fun turn(degrees: Double)
  	fun forward(pixels: Double)
}

val myTurtle = Turtle()
with(myTurtle) {
  	penDown()
  	for (i in 1..4) {
      	forward(100.0)
      	turn(90.0)
    }
  	penUp()
}

객체 속성 구성하기

apply 를 사용해서 속성을 적용한다.

val myRectangle = Rectangle().apply {
  	length = 3
  	breadth = 4
  	color = 0xFAFAFA
}

두 변수 값 바꾸기

var a = 1
var b = 2
a = b.also { b = a }