Sitemap
백중원 (Leopold)

백중원 (Leopold)

스타트업에서 ‘트리플’ 이라는 여행 서비스를 개발하고 있습니다. 디지털 노마드와 조기 은퇴를 꿈꾸는 평범한 개발자입니다.

[Kotlin] Kotlin Basic Syntax

8 min readJun 4, 2017

--

Press enter or click to view image in full size

Kotlin 역시 Java 와 같은 JVM 환경 위에서 동작하기 때문에 기존에 Java를 경험해본 개발자라면 익숙한 부분이 꽤 있을 것이다. 오늘은 Kotlin의 간단한 문법과 함수 정의 등에 대해서 살펴볼 것이다.

Defining functions

우선 함수 정의에 대해서 살펴보자. 기초부터 차근차근 진행해 나갈 것이다. 인자 두 개를 전달받아서 인자 두 개의 값을 반환하는 sum 함수를 정의한다고 해보자. 이 함수를 Java로 작성한다면 아래와 같을 것이다.

그렇다면 Kotlin으로 표현하면 어떨까? 위 함수의 Kotlin 버전은 아래와 같다.

위의 Java 버전과는 조금 다른 것이 보일 것이다. Kotlin은 함수를 정의할 때 fun 키워드를 붙여준다. Java에서는 type을 변수명 앞에 지정했다면 Kotlin은 변수명 뒤에 type을 지정해준다. Kotlin의 Coding Convention을 따르자면 Colon은 변수나 함수 리턴 표현에서는 type과 space를 두고 표현한다. 또한 Java와는 다르게 Semicolon을 사용하지 않는다. 위 함수 정의에서 Kotlin은 한단계 코드의 양을 줄일 수 있다.

위와 같이 한 줄로 표현이 가능하다. Return type이 생략된 것을 볼 수 있는데 위와 같이 표현할 경우 컴파일러의 타입 추론 기능으로 인해 생략이 가능하고 생략을 하지 않아도 된다.

함수에 대해서 한걸음 더 들어가고 싶지만 쓰다 보니 내용이 길어질 것 같고 별도로 함수만 포스팅하는 게 좋을 것 같아서 함수는 맛보기로 여기까지만 하는 게 좋을 것 같다.

Defining local variables

Kotlin에서는 변수를 선언할 때 Mutable과 Immutable로 선언할 수 있다. Java를 예로 들면 변수에 final 키워드를 지정함으로써 변수를 Immutable로 선언할 수 있었지만 약간은 Optional 한 개념이었다고 볼 수 있었다. 하지만 Kotlin은 변수를 Mutable이든 Immutable이든 선택을 강제한다. Kotlin에서 Mutable한 변수를 선언할 때는 var 키워드를 사용한다. 반대로 Immutable한 변수를 선언할 때는 val 키워드를 사용한다. Javascript를 해보신 분이라면 var 키워드가 반가울 수도 있겠다.

val 키워드로 지정된 변수는 Immutable이다. 변수 선언과 동시에 초기값을 지정해줘야 한다. 하지만 위에서 변수 c 와 같이 타입을 지정했다면 초기값을 선언과 동시에 지정하지 않아도 컴파일 에러는 발생하지 않는다. 하지만 Immutable 변수는 선언과 동시에 초기값을 넣어주는 게 좋은 습관이다. 위에서 변수 b 같은 경우 타입을 지정하지 않고 타입 추론에 의지하게 될 경우 c처럼 초기값 생략이 불가능하다.

Mutable 변수는 var 키워드를 이용해서 선언한다. 당연히 Mutable이기 때문에 초기값을 강제하지도 않고 초기값이 지정되었더라도 값이 변경 가능하다.

If expression

Kotlin의 조건문 표현식은 Java와 얼핏 크게 차이가 없어 보인다. 우선 간단한 조건문 코드를 살펴보자.

이렇게만 보면 Java와 크게 차이가 없어 보인다. 위 함수를 조금 Kotlin스럽게 변경해 보겠다.

If Expression이라고 하는 이 표현식은 Java의 삼항식과 비슷해 보인다. 7줄짜리 함수 선언이 1줄로 표현이 가능하다니 정말 매력적이지 않은가? 함수뿐 아니라 변수에도 적용이 가능하다. 아래는 변수에 If Expression을 적용한 것이다.

When Expression

Kotlin에서는 Java의 switch 표현식이 없다. Java의 switch 표현식을 Kotlin에서는 When이라는 표현식으로 정의할 수 있다. 우선 Java 버전의 switch 표현식을 작성해보자.

위의 코드를 Kotlin으로 표현하자면 다음과 같다.

코드가 간결해지긴 했지만 이것만으로 만족할 수는 없다. 여기서 호기심이 많으신 분이라면 궁금한 게 생길 것이다. Java의 switch에서는 매칭 되는 조건을 여러 개 걸 수가 있기 때문에 break 구문이 필요하다. 하지만 위의 Kotlin 코드에서는 예를 들어 x가 1과 2일 때 같은 처리를 하고 싶다고 가정을 했을 경우 어떻게 처리해야 할지 감이 오지 않을 것이다. 의외로 간단하다. 아래는 x가 1과 2일 때 동일한 처리를 하는 코드이다.

그냥 ,를 이용해 연속해서 정의해주기만 하면 된다. 또한 range를 지정해줄 수 도 있다. 아래는 x 값의 범위를 체크하는 구문이다.

Java에서의 switch 구문보다 훨씬 간결해지고 다양한 표현이 가능한 것을 확인할 수 있다.

Null Safety

Java에서는 가장 흔하고 귀찮은 처리 중에 하나가 NullPointerException 일 것이다. Null check를 위한 Boilerplate code들로 인해 코드의 양이 증가하고 가독성을 저해하는 일이 비일 비재 하다. 물론 Java 8에서 Optional이 나오긴 했지만 Kotlin은 이러한 Nullable과 Non-Null에 대한 처리에 신경을 많이 쓴 게 느껴졌다.

The Billion Dolor Mistake라고 불리는 내용인데 type system에서 null reference 처리에 대한 경각심을 일깨워주는 내용이다.

Get 백중원 (Leopold)’s stories in your inbox

Join Medium for free to get updates from this writer.

Kotlin은 우리의 코드에서 NPE 오류를 제거하는데 초점을 맞춰서 type system을 설계하였다고 한다. Kotlin에서 NPE 오류가 발생 가능한 케이스는 아래와 같다고 한다.

  1. 명시적으로 throw NullPointerException()를 호출한 경우
  2. 외부의 Java 코드에서 NPE가 발생한 경우
  3. !! Operator를 사용한 경우
  4. 초기화 관련해서 데이터 불일치가 있을 경우

Kotlin에서는 변수가 Null이 될 수 있는지 될 수 없는지 미리 지정해줄 수 있다.

일반적으로 변수 선언 시 Null 값을 대입하는 것을 허용하지 않는다. 하지만 타입 선언 뒤에 ?를 붙여줌으로써 Null 값을 대입하는 것을 허용한다. ? 가 선언되지 않은 변수에 Null을 대입하는 코드를 작성하게 되면 컴파일 에러가 발생한다.

Kotlin은 컴파일 타임에 NPE 발생 가능성을 강력히 제한한다. 아래는 ? 가 붙은 변수와 그렇지 않은 변수의 Property에 접근하는 코드이다.

a는 Null을 허용하지 않는 변수이고 b는 Null을 허용하는 변수이다. a 변수의 length에 접근하려고 할 때 Kotlin은 NPE가 발생하지 않을 것이란 걸 보장한다. 하지만 b 변수는 Null을 허용하는 변수기 때문에 b 변수의 length에 접근하려는 코드를 작성하면 b가 Null 일 수 있기 때문에 컴파일 에러가 발생한다.

보통 변수 선언 시 Null 값을 허용할지 안 할지 판단할 수 있지만 예외적인 경우도 있다. 서버와 클라이언트 간에 데이터를 연동할 때 모델의 property가 Null을 허용하지 않겠다고 정의를 했다고 해도 서버의 오류로 인해 Null이 포함될 수도 있기 때문에 안전하지 않을 수 있다.

Kotlin에서는 ? 를 이용해서 Null에 안전한 호출을 지원한다. 주로 method chain에서 유용하게 쓰일 수 있는데, 예를 들어 Company라는 모델에 Department가 있고 Employee가 있고 Employee의 name을 가져오는 코드를 작성한다고 가정해 보자. 이것을 Java로 Null에 안전하게 작성한다면 끔찍할 것이다.

보다 극단적으로 표현하기 위해 위와 같이 코드를 작성했다. 눈살을 찌푸리게 하는 코드가 아닐 수 없다. 위와 같은 내용을 Kotlin으로 표현하고 한다면 아래와 같이 작성할 수 있다.

Java에서의 끔찍했던 코드들을 Kotlin은 간단하게 한줄로 표현할 수 있다. 위와 같이 작성하는 것을 Safe Calls라고 하는데 위 코드에서 company, department, employee 중 어느 하나라도 null일 경우 다음 property에 접근하지 않고 null을 return하게 된다. 우리가 Java에서 원하던 것이 이런것이 아니였을까 생각이 된다.

마치며

위에 설명한 내용만 봐도 Java 대비 Kotlin의 장점이 뚜렷이 보일 것이다. 비록 많은 내용을 담지는 못했지만 이 정도만 봐도 상당히 매력적인 언어라고 생각이 들 것이다. 내용이 많지는 않지만 잘못된 정보를 전달하지 않으려고 노력하다 보니 생각보다 포스팅 작성에 시간이 오래 걸렸다. 앞으로 Kotlin 관련 포스팅을 진행하면서 Kotlin 학습을 위한 샘플 코드를 Github에 추가해나갈 예정이다.

아직 걸음마 단계라 거의 내용이 없지만 지속적으로 추가해나갈 예정이다.

Kotlin에 관심 있거나 Kotlin을 배워가는 분이라면 학습용 코드를 Pull Request를 통해 보내주시기 바랍니다.

creative-commons-by-21pxcreative-commons-nc-21pxcreative-commons-sa-21px

--

--

백중원 (Leopold)
백중원 (Leopold)

Written by 백중원 (Leopold)

스타트업에서 ‘트리플’ 이라는 여행 서비스를 개발하고 있습니다. 디지털 노마드와 조기 은퇴를 꿈꾸는 평범한 개발자입니다.