본문 바로가기
공부/Kotlin

2장. 코틀린 기초

by JERO__ 2022. 5. 29.

다루는 내용

  1. 함수, 변수, 클래스, enum, 프로퍼티
  2. 스마트 캐스트
  3. 예외 던지기, 예외 잡기

1. 함수, 변수, 클래스, enum, 프로퍼티

1. 함수

  • 함수 선언 fun
  • fun max(a: Int, b: Int): Int { return if (a > b) a else b }
  • 식이 본문인 함수 = , 반환타입 생략
    • 타입 추론을 통해 반환타입을 분석한다.
  • fun max(a: Int, b: Int): Int = if (a > b) a else b

2. 변수

  1. 변수 선언 키워드
  • val(value) : 변경 불가능 (자바의 final)
    • val 참조 자체는 불변일지라도, 그 참조가 가리키는 객체의 내부 값은 변경될 수 있다.
    • val language = arrayListOf("java") language.add("kotlin")
  • var(variable) : 변경 가능(mutable)
    • 변수 타입은 고정돼 바뀌지 않는다.
    • var answer = 42 answer = "no changed" // 컴파일 에러

기본적으로 모든 변수를 val 키워드를 사용하고, 꼭 나중에 필요할 때에만 var로 변경하자

  1. 변수 선언 방법에 두 가지가 존재한다.
  • 초기화 식이 있는 경우 : 값 지정 → 타입 추론
  • val step1 = 42 var step2 = 25
  • 초기화 식이 없는 경우 : 변수 타입 지정 → **타입 지정**
  • val step3 : Int

3. 클래스와 프로퍼티

  • 자바의 클래스(Person)와 프로퍼티(name)
  • public class Person { private final String name; public Person(String name) { this.name = name; } public String getName() { return name; } }
  • 코틀린의 클래스와 프로퍼티
  • class Person(val name: String)

그럼 프로퍼티를 어떻게 선언해야 할까?

class Person(
	val name: String,                // 읽기 전용 프로퍼티.  private필드 / getter
	var isMarried: Boolean           // 쓸 수 있는 프로퍼티. private필드 / getter, setter
)

프로퍼티를 사용하는 방법

val person = Person("zero", true)
println(person.name)
person.isMarried = false

**커스텀 접근자** : 프로퍼티의 접근자를 직접 작성하기

class Rectangle(val height: Int, val witdh: Int) {
    val isSqare: Boolean
        get() {
            return height == witdh
        }
}

4. 선택 표현과 처리 : enum과 when

  • enum 선언하기
    • 값이 없는 enum
    • enum class Color { RED, ORANGE, YELLOW }
    • 값이 존재하는 enum
    • enum class Color(val r: Int, val g: Int, val b: Int) { RED(255, 0, 0), YELLOW(255, 255, 0), ORANGE(255, 165, 0); // 세미콜론을 붙여야한다! fun rgb() = (r * 256 + g) * 256 + b }
  • when 사용하기
    • 분기 조건에 다른 객체를 사용할 수 있다.
    • fun mix(c1: Color, c2: Color) = when(setOf(c1, c2)) { setOf(RED, YELLOW) -> ORANGE // setOf는 집합이기에 순서는 중요치 않다 else -> throw Exception("else Color") }
    • Boolean 사용
    • fun mixOptimized(c1: Color, c2: Color) = when { // 인자에 아무것도 없다 c1 == RED && c2 == YELLOW -> ORANGE else -> throw Exception("else Color") }
  • fun getMnemonic(color: Color) = when(color) { Color.RED, Color.YELLOW -> "Richard" Color.ORANGE -> "Of" }

2. 스마트 캐스트

**타입 검사와 타입 캐스트를 조합한 것**

타입 검사 : is 를 통해 검사

타입 캐스트 : 원하는 타입으로 캐스팅

→ 스마트 캐스트는, is로 검사하고 캐스팅하지 않아도 해당 타입으로 선언된 것처럼 사용할 수 있다.

fun main(args: Array<String>) {
    println(eval(Sum(Sum(Num(1), Num(2)), Num(4))))
}

interface Expr;
class Num(val value: Int) : Expr
class Sum(val left: Expr, val right: Expr) : Expr

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

수에 대한 이터레이션: 범위와 수열

코틀린의 범위

  • 폐구간(닫힌 구간) : until
  • 끝을 포함 : .., downto
  1. 아래로 이동하기
  2. for (i in 10 downTo 1) { println(i) }
  3. 증가 값 바꾸기
  4. for (i in 10 downTo 1 step 2) { println(i) // 10 8 6 4 2 }

컬렉션에 대한 이터레이션

  • key, value를 사용할 수 있다.
val treeMap = TreeMap<Char, String>()
for (c in 'A'..'F') {
  treeMap[c] = Integer.toBinaryString(c.toInt())
}
for ((key, value) in treeMap) {
  println("$key = $value")
}

in으로 범위의 원소를 검사한다. : when에서 사용해도 된다.

  • in
  • !in

3. 예외던지기, 예외 잡기

자바 코드와 가장 큰 차이는 throws 절이 코드에 없다.

try를 식으로 사용할 수 있다.

 

kotlin in action 책을 통한 공부입니다.

'공부 > Kotlin' 카테고리의 다른 글

4장. 클래스, 객체, 인터페이스  (0) 2022.06.07
3장. 함수 정의와 호출  (0) 2022.06.07
1장. 코틀린이란 무엇이며, 왜 필요한가?  (0) 2022.05.28
[Kotlin] 문법 정리 - 2  (0) 2022.05.04
[Kotlin] 문법 정리 - 1  (0) 2022.05.02

댓글