핵심 코틀린 프로그래밍을 읽고 정리해보자. 이때 각 장을 먼저 읽고, 읽은 내용을 인출하여 적고 빠진 부분을 보완하는 방식으로 정리하자.

요약

1장

코틀린에 대해서 설명 & 설치 방법을 다룬다.

2장

기본적인 변수들, 식, 문 등에 대해 배웠다.

독특한 특징 몇가지가 있었다.

  • val → 불변 변수를 저장(권장)
  • var → 값을 변경 가능한 변수
  • unsigned로 변수를 만들 수 있음
  • 타입 추론을 지원함. 변수 선언시에 타입을 명시해줄 수도 있음.
    • int, long, double 등으로 자동으로 타입을 선언해줌. but 실수의 경우 너무 길면 값이 잘릴 수 있음
  • when이라는게 있음 (if 와 비슷한 느낌)
  • 반복문 내에서 범위 표현은 1..10 과 같이함 (e.g. for(i in 1..10))
  • 원시 배열이라는게 있다. 자바스크립트에서는 배열 내의 각 값들은 참조 값(주소)을 가지는데, 코틀린에서는 배열 생성시 byteArrayOf() 와 같이 원시 배열임을 명시해서 원시 배열로 만들 수 있음
  • do while 문이 있음. 뭘 할지 먼저 적고, while을 통해 뒤에 반복할지 여부를 결정함
  • 배열.indicies 를 통해 배열의 범위를 가져올 수 잇음

    val c = byteArrayOf(1, 2, 3);
    println(c.indices);  // 0..2
    

3장. 함수

다른 언어들과 비슷한 함수 선언, 호출 형태이지만, 코틀린만의 독특한 몇가지 특징들이 있었다.

  • 함수가 아무것도 반환하지 않는 경우 Unit 타입을 가진다
  • 함수를 선언하는 방식에 일반적인 표현식, 익명함수, 람다식이 있다.
    • 람다식의 경우 -> 를 사용하여 나타낸다. return은 사용하지 않음. (e.g. val sum = { x: Int, y: Int -> x + y })
    • 람다의 파라미터가 한개인 경우, it을 사용하여 파라미터를 생략할 수 있다. (e.g. val x: (Int) -> Double = { it * 2.0 } )
      • 어떤 함수가 마지막 인자로 람다를 받을 경우, 함수를 호출할 때 이 마지막 람다를 함수 인자를 넘기는 괄호에서 뺄 수 있다.(e.g. val fourPlus10_2 = let(4){ it + 10 }) -> 개인적으로 뭔가 거부감이 든다…
    • 함수의 매개변수로 람다를 넘기거나 람다를 반환할 수 있으며(고차함수), 람다는 코틀린에서 일급 시민(first-class citizen)으로 취급된다.
    • 람다를 반환하는 고차함수의 경우에 람다식에서 외부 변수를 참조하고 있는 경우, 컴파일러는 반환될 람다를 나중에 호출해도 문제가 없도록 람다가 참조하고 있는 외부 변수들을 포함한 데이터 구조(JS의 lexical environment와 비슷하게 생각됨)를 힙에 저장한다. 이런 구조를 클로저라 한다.
      • 외부 변수를 클로저에 붙들게 되는 현상을 캡처라고 한다.
  • 자바스크립트와 같이 매개변수에 디폴트 값을 설정해줄 수 있다.
  • 함수 호출시 named parameter를 사용할 수 있다. (e.g. sum(x = 1, y = 2))
    • 한번 named parameter를 사용하면 그 뒤에는 모두 named parameter를 사용해야 한다.(왤까?)
  • 함수의 매개변수에 vararg 키워드를 사용하여 가변인자를 받을 수 있다. (e.g. fun sum(vararg numbers: Int) -> Int 타입의 값을 0개 이상의 임의의 개수만큼 받는다는 의미)
    • 함수에서 vararg는 하나만 사용할 수 있다. 주로 마지막 변수 위치에 둔다.
    • 이때 내부에서 numbers는 배열로 취급된다.
    • (컴파일 과정이 있어서 이런 처리가 가능한걸까?)
  • *을 통해 spread operator를 사용할 수 있다. (e.g. sum(*numbers))

4장. 클래스와 객체

WIP…