Chef.Yeon
Code Cook
Chef.Yeon
전체 방문자
오늘
어제
  • 분류 전체보기 (230)
    • 게임 개발 (1)
      • Unity (1)
    • Android (27)
      • Kotlin (19)
      • 우아한테크코스 5기 (4)
    • Language (11)
      • 파이썬 (3)
      • Java (7)
    • DB (2)
      • SQL (16)
    • Spring (25)
    • 코딩테스트 (56)
    • Git (1)
    • TIL (85)
    • DevOps (6)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 안드로이드
  • 다이나믹 프로그래밍
  • Android
  • java
  • Docker
  • SQL
  • MariaDB
  • grafana
  • kibana
  • 레포지토리
  • 코딩테스트
  • 코틀린
  • webflux
  • elasticsearch
  • 프리코스
  • enum
  • 문자열
  • 코틀린 인 액션
  • ec2
  • 백준
  • til
  • kotlin
  • 우아한테크코스
  • 파이썬
  • 프로그래머스
  • spring
  • Wil
  • 내림차순
  • rsocket
  • 에라토스테네스의 체

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Chef.Yeon

Code Cook

Android/Kotlin

[코틀린 인 액션] 2장 정리

2022. 11. 24. 22:24
2.1.3 변수
  1. 기본적으로 모든 변수를 val 키워드를 사용해 불변 변수로 선언할 것,
    나중에 꼭 필요할 때만 var로 변경
  2. 초기화 식을 사용하지 않고 변수를 선언하려면 변수 타입을 명시
val answer: Int
answer = 42

   3. val 참조 객체는 불변일지라도 그 참조가 가르키는 객체의 내부 값은 변경될 수 있음

val languages = arrayListOf("Java")
languages.add("Kotlin")

 

2.2.2 커스텀 접근자

   1. 프로퍼티 게터 선언을 통해 클라이언트가 프로퍼티에 접근할 때마다
       게터가 프로퍼티 값을 매번 다시 계산

fun main(args: Array<String>) {
    val rect = Rectangle(3,3)
    val rect2 = Rectangle(3,5)

    println(rect.isSquare)
    println(rect2.isSquare)
}

class Rectangle(val height: Int, val width: Int) {
    val isSquare: Boolean
        get() {
            return height == width
        }
}

 

2.3.2 when으로 enum 클래스 다루기

   1. 한 분기 안에서 여러 값을 매치 패턴으로 사용 가능 (콤마로 분리)

enum class Color {
    RED, ORANGE, YELLOW, GREEN, BLUE
}
fun main(args: Array<String>) {
    val color = Color.ORANGE
    println(getWarmth(color))
}

fun getWarmth(color: Color) = when (color) {
    Color.RED, Color.ORANGE, Color.YELLOW -> "warm"
    Color.GREEN -> "neutral"
    Color.BLUE -> "cold"
}

   2. 다른 패키지에서 정의한 enum 클래스 수식자 없이 사용

import colors.Color
import colors.Color.* // enum 상수를 모두 import

fun main(args: Array<String>) {
    val color = ORANGE
    println(getWarmth(color))
}

fun getWarmth(color: Color) = when (color) {
    RED, ORANGE, YELLOW -> "warm"
    GREEN -> "neutral"
    BLUE -> "cold"
}

   3. when의 분기 조건에 여러 다른 객체를 사용 가능

  • setOf는 인자로 받은 원소를 포함하여 집합인 Set 객체로 만드는 함수
  • setOf(c1, c2)와 setOf(YELLOW, BLUE)가 같다는 말은
    c1이 YELLOW이고 c2가 BLUE이거나, c1이 BLUE이고 c2가 YELLOW라는 의미
fun main(args: Array<String>) {
    println(mix(BLUE, YELLOW))
}

fun mix(c1: Color, c2: Color) =
    when (setOf(c1, c2)) {
        setOf(RED, YELLOW) -> ORANGE
        setOf(YELLOW, BLUE) -> GREEN
        else -> throw Exception("Dirty Color")
    }

 

728x90
2.3.4 인자 없는 when 사용

   1. 불필요한 객체 생성 방지

  • when에 인자가 없으려면 각 분기의 조건이 Bollean 결과를 계산하는 식이어야 함
  • 위 코드에서는 여러 Set 인스턴스를 생성하게 됨, 함수가 자주 호출된다면
    불필요한 가비지 객체가 늘어나게 되므로 이를 방지하기 위해 인자가 없는
    when을 사용할 수 있음
  • 가독성이 떨어짐
fun main(args: Array<String>) {
    println(mix(BLUE, YELLOW))
}

fun mix(c1: Color, c2: Color) =
    when {
        (c1 == YELLOW && c2 == RED) || (c1 == RED && c2 == YELLOW) -> ORANGE
        (c1 == YELLOW && c2 == BLUE) || (c1 == BLUE && c2 == YELLOW) -> GREEN
        else -> throw Exception("Dirty color")
    }

 

2.3.5 스마트 캐스트: 타입 검사와 타입 캐스트를 조합
  • is를 통해 변수의 타입을 검사하면 굳이 변수를 원하는 타입으로 캐스팅하지 않아도
    컴파일러가 캐스팅을 수행함
interface Expr
class Num(val value: Int) : Expr
class Sum(val left: Expr, val right: Expr) : Expr
fun eval(e: Expr): Int {
    if (e is Num) {
        val n = e as Num // 불필요
        return n.value
    }
    if (e is Sum) {
        return eval(e.right) + eval(e.left)
    }
    throw IllegalArgumentException("Unknown expression")
}
  • if (a > b) a else b 는 자바의 a > b ? a : b처럼 작동
    • eval 함수에서 return문과 중괄호문을 없애고 if식을 본문으로 사용해
      간단하게 만들 수 있음
# if를 when으로 변경

fun eval(e: Expr) {
    when (e) {
        is Num -> 
            e.value
        is Sum ->
            eval(e.left) + eval(e.right)
        else ->
            throw IllegalArgumentException("Unknown expression")
    }
}

 

2.4.3 맵에 대한 이터레이션

   1. 원소의 현재 인덱스를 유지하면서 컬렉션을 이터레이션 가능

fun main(args: Array<String>) {
    val list = arrayListOf("10","11","1001")
    for ((index, element) in list.withIndex()) {
        println("$index: $element")
    }
}

 

2.4.4 in으로 컬렉션이나 범위의 원소 검사
  • when식에서 in 또는 !in 연산자 사용 가능
fun recognize(c: Char) = when (c) {
    in '0'..'9' -> "digit"
    in 'A'..'Z', in 'a'..'z' -> "letter"
    else -> "I don't know"
}

 

728x90

'Android > Kotlin' 카테고리의 다른 글

[코틀린 인 액션] 4장 정리  (0) 2022.11.29
[코틀린 인 액션] 3장 정리  (0) 2022.11.28
[Kotlin] enum, sealed class  (0) 2022.09.27
[Kotlin] 고차 함수, 람다, Scope functions  (0) 2022.09.18
[Kotiln] Nested & inner class, Extension함수, Generics  (0) 2022.09.16
    'Android/Kotlin' 카테고리의 다른 글
    • [코틀린 인 액션] 4장 정리
    • [코틀린 인 액션] 3장 정리
    • [Kotlin] enum, sealed class
    • [Kotlin] 고차 함수, 람다, Scope functions
    Chef.Yeon
    Chef.Yeon
    보기 좋고 깔끔한 코드를 요리하기 위해 노력하고 있습니다.

    티스토리툴바