코틀린 입문 스터디 (3) Basics

mook2_y2
5 min readFeb 18, 2019

--

스터디파이 코틀린 입문 스터디 (https://studypie.co/ko/course/kotlin_beginner) 관련 자료입니다.

코틀린 입문반은 Kotlin을 직접 개발한 개발자가 진행하는 Coursera 강좌인 “Kotlin for Java Developers” (https://www.coursera.org/learn/kotlin-for-java-developers) 를 기반으로 진행되며 아래는 본 강좌 요약 및 관련 추가 자료 정리입니다.

목차

(1) Introduction

(2) From Java to Kotlin

(3) Basics

(4) Control Structures

(5) Extensions

(6) 실습 : Mastermind game

(7) Nullability

(8) Functional Programming

(9) 실습 : Mastermind in a functional style, Nice String, Taxi Park

(10) Properties

(11) Object-oriented Programming

(12) Conventions

(13) 실습 : Rationals, Board

(14) Inline functions

(15) Sequences

(16) Lambda with Receiver

(17) Types

(18) 실습 : Game 2048 & Game of Fifteen

1. “Hello, world” example (6m)

  • 생략

2. Variables (6m)

  • Kotlin은 정적 타입 언어 (statically typed language) 지만 타입 추론 (type inference)을 지원하여, 코드를 단순화할 수 있어 동적 타입 언어 (dynamically typed language) 의 이점을 가집니다. 하지만 정적 타입 언어이므로 변수에 특정 타입의 값을 할당 하며 다른 타입의 값을 다시 할당하는 경우 컴파일 에러가 납니다. (관련 링크 : 정적언와와 동적언어, 정적타입vs동적타입?? 단순한 언어가 최고!!)
  • 타입 추론은 코드 단순화를 위한 의도로 만들어진 기능이므로, 코드 상에서 타입이 명확히 이해될 경우 타입 추론을 이용해 생략해도 무방하지만, 오히려 생략하므로써 헷갈릴 가능성이 있다면 타입을 명시하는 것을 권장합니다.
  • 한번 할당한 뒤에 변경되어서는 안되는 변수의 경우 가능하면 val을 쓰는 것이 권장됩니다. 보다 코드를 명확히 작성할 수 있어 코드를 이해하기에 좋고, 변경시 컴파일 에러가 발생하여 검증할 수 있으므로 side-effect가 발생할 리스크를 줄일 수 있습니다.
  • 참조형 타입 (reference type)의 경우 변수에 지정된 것은 해당 객체의 reference이므로, 이 경우는 val 키워드로 할당해도 해당 변수를 수정할 수 있습니다.(Ex: val로 객체를 할당하고 멤버변수를 수정하거나, mutable list를 할당하고 원소를 추가하는 행위 등) 즉, val은 재할당이 불가능한 것을 뜻하며 immutable을 뜻하지는 않습니다. (관련 링크 : Java primitive, reverence type 그리고 String)

3. Functions (4m)

// block body
fun max(a: Int, b: Int): Int {
return if (a > b) a else b
}

// expression body (함수 반환 타입 생략 가능)
fun max(a: Int, b: Int): Int = if (a > b) a else b
  • Kotlin에서는 함수를 Block body, Expression body 중 선택하여 정의할 수 있습니다.
  • 함수에 들어가는 Parameter의 경우 반드시 타입을 지정해줘야 하지만, Expression body로 함수를 정의하는 경우에 한해서 함수의 반환 타입은 타입 추론이 되므로 생략하여 코드를 간소화할 수 있습니다. 다만 역시 이 기능은 가독성과 코드 간소화를 위한 것이므로 오히려 헷갈릴 가능성이 있다면 반환 타입을 써주는 것이 좋습니다.
  • Kotlin에서 top-level (클래스 외부)에 정의한 함수의 경우 static 함수로 정의되며 이에 따라 다른 파일에서 사용할 수 있습니다. 한편, Java 코드에서 Kotlin top-level 함수를 사용하고자 할 때는 @file:JvmName("이름") 어노테이션을 이용하여 파일명이 아니라 정의한 이름으로 호출할 수 있습니다.

4. Named & default arguments (6m)

  • Named Arguments를 통해 코드의 가독성과 명시성을 높일 수 있습니다.
  • Named Arguments를 사용할 경우 Parameter를 정의된 것과 다른 순서로 써도 무방합니다
  • Java에서는 특정 함수에 대해 다양한 개수의 Parameter를 지원하려는 경우, Overload를 통해 모든 경우의 수에 대해 정의해줘야 하지만, Kotlin에서는 Default & Named Arguments를 통해 적은 코드로 다양한 경우의 수를 대응할 수 있습니다.
  • 한편 이 기능을 Java 코드에서도 사용하고자 할 경우 함수 위에 @JvmOverloads 어노테이션을 붙여줘야 합니다.

--

--