[Kotlin] 1-2. 이디엄

이디엄

DTO 생성(POJO?POCO)

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

다음 기능을 가진 Customer 클래스 제공

fun foo(a: Int = 0, b: String:"") {...}  // 디폴드 값

리스트 필터링

val positives = list.filter{it > 0}

스트링 삽입

println("Name $name")

인스턴스 검사

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

쌍으로 맵이나 목록 탐색

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

범위 사용

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) {...}
if (x in 1..10) {...}

읽기 전용 리스트

val list = listOf("a", "b", "c")

읽기 전용 맵

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

맵 접근

println(map["key"])
map["key"] = value

지연(lazy) 프로퍼티

val p: String by lazy {
  // 문자열 계산
}

확장 함수

fun String.spaceToCamelCase() {...}
"Convert this to camelCase".spaceToCamelCase()

싱글톤 생성

object Resource {
  val name = "Name"
}

If not null 축약

val files = File("Test").listFiles()
println(files?.size)

If not null else 축약

val files = File("Test").listFiles()
println(files?.size ?: "empty")

null이면 문장 실행

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

null이 아니면 실행

val value = ...

value?.let {
  ...  // null이 아닌 블록 실행 
}

null이 아니면 null 가능 값 매핑

val value = ...
val mapped = value?.let {transformValue(it)} ?: defaultValueIfValueIsNull

when 문장에서 리턴

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

try/catch 식

fun test() {
  val result = try {
    count()
  } catch (e: ArithmeticException) {
      throw IllegalStateException(e)
  }
  // 결과로 작업
}

if 식

fun foo(param: Int) {
  val result = if (param == 1) {
    "one"
  } else if (param == 2) {
    "two"
  } else {
    "three"
  }
}

Unit을 리턴하는 메서드의 빌더-방식 용법

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

단일 식 함수

fun theAnswer() = 42

다음과 동일

fun theAnswer() : Int {
  return 42
}

단일 식 함수는 다른 이디엄과 쓸 수 있으며 코드를 더 짧게 만들어줌

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

객체 인스턴스의 메서드를 여러 번 호출(‘with’)

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

val myTurtle = Turtle()
with (myTurtle) { // 100 pix 사각형 그리기
  penDown()
  for(i in 1..4) {
    forward(100.0)
    turn(90.0)
  }
  penUp()
}

null 가능 Boolean 사용

val b: Boolean? = ...
if(b == true) {
  ...
} else {
  // 'b'는 false나 null
}