본문 바로가기
책 정리/Kotlin IN ACTION

2. 코틀린 기초

by 이석준석이 2021. 8. 28.


1. valvar의 차이점

  • val(value) : 한번만 값을 선언할 수 있으며, 그 이후에 변경할 수 없다. 
  • var(varible) : 값을 선언한 후 변경할 수 있다.

 

클래스 프로퍼티로 val, var 을 정의하면, 코틀린은 아래와 같이 생성한다.

  • val
    • private field
    • getter
  • var
    • private field
    • getter
    • setter
class Person(
    val name: String, // == private String name + getName()
    var age: Int      // == private int age + getAge() + setAge()
) {

}

fun main() {
    val person = Person("홍길동", 33)

    println(person.name)
    println(person.age)

    person.name = "둘리" // 컴파일에러가 발생한다. (val 는 setter 가 제공되지 않는다.)
    person.age = 34
}

2. 문자열 템플릿

  • 변수 이름 앞에 $ 혹은 ${변수} 를 통해 문자열을 간결하게 표현할 수 있다.
fun main() {
    val coffee = "Americano"
    val price = 3000
    
    val order = "주문한 음료는 ${coffee} 이며, 가격은 $price 입니다."
    assertEquals(order, "주문한 음료는 Americano 이며, 가격은 3000 입니다.")
}

3. 코틀린에서의 if는 식(expression) 이며, 값을 만들어낸다.

  • 자바와는 다르게 if문으로 값을 만들어낸다.
  • 코틀린에서는 3항연산자가 없다.
fun main() {
    val a = 1
    val b = if(a == 1) 2 else 3
    assertEquals(2, b)
}

4. 코틀린에서의 when 은 자바의 switch-case 와 비슷하나, 더 강력하다.

  • when의 파라미터로  객체를 허용한다.
  • 파라미터 없이 사용할 수도 있다.

5. 타입을 검사한 뒤에는, 타입캐스팅이 필요없다.

  • is 를 이용하여 타입을 검사한다.
  • 이를 기반으로 코틀린은 스마트캐스트를 통해, 타입캐스팅을 지원한다.
// 문자열인 경우에는 길이를, 숫자의 경우에는 그 숫자를 반환한다.
fun smartCast(any: Any): Int {
    if(any is String) {
        // String 으로 따로 타입캐스팅 없이 길이를 반환할 수 있다.
        return any.length
    } else if(any is Int) {
        return any
    } else {
        throw IllegalArgumentException("잘못된 파라미터")
    }
}

6. [for .. in] 루프

  • Collection 을 Iteration 할 때 사용하면 유용하다.
// 간단하게 인덱스 번호화, 인덱스에 해당하는 원소를 루프돌 수 있다.
fun main() {
    val list = arrayListOf<Int>(1, 22, 333, 4444, 55555)
    for((index, element) in list.withIndex()) {
        println("index : $index, element : $element")
    }
}

7. java.lang.Comparable 인터페이스를 구현했다면, in 절을 통해 검사할 수 있다.

// 알파벳 순으로, J < K < S 이므로, true 가 반환된다.
// String 은 기본적으로 Comparable 을 구현한다.
println("Kotlin" in "Java".."Scala")

8. 코틀린에서의 예외처리

  • try 구문을 식(expression) 으로 사용할 수 있다.
  • throws 절이 없다.
fun main() {
    assertEquals(-1, tryEx(null))
    assertEquals(123, tryEx("123"))
}

// try 구문을 이용하여, num 에 값을 할당하였다.
// throws NumberFormatException 은 코틀린에서는 존재하지 않는다.
fun tryEx(any: String?): Int {
    val num = try {
        Integer.parseInt(any)
    } catch (e : NumberFormatException) {
        -1
    }
    return num
}