코틀린은 서버사이드, 안드로이드 앱, 프론트엔드 개발에 전부 다 사용할 수 있는 몇 안되는 풀스택 개발언어 중 하나이다. Java bytecode의 컴파일링, Javascript로써의 트랜스파일링 또한 가능하다.
자바, 코틀린은 정적 타입 지정 언어이다. 정적 타입 언어는 프로그램의 구성 요소의 타입을 컴파일 시점에 알 수 있다. 따라서 코드를 작성할 때 변수에 들어갈 값의 형태에 따라 직접 변수의 타입을 명시해줘야 한다. 예를들어 다음과 같은 java 코드이다.
String myName = "sungjun"
int myAge = 18
이런 정적 타입 코드는 런타임 환경 진입전에 컴파일러가 타입을 검증해줌으로써 프로그램에 대한 안정성을 보장 받을 수 있다.
자바와 살짝 다른점이 있다면 코틀린은 코드의 문맥을 통해 자료형을 유추할 수 있다. 코틀린 컴파일러가 다음과 같이 문맥으로 변수 타입을 자동적으로 유추(type inference)하기 때문에 타입 선언을 생략해도 된다. (JAVA SE 10에서도 컴파일러가 문맥으로 타입을 유추하는 기능이 추가되었다.)
var myAge = 18 // 변수 myAge가 Int 타입이라는 것을 문맥을 통해 유추한다.
동적 타입 언어란 컴파일 환경이 아닌 런타임 환경에서 자료형이 결정되는 언어를 뜻한다. 유연성이 높고 빠르게 코드를 작성할 수 있는 장점이 있지만 정적 타입 언어에 비해 type error가 발생할 위험이 높아 코드의 안정성이 떨어진다는 단점이 있다.
# 파이썬은 대표적인 동적 타입 언어이다.
name = 10
my_age = "sungjun"
kotlinc-jvm
Welcome to Kotlin version 1.4.21 (JRE 15.0.2+7-27)
코틀린 REPL (Read Evaluate Print Loop) 커맨드라인 쉘을 실행하여 간단한 코드를 실행해볼 수 있다.
kotlinc-jvm
>>> val myName = "sungjun"
>>> myName
res2: kotlin.String = sungjun
>>> println(myName)
sungjun
간단한 코드확인이 가능하다. :quit
를 입력하면 쉘이 종료된다.
간단하게 Hello World가 출력되는 코틀린 소스파일 작성해보자.
fun main() = println("Hello World")
다음으로 코틀린 소스파일을 컴파일 해보자. 코틀린 코드를 컴파일 하는 방법은 다음과 같다
kotlinc-jvm <소스파일 or 디렉터리> -d <jar 이름>
kotlinc-jvm hello.kt hello.jar
Kotlin in Action에서 가져온 코틀린 코드 컴파일러에 대한 설명이다
코틀린 컴파일러는 자바컴파일러가 자바 소스코드를 컴파일할 때와 마찬가지로 코틀린 소스코드를 분석해서 .class 파일을 만들어낸다. 만들어진 .class 파일은 개발 중인 앱 유형에 맞는 표준 패키징 과정을 거쳐 실행될 수 있다.
. . .
코틀린 컴파일러로 컴파일한 코드는 코틀린 런타임 라이브러리에 의존한다. 런타임 라이브러리에는 코틀린 자체 표준 라이브러리 클래스와 코틀린에서 자바 API 의 기능을 확장한 내용들이 들어있다. 코틀린으로 컴파일한 앱을 배포할 때는 런타임 라이브러리도 함께 배포해야 한다.
JAVA와 컴파일 과정은 비슷하지만 다른 컴파일러를 사용하며, 실행 시 코틀린 런타임 라이브러리를 통해 애플리케이션이 실행된다. 좀 더 세부적으로 들어가자면, 과정은 다음과 같다.
성공적으로 컴파일 되었다면 현재 디렉터리 내에서 hello.jar라는 JAR file이 생성된것을 확인할 수 있다. JAR(Java Ahchive) 파일이란 여러개의 자바 클래스 파일과, 그 클래스들이 이용하는 리소스와 메타데이터를 하나로 묶어서 자바 플랫폼에 배포하기 위한 소프트웨어 패키지 파일 포맷이다. JAR 파일을 살펴보면, 실제로 ZIP 파일 포맷으로 이루어진 압축 파일이다.
vi hello.jar
1 " zip.vim version v30
2 " Browsing zipfile /Users/jinsungjun/devel/kotlin_test/hello.jar
3 " Select a file with cursor and press ENTER
4
5 META-INF/MANIFEST.MF
6 HelloKt.class
7 META-INF/main.kotlin_module
jar 파일은 다음과 같은 명령어로 실행시킬 수 있다. kolin 옵션을 사용하면 -jar 옵션 없이 실행할 수 있다.
java -jar hello.jar
Hello World
kotlin hello.jar
Hello World