본문 바로가기
개발/자바, 코틀린

[Kotlin] 코틀린 소개 + 입문

by 카펀 2022. 2. 2.

목차

  • 코틀린 개요
  • 제가 공부하는 이유
  • 코틀린 설치 및 확인
  • IntelliJ에서 코틀린 프로젝트 만들기
  • 간단 코틀린 이론

코틀린 개요

코틀린은 어떤 언어일까요? 코틀린의 가장 큰 특징은 '자바와 호환된다'는 점입니다. 이게 무슨 말일까요?
코틀린은 자바와 같이, JVM 상에서 돌아가는 언어입니다.

Kotlin은 Java와 상호 100% 호환됩니다.

코틀린은 우리에게 익숙한 IntelliJ IDEA를 만든 JetBrains 사에서 만들었습니다.
https://kotlinlang.org/에 의하면, Kotlin은 다양한 사용처를 가집니다. 이미 다양한 회사로부터 다양한 모바일 플랫폼에 도입하기 위해 사용되고 있고, Spring, Ktor와 같은 서버-사이드 개발, JavaScript 대체, 구글 공식 안드로이드 개발 지정 등의 성과를 보이고 있습니다.
또한, JetBrains 사는 Kotlin을 통해 IntelliJ IDEA의 판매량을 늘릴 수 있기를 기대한다고 합니다(출처). 이는 어느 정도는 사실인 것 같은데, 자바와 코틀린을 이용하는 개발자들이 IntelliJ IDEA Ultimate를 많이 사용하고 있기 때문입니다 (저를 포함해서!).

 

코틀린의 가장 큰 강점이라면, 자바와 100% 상호 호환된다는 점입니다 (이 말이 자바의 모든 라이브러리가 코틀린 환경에서 완벽하게 동작한다는 뜻은 아닙니다). 따라서 자바에서 사용하던 스프링, 톰캣, 안드로이드 개발 등에서 자바를 사용하던 그대로 코틀린을 사용할 수 있습니다.

코틀린 공식 사이트에서 소개한 내용을 보면, 서버 (백엔드) 개발과 안드로이드 개발에서는 코틀린이 점점 영역을 넓혀 가는 모습입니다. if Kakao 2019에서도 자사 서비스에 코틀린을 도입하며 겪은 경험을 공유한 바 있고, 많은 서버/백엔드 개발자 채용 공고에서 Kotlin을 채용 우대 조건으로 포함시키고 있습니다.

 

국내 유명한 회사들의 경력 서버 개발지 모집 공고

제가 공부하는 이유

저 역시 위에서 소개한 코틀린의 특징 중 여러 부분에 공감하여 코틀린에 관심을 가지고 있습니다.

저는 현재 자바와 스프링을 주로 다루고 있지만, 그리고 한국에서는 현재 자바 공화국이라는 별명이 있을 정도로 자바와 스프링이 지배적인 환경이지만, 이 환경이 영원히 간다는 보장은 없습니다. 불과 5년 후에는 코틀린, 또는 다른 언어가 점차 대세가 되어 가고, 10년 후에는 지배적인 위치에 올라 있을 수도 있습니다 (아마 전자정부표준프레임워크에 코틀린이 선정된다면...).

그렇다면 코틀린이 자바를 대체할 것이라고 확신하냐면, 그건 또 아닙니다. 현재로써 가능성이 있다는 것 뿐이지, 앞으로의 일은 어떻게 될지 아무도 모릅니다. 그럼에도 공부하는 이유는, 코틀린을 공부해야 최신 개발 트렌드를 따라갈 수 있고, 또 코틀린을 공부해 보면 나중에 다른 언어가 필요하더라도 또 공부할 수 있을 것입니다.

 

Kotlin 관련 서적들

저는 책을 따라가며 새로운 것을 배우는 방법을 좋아합니다 (책만 고집하지는 않습니다). 책을 따라가며 과정을 익히다 보면 학습하는 과정이 쉽게 느껴지기 때문입니다. 물론 책을 따라하는 것으로만 그치지 않고, 배운 내용을 토대로 직접 무언가 해 보는 과정은 필수입니다.

Do it! 코틀린 프로그래밍은 제가 고른 책은 아니고, 동생이 연구실 인턴을 하던 시절에 필요해서 샀던 책인데, 겸사겸사 저도 같이 보기로 했습니다. Do it! 시리즈는 저도 자주 봤던지라, 이번에도 재밌게, 깊이 있게 내용을 따라갈 수 있을 것 같습니다. 단 책을 처음부터 끝까지 꼼꼼히 볼 생각은 아니고, 중간중간 필요한 내용만 참고하며 블로그에 정리할 예정입니다.

Kotlin in Action은 위에서 언급해던 if Kakao 2019 발표 중에 언급되었던 책인데, 코틀린에 대해 조금 더 깊이 있게 공부하게 된다면 보고 싶은 책입니다.

 

코틀린 설치 및 확인 (macOS)

코틀린은 자바 가상머신 (JVM) 위에서 동작하므로, 자바가 설치되어 있어야 합니다.

우선 자바가 설치되어 있는지 터미널을 통해 확인해 봅니다.

 

java -version

 

저는 자바 15가 설치되어 있네요. 좋습니다.

 

macOS에서는 homebrew를 이용하여 개발 환경 셋팅을 매우 편리하게 진행할 수 있습니다.

 

다음 명령어를 입력하여 코틀린을 설치합니다.

 

brew install kotlin

 

성공적으로 설치되었는지 확인해 보려면 아래와 같이 입력합니다.

 

kotlinc -version

 

성공적으로 설치되었다면 위와 같은 메세지가 등장합니다.

 

간단한 코틀린 코드를 작성해 봅시다.

 

kotlinc-jvm

 

 

:quit 을 입력하면 종료할 수 있습니다.

 

코틀린 설치 및 확인 (Windows)

윈도우에서는 맥과 같은 별도의 설정은 필요 없습니다.

JVM만 잘 설치되어 있으면 됩니다. 따라서 Java / JVM이 잘 설치되어 있는지 확인해 보도록 하겠습니다.

cmd를 열고 아래와 같이 입력합니다.

 

java -version

 

제 컴퓨터에는 자바 16이 설치되어 있습니다.

이대로 진행하면 됩니다.

IntelliJ에서 코틀린 프로젝트 만들기

인텔리제이를 열고 새 프로젝트를 생성해 봅시다.

 

 

JVM Console Application / Build System: IntelliJ으로 진행하였습니다.

 

JVM version 1.8, Test framework JUnit 5로 설정되어 있습니다.

그대로 진행하였습니다.

 

 

프로젝트 구성 화면입니다. 자바 때 보던 구성과 매우 흡사하네요.

기본으로 Main.kt 파일이 생성되어 있습니다.

 

실습을 위해서 저 파일을 지우고 새로운 Main.kt 파일을 만들어 보도록 하겠습니다.

src/main/kotlin 디렉토리 아래에 새로운 파일을 만듭니다.

 

 

HelloKotlin.kt 파일을 만들어 봅니다. Class가 아닌 file을 선택하세요.

 

코틀린에서의 메인 함수는 인텔리제이에서 편리하게 처리해 줍니다. main을 입력하고 tab 버튼을 누르면 자동으로 생성됩니다.

만들어진 함수 내에 아래와 같이 입력합니다.

 

println("Hello Kotlin!")

 

 

실행해 보겠습니다. 왼쪽에 보이는 작은 초록색 버튼을 누르고, "Run HelloKotlinKt"를 선택하면, 코드가 빌드되고 실행됩니다.

 

 

간단하게 첫 코틀린 코드를 작성하고 빌드하여 실행해 보았습니다.

 

간단 코틀린 이론

앞서 작성한 코틀린 코드는 자바에서 쓰던 것보다는 많이 단순하죠? 자바에서는 함수(메소드)는 클라스 내부에 위치해 있어야 했는데, 코틀린에서는 그냥 함수만 달랑 써 놓으니 실행이 됐습니다.

사실 코틀린은 앞서 말했듯 JVM 위에서 실행되며, main 함수가 있는 위치에서 자동으로 클라스가 생성됩니다. 이 코드가 자동 생성 되었다는 것을 확인해 볼 수 있습니다.

Tools > Kotlin > Show Kotlin Bytecode를 선택하면 코틀린 코드를 역컴파일 (decompile)할 수 있습니다.

 

Bytecode 창에서 좌측 상단에 있는 Decompile 버튼을 누르면, 아래와 같은 .java 파일이 생성됩니다.

 

우리에게 좀 더 익숙한 형식의 코드가 나왔습니다.

HelloKotlinKt 클라스 내에 메인 함수가 있고, 이 함수가 메세지를 출력하였네요.

 

더 자세히 봅시다.

아래에 보면 main 메소드가 작성되어 있습니다. 자바에서 다뤄서 이미 아는 내용이지만...

public은 이 메소드가 public, 즉 클라스의 외부에서도 접근 가능함을 의미합니다. static은 정적임을 의미하는데, 즉 프로그램의 메모리 영역 중 정적 영역에 객체가 만들어지며, 따라서 객체의 생성 없이 호출해 사용할 수 있게 됨을 의미합니다. final은 더 이상 내용이 불변함을 의미하고, void는 메소드의 반환 자료형을 의미합니다 (void이므로 아무것도 반환하지 않겠네요).

 

한 가지만 더 추가해서 설명하자면, static이 메모리의 정적 영역에 생성된다고 언급했습니다. 일반적으로 우리가 아는 프로그램의 메모리 구조는, 코드/데이터/힙/스택 영역으로 이루어져 있습니다. 여기서 자세히 다룰 내용은 아니니 다른 내용은 넘기겠습니다.

JVM에서는 코드/데이터 영역을 묶어서 '정적 영역 (static area)'라고 부릅니다. 이 부분에는 전역변수와 static이 붙은 정적 멤버 변수를 저장합니다. 이 영역에 있는 내용은 프로그램 시작 시부터 종료 시까지 계속 메모리에 남아 있기 때문에, 전역 변수 및 정적 멤버 변수를 너무 많이 생성하여 사용하는 것은 메모리를 비효율적으로 사용하는 방법입니다.

 

예전에 네이버 면접 준비하면서 되게 자세히 공부했는데... 기회가 된다면 추후에 메모리 구조에 대해서 자세히 정리해 보겠습니다.

 

앞서 우리가 생성한 코틀린 코드의 메인 함수는 별다른 인자가 없었지만, 아래와 같이 인자를 포함할 수도 있습니다.

 

fun main(args: Array<String>) {

}

 

이걸 자바에 비유해 보면 아래의 코드와 같습니다.

 

public static void main(String args[]) {

}

 

args는 main에 전달할 외부의 인자를 가리키고, 입력받은 값이 args[] 배열에 차례로 들어가게 됩니다.

이 args를 사용하는 코드를 작성해 봅시다.

 

fun main(args: Array<String>) {
    println(args[0])
    println(args[1])
    println(args[2])
    println(args[3])
}

 

실행해 보면, 정상적으로 실행되지 않고 ArrayIndexOutOfBoundsException이 뜹니다.

당연합니다. args에 값을 할당하지 않았으니까요.

 

명령행 인자를 별도로 설정할 수 있습니다. IntelliJ의 기능을 사용할 수도 있습니다.

Run > Edit Configurations를 선택하고, Configuration > Program arguments 내에 명령행 인자를 입력합니다.

 

이후 다시 실행해 보자.

 

입력한 값들이 인자로 전달되어 출력되는 모습입니다.

 

앞으로도 이렇게 코틀린의 내부적인 동작 원리 등을 자세히 다루어 글을 쓸 예정입니다.

 

 

* 이 글의 내용 중 일부는 'Do it! 코틀린 프로그래밍' (이지스퍼블리싱, 황영덕 저)의 내용을 참고하였습니다.

댓글