3월 25일 안드로이드 컨퍼런스가 열립니다. 드로이드 나이츠 정보 보러가기

Android를 Kotlin으로 연습하면서 코틀린 플러그인을 통해 제공하는 Convert Java를 이용하여 기본 문법을 익혔습니다. 그와 Kotlin에서 제공하는 기본 문법을 정리하였습니다.


코틀린 기본 문법

코틀린은 ;을 사용하지 않고, 아래와 같이 변수 타입이 뒤에 붙는 형태입니다.

또한 변수 타입을 지정하지 않을 수도 있습니다.

// java
int temp = 10;

// Kotlin
val temp: Int = 10
var temp: = 15


코틀린 기본 문법 - val, var

코틀린에는 2가지 변수 선언 방식이 있습니다.

  • val : 변할 수 없는 상수 Java : final, C/C++ 등에서는 const
  • var : 일반적인 변수에 해당합니다.

val

val은 read-only이면서 로컬 변수가 됩니다. java에서는 final, c/c++에서는 const에 해당합니다. 초기화 이후 변할 수 없는 값을 말하게 됩니다.

val a: Int = 1
val b = 1  // Int를 추론할 수 있습니다.
val c: Int  // Int를 초기화해주어야 하는데 생성자에서 초기화해야 합니다.
  c = 100 // 생성자 시점에서 초기화해주지 않으면 문법상 오류가 발생합니다.

var

var은 일반적인 변수에 해당합니다.

var x = 5 // Int를 추론할 수 있음
x += 10

// 추론은 가능하지만 실제 값이 Int가 아니더라도 오류가 발생하지는 않음
var x: Int = 1 // Int를 고정
x = 15

var은 val과 달리 값이 변할 수 있습니다.

val과 var 두 개 모두 Int, Long 등의 타입을 지정할 수도, 없을 수도 있습니다.

지정하지 않아도 추론을 통해서 Int 인지 String 인지 확인이 가능하지만, 이 경우 코드의 실수를 할 수 있으므로 지정하는 게 좋을 것 같습니다.


코틀린 기본 문법 - 함수 생성

자바에서는 아래와 같이 함수를 생성합니다.

public int sum(int a, int b) {
  return a + b;
}

위의 코드를 Kotlin으로 변환하면 아래와 같은 형태가 만들어집니다.

fun sum(a: Int, b: Int): Int {
  return a + b
}

가장 기본적인 Kotlin 형태로 변환하면 위와 같습니다.

Java와 기본 형태가 다른데 왼쪽에

int 함수명(변수 타입 변수명) { return 값 }

을 가지는 반면 Kotlin은

fun 함수명(변수명: 변수 타입): 리턴 타입 { return 값 }

의 형태를 가지게 됩니다.

코틀린은 좀 더 단순하게 만들 수 있습니다.

// 아래와 같이 Type을 정의하여 return을 정의하거나
fun sum(a: Int, b: Int): Int = a + b
// 또는 아래와 같이 바로 return도 가능합니다.
fun sum(a: Int, b: Int) = a + b

한 줄로 표현도 가능합니다. 변수 타입을 명시하거나, 하지 않을 수도 있고 = 을 이용하여 단순히 이 함수가 리턴을 의미하도록 함축적으로 표현 할 수 있습니다.

함수에 조건식을 추가하면 다음처럼 됩니다.

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

위의 코드를 Kotlin에서 단순하게 한 줄로 처리하면

fun max(a: Int, b: Int) = if (a > b) a else b

위와 같이 단순하게 if 문을 포함하여 한 줄로 줄여줄 수 있습니다.

의미는 똑같습니다. a가 b보다 크면 a를 return 하고 아니면 b를 리턴하게 됩니다.


코틀린 기본 문법 - null

코틀린의 기본 변수는 null을 가질 수 없습니다.

var a: Int = 15
a = null // 문법상 오류 발생

var b: Int? = null
b = null  // 정상 수행

위와 같이 물음표를 추가해주었을 때만 null을 명시할 수 있습니다.

  • nullable : ?
  • nullable 이면 오류 발생 : !!

물음표와 느낌표 2개를 사용하는 경우가 있습니다. 일단 의미는 위와 같습니다.

물음표는 null이고, !!는 nullable 이면 오류가 발생하게 됩니다.

함수에서 null은 다음과 같이 정의할 수 있습니다.

  • 아래 함수는 ABC 객체의 a를 return 하게 됩니다.
  • 이때 a는 Int이면서 null이 될 수 있도록 return type에 물음표를 추가하였습니다.
// ABC 객체의 .a를 return 하지만 abc가 null이면 null을 리턴합니다.
fun abc(abc: ABC?): Int? {
  // ...
  return abc?.a
}


코틀린 기본 문법 - Any 사용하기

type을 Any라는 키워드로 지정할 수 있습니다.

fun getStringLength(obj: Any): Int? {
  if (obj is String) {
    // 'obj' is automatically cast to 'String' int this branch
    return obj.length
  }
  // 'obj' is still of type 'Any'
  // Type이 String이 아니라서 null을 return 하게 됩니다.
  return null
}

Any는 Java의 Object에 해당 대며 is는 instanceof와 같은 행동을 합니다.

위의 형태를 java 코드로 구현하면 다음과 같습니다.

int getStringLength(Object obj) {
  if (obj instanceof String) {
    return obj.length;
  }

  return 0;
}

is String이 아님을 나타낼 대는 is앞에 “!” 간단하게 부정할 수 있습니다.

// Java에서는
int getStringLength(Object obj) {
  if (!(obj instanceof String)) return 0;
  return obj.length;
}

// Kotlin
fun getStringLength(obj: Any): Int? {
  if (obj !is String) return null
  return obj.length
}


코틀린 기본 문법 - loop

코틀린의 loop는 Java와 비슷합니다.

for loop은 아래와 같이 java와 Kotlin을 정의할 수 있습니다.

while이나 fori도 비슷합니다.

// Java for
ArrayList<String> arrayList = new ArrayList<>();
for (String s : arrayList) {
    Log.d("TAG", "string : " + s);
}

// Kotlin
val arrayList = ArrayList<String>()
for (s in arrayList) {
    Log.d("TAG", "string : " + s)
}


코틀린 기본 문법 - when

코틀린에는 when이라는 키워드가 있습니다.

when은 if 문을 중첩하여 사용하지 않고 간단하게 Any와 함께 구현이 가능합니다.

fun main(args: Array<String>) {
    cases("Hello") // String
    cases(1) // Int
    cases(System.currentTimeMillis()) // Long
    cases(MyClass()) // Not a string
    cases("hello") // Unknown
}

fun cases(obj: Any) {
    when (obj) {
        1 -> println("One")
        "Hello" -> println("Greeting")
        is Long -> println("Long")
        !is String -> println("Not a string")
        else -> println("Unknown")
    }
}

위의 예제를 실행하면 결과는 아래와 같습니다.

Screenshot 2016-07-31 21.32.16


코틀린 기본 문법 - ranges

숫자의 범위를 지정하여 사용하는 방법입니다.

이해하기 쉽도록 for loop에서 사용하는 방법을 먼저 설명해보겠습니다.

java의 for 문에서는 i = 1에서 5까지 출력하는 방법을 아래와 같이 작성하였습니다.

// java
for (int i = 1; i <= 5; i++) {
  Log.i("TAG", "index : " + i);
}

코틀린에서는 ranges를 통해서 아래와 같이 1~5까지의 값을 출력하는 for loop을 만들 수 있습니다.

// Kotlin
for (x in 1..5) {
  println(x)
}

Kotlin에서는 ranges 형태를 if 문에서도 사용 가능합니다.

val array = arrayList<String>
array.add("aaa")
array.add("bbb")

val x = 3

if (x !in 0..array.size - 1)
  println("Out: array 사이즈는 ${array.size} 요청한 x = ${x}")

//위의 출력 값은
// Out: array 사이즈는 2 요청한 x = 3


마무리

코틀린 기본 문법을 정리해보았습니다.

코틀린은 안전한 null을 처리할 수 있도록 지원하고 있습니다.

기본 문법에서 보았던 null 처리에 대해서 조금더 상세하게 다루어보고, Idioms, Generics 도 다루어 보도록 하겠습니다.

이런 부분은 추후 하나씩 정리해보도록 하겠습니다.

우선 다음 첫 번째 예제로 Generics 부분과 Idioms을 간단하게 살펴보고 Basic adapter 예제를 다루어보도록 하겠습니다.


kotlin 관련 글 더 보기


Tae-hwan

Android, Kotlin .. Create a content development.