Kotlin In Action 2장

코틀린의 기본 요소

함수

함수는 아래와 같이 작성한다.

fun main(args: Array<String>){
    println("Hello World!")
}

중요한 점은 Kotlin에서의 조건이 아닌 조건이라는 점이다.

때문에 다음과 같은 코드들이 가능하다.

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
fun sum(a:Int,b:Int): Int{
    sum = if(a>b){ //if의 결과 식이 sum에 대입된다. 즉 문이 아니라 식이다.
        a+b
    }else{
        a-b
    }
    return sum
}

변수

변수는 다음과 같이 선언이 가능하다.

val name = "harry"
var age = 27
age = 28

val과 var의 차이

val(value에서 따옴)은 변경 불가능한 참조를 저장하는 변수다. 자바로 따지면 final이라고 생각할 수 있다.

var(variable에서 따옴)은 변경 가능한 참조다. 자바의 일반 변수에 해당한다.

코틀린에서 권장하는 방법은 가급적이면 모든 변수를 val를 사용하여 선언하고 나중에 꼭 필요할 때만 var을 사용할 것을 권장하고 있다.

val에 대해 오해하지 말아야하는 점은 참조가 불가능하다는 것이지 참조가 가르키는 객체 내부를 변경하는 것은 허용하고 있다.

다음의 코드를 보자.

val list = arrayListOf("Harry","Hi")
list.add("Kotlin")

val 참조는 불변일지라도 그 참조가 가리키는 객체의 내부 값은 변경될 수 있다는 사실을 기억하자.

var 또한 변수의 값을 변경하는 것이 가능하지만 변수의 타입은 고정돼 바뀌지 않는다.

var name = "Harry"
name = 17 // 컴파일 오류 발생

문자열 템플릿

문자열 안에서 변수를 사용하는 것이 가능하다.

val name = "Harry"
println("Hello, $name")

클래스 프로퍼티

어찌보면 코틀린에서 보여주는 가장 강력한 기능 중 하나가 아닐까 생각한다.

아래는 자바를 토대로 작성된 JavaBean 클래스이다.

public class Person{
    private final String name;

    public Person(String name){
        this.name = name;
    }

    public String getName(){
        return name;
    }
}

아래는 코틀린으로 작성된 동일한 코드이다.

class Person(val name:String)

jj1lZ

멋지다.

프로퍼티

자바에서는 필드와 접근자를 한데 묶어 Property라고 주로 부른다.

코틀린은 프로퍼티를 언어 기본 기능으로 제공하며, 코틀린 프로퍼티는 자바의 필드 접근자 메소드를 완전히 대신한다.

enum과 when

코틀린의 when은 자바의 switch를 대체하되 훨씬 더 강력하고 앞으로 자주 사용할 요소이다.

whenenumSmart Cast를 먼저 설명하고 설명하겠다.

enum

enum class Color{
    RED,ORANGE,YELLOW,GREEN,BLUE,INDIGO,VIOLET
}

enum은 자바보다 더 많은 키워드를 써야하는 흔치 않은 예다.

코틀린에서의 enum은 Soft Keyword라고 불린다.

enum은 class 앞에 있을 때는 특별한 의미를 갖지만 다른 곳에서는 이름에 사용 가능하다.

enum은 단순히 값을 열거하는 것 뿐만 아니라 프로퍼티나 메소드를 정의하는 것이 가능하다.

enum class Color(
    val r:Int, val g:Int, val b:Int
){
    RED(255,0,0),ORANGE(255,165,0),
    YELLOW(255,255,0),GREEN(0,255,0),BLUE(0,0,255),
    INDIGO(75,0,130),VIOLET(238,130,238);
    fun rgb() = (r*256+g) *256 + b
}

enum 클래스안에 메소드를 정의하는 경우 enum 상수 목록과 메소드 사이에 반드시 세미콜론을 선언하여야 하며 이는 코틀린에서 유일하게 세미콜론이 필수인 영역이다.

스마트 캐스트 : 타입 검사와 타입 캐스트를 조합

Kotlin에서는 is 키워드를 사용하여 변수 타입을 검사한다.

is는 자바의 instanceof와 유사하다.

하지만 자바에서는 instanceof로 확인한 다음 명시적으로 변수 타입을 캐스팅해야만 했다.

하지만 코틀린은 컴파일러가 캐스팅을 대신 해준다.

이를 Smart Cast라고 부른다.

when의 사용법

fun test(a:Any) =
    when(a){
        is Int ->{
            1
            2
            3
            4
            5
        }
        is String ->{
            "Bye"
            "Cool"
            "Hello"
        }

        is Float ->{
            1.1
            1.2
        }
        else ->
            throw IllegalArgumentException("Unknown Type")
    }

fun main(){
    println(test(1)) // 5
    println(test("Harry")) // Hello
    println(test(1.3f)) // 1.2
}

위와 같이 블록이 값을 만들어내는 경우 when에서는 블록의 마지막 식이 반환되는 것을 기본으로 한다.

블록의 마지막 식이 블록의 결과라는 규칙은 블록이 값을 만들어내야 하는 경우 항상 성립한다.

단, 이 규칙이 함수에 적용되지는 않는다.

식이 본문인 함수는 블록을 본문으로 가질 수 없고, 블록이 본문인 함수는 내부에 return 문이 반드시 존재해야한다.

While과 for

while은 자바와 동일하므로 생략

범위와 수열

코틀린에서는 자바의 for루프(변수를 초기화하고 그 변수를 루프 실행 시 갱신하고 루프 조건을 판별)하는 요소가 없다.

이를 대신하기 위해 코틀린에서는 범위를 사용한다.

범위는 기본적으로 두 값으로 이루어진 구간이다.

보통 그 두 값은 정수 등의 숫자 타입의 값이며 .. 연산자로 시작 값과 끝 값을 연결해 범위를 만든다.

val oneToTen = 1..10

위와 같이 어떤 범위에 속한 값을 일정한 순서로 반복하는 경우를 수열(progression)이라고 부른다.


for(i in 1..100){
    println(i)
}

반대로 세되 짝수로만 세어보자.


for(i in 100 downTo 1 step 2){
    println(i)
}

여기서는 증가값을 갖는 step을 사용한다.

증가 값을 사용하면 숫자를 건너 뛸 수 있다.

여기서 100 downTo 1은 역방향 수열을 만든다.

역방향 수열의 기본 증가 값은 -1이기 때문에 증가값이 -2로 바뀐다.

맵에 대한 이터레이션

맵을 반복하는 방법에 대해서도 알아보자.

val map = HashMap<Char, Int>()
for (c in 'A'..'Z') {
    map[c] = c.toByte().toInt()
}
for ((char, asciicode) in map) {
    println("$char, $asciicode")
}

간단하게 반복이 가능하다.

in을 사용한 범위 검사

fun isLetter(c:Char) = c in 'a'..'z' || c in 'A'..'Z'
fun isNotDigit(c:Char) = c !in '0'..'9'

println(isLetter('q'))
// true
println(isLetter('x'))
// false

코틀린의 예외처리

자바와 마찬가지로 try,catch,finally를 사용할 수 있다.

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

코틀린에서는 함수가 던지는 예외를 지정하지 않고 발생한 예외를 잡아도 되고 잡아내지 않아도 된다.

자바 7에서 제공하는 try-with-resource를 Kotlin에선 어떻게 지원하는가에 대한 부분은 이후에 8장에서 살펴보도록 하자.

kotlin에서의 try는 if나 when과 마찬가지로 식이다.

따라서 try 값을 변수에 할당하는 것이 가능하다.

2장 요약

  • 코틀린에서는 값 객체 클래스를 아주 간결하게 표현할 수 있다.

  • 코틀린에서의 if는 if이 아닌 if이다.

  • 코틀린의 when은 자바의 switch와 유사하지만 더욱 강력하다.

  • 스마트 캐스터를 통해 타입을 검사한 후 해당 타입의 변수처럼 사용할 수 있다.

  • 코틀린의 for는 자바 for보다 편리하다. 특히 컬렉션을 반복해야할 때 그 강점이 발휘된다.

  • 코틀린의 예외 처리 자바와 비슷하다. 다만 코틀린에서는 함수가 던질 수 있는 예외를 선언하지 않아도 된다.

Reference

Kotlin In Action (드미트리 제메로프, 스베트라나 이사코바)



© 2022. by minkuk

Powered by minkuk