Kotlin?

LimC·2023년 10월 1일
0

코틀린 공부하기

목록 보기
1/1
post-thumbnail
  • 해당 게시글은 Kotlin language specification을 참고하여 작성하였습니다.
  • 해당 글의 주제에서 벗어나지 않기 위하여 설명을 생략한 부분이 많습니다.
  • limcdevblog@gmail.com

개요

먼저, 저 또한 코틀린을 공부하고 코틀린의 매력에 빠진 사람 중 하나로써 공부한 내용을 공유하고 싶은 마음에 해당 글을 작성하였습니다.

"Kotlin 공부하기" 시리즈의 첫 번째 글로써 해당 글에선 아래와 같은 내용을 알아가실 수 있습니다.

  1. Kotlin은 무엇인지?
  2. Kotlin의 언어적 특징
  3. Kotlin의 언어 외적인 특징
  4. Apple Silicon Mac에서 SDKMan을 활용하여 Kotlin 개발환경구성
  5. Kotlin으로 Hello World 애플리케이션을 만들고 컴파일 후 구동

Kotlin은 무엇인가요?

  • 변수 유형이 명시적으로 선언되어 컴파일 시 정해지는 정적 타입 언어이다.
    - 이는 애플리케이션이 실행되기 전(=런타임이 되기 전) 컴파일 시 에러를 검출할 수 있습니다.
  • 다중 플랫폼에서의 지원을 목표로 하는 언어이다.
    - JVM(Java Virtual Machine)
    - JS(JavaScript)
    - Native(다양한 아키텍처에서 사용할 수 있는 Binary)
    - Kotlin MPP(Kotlin Multiplatform Project) 에서의 피처를 통하여 다른 플랫폼 간의 상호 운용성을 지원합니다.

  • 객체 지향 언어지만 함수형 프로그래밍 요소를 포함하고 있다.
    - 함수형 프로그래밍의 요소로 고차 함수(함수에서 함수를 리턴), 람다식(함수를 식으로 표현) 등을 지원합니다.
  • 코틀린의 중요 개념은 실용적이라는 것이다. 실제로 코틀린의 spec 설계 중 많은 결정이 Kotlin 사용자들에게 얼마나 유익할 것인가를 고려한다고 합니다.
    - 나의 생각이지만 해당 개념이 매우 중요하다고 생각한다. 코틀린은 실용적이어야 한다. 제 주관적 의견이기에 취소선 처리 해놨습니다. 해당 내용은 생략하셔도 됩니다.
    - 이 장점은 생산성 향상, 코드의 가독성 향상 그리고 그에 따른 버그 감소와 유지보수의 용이성으로 이어집니다.
    - 또한 Java 진영에서 사용하는 Spring, SpringBoot 또한 코틀린으로 사용이 가능합니다. 더 간결한 언어로 Java 진영의 강력한 툴들을 사용할 수 있다는 장점이 있습니다.

Kotlin의 언어적 특징

해당 내용은 나무위키를 일부 참조하였습니다. 특징 일부를 참조하였고, 그에 따른 설명과 예시를 추가하였습니다.

  • 간결하고 실용적인 문법을 제공한다.
// Java
final Post post = new Post();
// Kotlin
// 먼저 상수임을 final이 아닌 val로 나타내었다.
// 그리고 new 키워드를 생략한다.
val post:Post = Post()
  • 모든 함수가 리턴 값을 가진다.
    - 후에 다른 게시글에서 다룰 예정이지만 void 를 사용하지 않고 return이 없는 경우 Unit이나 Nothing 를 반환합니다.
  • Null 안정성을 제공한다.
    - Kotlin에선 ?(물음표) 를 사용하여 해당 변수 타입이 Nullable(널 값이 사용가능한지)와 NotNull(널 값을 사용할 수 없는지)로 나뉩니다.
// Null can not be a value of a non-null type String 
// 위 문구와 함께 컴파일 에러가 납니다.
val hello:String = null
// 문제 없음!
val hello2:String? = null
  • Java나 다른 언어에서 사용하는 원시 타입은(int, boolean 등...) 모두 Kotlin에선 객체로 취급합니다.
  • == 와 != 연산자는 Java와는 다르게 동일성이 아니라 동등성을 체크합니다.
    - 예) Java 에서의 동등성 비교
String limc = "limc";
// 동일성 비교로 false, limc 변수의 주소와 "limc"가 존재하는 주소를 비교
System.out.println(limc == "limc") 
// 동등성 비교로 true, limc의 값인 "limc"와 "limc"의 값이 같은지 비교
System.out.println(limc.equals("limc")) 
  • Java와의 상호 운용을 100% 지원한다.
    - 하지만 Java에서 Kotlin 언어를 사용 시 추가적인 어노테이션 사용이 필요한 경우가 있습니다.

특징 중 코루틴 지원, 클래스 상속, 예외 처리 관련된 내용은 제외하였습니다. 이는 추후 별도 게시글로 다루겠습니다.

Kotlin 언어 외적인 특징

  • 흔히 알려진 Intellij, webstorm, pycharm 등을 개발한 JetBrains 에서 공개한 언어이다.
  • 현재 2023년 8월 20일 기준으로 1.9.0 버전이 최신버전입니다.
  • 안드로이드의 공식언어입니다. (이전엔 Java였습니다.)

Kotlin 개발환경구성 (Apple Silicon Mac + SDKMan 사용)

제 개발환경 구성은 아래와 같습니다.

  • M2 + macOS Ventura 13.5
  • SDKMan 사용
    위 두 가지 환경에서 설치를 진행합니다. 운영체제나 하드웨어적인 부분에 따라 설치 과정에 차이가 있을 수 있습니다.

SDKMan(https://sdkman.io)


JAVA 관련 개발자 도구를 쉽게 관리해 주고 설치할 수 있게 돕는 툴입니다. 사용법이 간단하며 아래와 같은 특징을 가지고 있습니다.

  • 별도의 사이트에 들어가 다운로드 받을 필요 없이 CLI를 통해 간단히 개발자 도구를 설치할 수 있습니다.
  • _HOME, PATH 등 환경변수 설정이 따로 필요 없습니다.
  • Rust 와 bash 로 작성되어 os에 curl, zip, unzip 와 같은 종속성만 있으면 실행이 가능합니다.
    - 당연히 zsh에서도 작동합니다.
  • macOS나 Linux 같은 UNIX 기반 플랫폼에서 원활하게 작동합니다.
    - Windows의 WSL에서도 사용이 가능합니다.

SDKMan을 이용한 JDK 및 Kotlin SDK 설치


사용법은 매우 간단합니다.

  1. curl 설치 여부 확인
    먼저 curl이 설치되어있는지 확인하기 위해 터미널에서 아래와 같이 입력합니다.
> curl
# 아래와 같이 출력된다면 curl이 설치되어 있는 상태입니다.
curl: try 'curl --help' or 'curl --manual' for more information

기본적으로 Linux나 macOS에는 기본으로 탑재되어있습니다. 만약 curl이 설치되어있지 않다면 자신의 운영체제에 맞는 curl 설치법을 검색하여 설치해주세요

  1. curl을 이용하여 SDKMan 설치하기
> curl -s "https://get.sdkman.io" | bash	

해당 명령어를 실행하면 SDKMan 설치 쉘파일을 가져오고 해당 쉘파일을 실행하여 자동으로 설치를 진행합니다. 설치가 정상적으로 완료되었다면 아래 명령어를 입력해주세요.

> source "$HOME/.sdkman/bin/sdkman-init.sh"	

별다른 오류 없이 진행되었다면 아래 명령어를 입력하여 SDKMan이 정상적으로 설치되었는지 확인합니다.

> sdk version
# 아래와 같이 출력됩니다.
SDKMAN!
script: 5.18.2
native: 0.4.2
  1. Kotlin은 JDK 8에서도 사용가능합니다. 하지만 저는 현재 스프링부트3를 사용하고 있어 JDK 17을 설치할 예정입니다. SDKMan을 사용하여 JDK 17을 설치해보겠습니다.
> sdk l java

"sdk l java" 를 입력한다면 위와 같이 사용 및 설치가 가능한 JDK 리스트가 출력됩니다. 너무 많은 종류에 당황하지 마시고 Version과 Identifier만 주의해서 봐주세요.

전 아마존에서 제작한 Corretto OpenJDK를 설치하겠습니다.

그 중에서도 버전 17에서 가장 높은 버전인 17.0.8 버전을 설치하겠습니다. 해당 버전을 설치하기 위해 Identifier를 사용해야합니다. 해당 Identifier를 기억하거나 복사해주세요.

> sdk i java 17.0.8-amzn

"sdk i java 17.0.8-amzn"를 입력하여 설치를 진행합니다.

"sdk {명령어} {SDK} {identifier}" 구조를 사용한다고 생각하면 쉽습니다. 위에서 목록을 보기위해 사용한 명령어는 l(list)였고 지금은 i(install)입니다. "sdk" 만 입력하면 SDKMan 의 사용법이 간략히 소개됩니다. 궁금하신 분들은 해당 명령어를 입력해주세요.

정상적으로 설치되었는지 "sdk l java" 명령어를 사용하여 다시 목록을 출력해봅시다.

> sdk l java

보시면 설치한 버전의 Use, Status에 각각 사용여부와 상태가 나오고 있는걸 확인할 수 있습니다.

Status는 현재 해당 JDK가 설치되어있음을 나타내고 Use는 현재 선택되어 있는 JDK는 해당 버전이라는 것을 나타냅니다.

아래 명령어를 통해 java가 정상적으로 설치되었음을 확인합니다.

> java --version
openjdk 17.0.8 2023-07-18 LTS
OpenJDK Runtime Environment Corretto-17.0.8.7.1 (build 17.0.8+7-LTS)
OpenJDK 64-Bit Server VM Corretto-17.0.8.7.1 (build 17.0.8+7-LTS, mixed mode, sharing)
  1. 그 다음은 Kotlin을 설치해봅시다. JVM 계열이라 SDKMan 에서도 지원합니다.
> sdk l kotlin

현재 Kotlin 언어 관련 릴리스는 Jetbrains 에서만 진행하고 있어 다른 벤더사들 없이 버전만 존재하는걸 볼 수 있습니다. 가장 최신버전인(2023-08-21 기준) 1.9.0을 설치하겠습니다.

> sdk i kotlin 1.9.0

정상 설치가 되었다면 아래 명령어들로 SDKMan과 kotlin 버전을 출력해봅니다.

> sdk l kotlin

> kotlin -version
Kotlin version 1.9.0-release-358 (JRE 17.0.8+7-LTS)

이렇게 되었다면 일단 환경 구성은 완료되었습니다. 이제 개발자들이 지겹도록 하는 Hello World를 코틀린으로 출력해보겠습니다.

Hello World In Kotlin

  • Hello World 라는 문자열을 출력하는 간단한 코틀린 프로그램을 작성할 예정입니다.
  • 해당 예제에서는 vi를 사용하여 예제를 진행합니다.
    - vi는 unix 계열에서 사용하는 텍스트 편집기 입니다.
    - 윈도우나 다른 환경에선 메모장을 사용하시거나 nano를 사용하여 파일 작성 후 컴파일, 실행 과정만 따라오셔도 무방합니다.

먼저 프로그램 작성 전 kotlinc와 kotlin 실행방법을 설명하겠습니다.

예제만 시도해보실 분은 해당 내용을 패스하셔도 좋습니다.

kotlinc?


  • 코틀린으로 작성된 파일을 JVM 상에서 실행할 수 있는 바이트 코드로 변환하기 위한 컴파일러입니다.
  • kotlinc 라는 명령어로 사용가능합니다.
  • 모든 코틀린 버전은 독립형 컴파일러와 같이 제공됩니다.
    - 즉, 코틀린을 설치했다면 컴파일러도 같이 설치된 상태입니다. 이는 추가적인 컴파일러 설치과정이 필요없음을 의미합니다.
    - 물론 수동으로도 설치할 수 있습니다. 수동 설치 방법은 이 링크를 참고하시면 될거같습니다.

kotlinc 를 통해 class 파일 만들기


  1. 먼저 원하는 곳에 폴더를 만들어주세요. 저는 폴더이름을 kotlin-hello-world 로 하겠습니다. 해당 과정은 윈도우의 탐색기나 macOS의 파인더를 사용해도 좋습니다.
# 폴더를 생성합니다.
> mkdir kotlin-hello-world
# 해당 폴더로 이동합니다.
> cd kotlin-hello-world
  1. 후에 vi를 통해서 HelloWorld.kt 파일을 생성합니다. kotlin 파일의 확장자는 kt 입니다. 내용은 아래와 같이 입력해주세요.
    • 메모장과 같은 GUI 애플리케이션이라면 생성한 폴더안에 HelloWorld.kt 로 저장해주세요.
> vi HelloWorld.kt
// HelloWorld.kt
fun main() {
	println("Hello World")
}
# 현재 경로에 존재하는 프로그램 출력 
> ls
HelloWorld.kt 

코드가 간결하지 않나요?

지금은 해당 프로그램이 어떻게 작동하는지 몰라도 무방합니다.

여러분이 작성한 이 내용은 단순하게 Hello World라는 문자열을 출력하는 프로그램입니다.

  1. kotlin 컴파일러(kotlinc)를 사용하여 kt 파일을 class 파일로 변환하겠습니다.
> kotlinc HelloWorld.kt
> ls
HelloWorld.kt      HelloWorldKt.class      META-INF

"kolinc {파일명}" 의 명령어를 통해 HelloWorldKt.class 파일이 생성되었습니다.

META-INF는 우리가 만든 프로그램의 메타데이터 입니다. 메타데이터란 어떤 목적을 가지고 만들어진 데이터를 뜻합니다.

우리가 만든 메타데이터(컴파일 시 자동으로 생성됩니다.)는 우리가 작성한 main 이라는 함수가 어느 class에 있는지, 해당 프로그램의 보안 정책, 컴포넌트 정보 등등...프로그램의 정보를 가지고 있습니다.

지금 진행하고 있는 예제에선 그냥 이런게 있구나, 라고 생각하시고 넘어가주세요.

  1. kotlin 명령어로 class 파일을 실행해보겠습니다.
> kotlin HelloWorldKt.class
Hello World!

정상적으로 Hello World가 출력되는 모습을 볼 수 있습니다!

kotlinc 를 통해 JAR 파일 만들기


JAR(Java Archive)란 여러개의 클래스 파일과 해당 클래스들이 이용하는 리소스 그리고 앞서 잠깐 살펴봤던 META-INF와 같은 메타데이터를 한데 모아 만든 파일입니다.

라이브러리를 배포하거나 자바 애플리케이션을 배포하고 구동하기 위해선 우리의 프로젝트를 JAR 형태로 만들어 실행하여야 합니다.

하지만 저희가 만든 Hello World는 고작 main 파일 하나 있는 애플리케이션입니다. kotlinc 를 이용해 이런식으로 JAR 파일을 만들 수 있구나 하는 생각으로 해당 예제를 진행해주시면 감사하겠습니다.

  1. 먼저 기존에 만든 class 파일과 META-INF 폴더를 지워주세요. 기존에 작성한 HelloWorld.kt 파일만 남겨주세요. 해당 과정은 편리함을 위해 기존 파일을 지우는 작업입니다. 굳이 수행하지 않으셔도 무관합니다.
> rm -r META-INF
> rm HellowWorldKt.class
> ls
HelloWorld.kt
  1. 아래와 같이 명령어를 입력하여 HelloWorld.jar 를 만들어주세요
> kotlinc HelloWorld.kt -include-runtime -d HelloWorld.jar
> ls
HelloWorld.jar HelloWorld.kt

먼저 kotlinc 부터 하나하나 뜯어보겠습니다.

  • kotlinc HelloWorld.kt
    - HelloWorld.kt 파일을 컴파일 대상으로 지정합니다.
  • -include-runtime
    - jar를 생성할 때 kotlin runtime library를 포함시킨다는 옵션입니다.
  • -d
    - 해당 옵션은 생성할 파일의 이름, 위치 등을 설정해주는 옵션입니다.
    - 현재 위치에서 jar 라는 폴더 아래에 hello.jar 라는 이름으로 만들고 싶다면 위 명령어를 아래와 같이 변경할 수 있습니다
    - "kotlinc HelloWorld.kt -include-runtime -d jar/hello.jar"
  1. 그리고 해당 jar를 java 명령어를 이용하여 실행해보겠습니다.
> java -jar HelloWorld.jar
Hello World

정상적으로 실행되는 모습을 볼 수 있습니다.

마지막으로 kotlinc의 다양한 옵션들에 대해 추가로 알아보겠습니다.

  • -out : 이는 JAR 파일의 이름만을 지정합니다. 해당 옵션만을 사용한다면 현재 위치해있는 디렉터리에 jar 파일을 생성합니다.
  • -nostdlib : kotlin standard library를 포함하지 않습니다.
  • -norefs : JAR 파일에 포함된 클래스 파일 참조를 제거합니다.
  • -nowarn : 경고를 표시 하지 않습니다.

마무리

먼저 긴 글 읽어주셔서 감사합니다. 내용 중 운영체제나 프로세서의 차이로 예제가 진행되지 않을 수 있습니다. 그런경우 최상단에 표시된 이메일로 통해 제보주시면 최대한 도움을 드리겠습니다.

이 글을 통해 우리는 앞서 말씀드렸듯이
1. Kotlin 은 무엇인지?
2. Kotlin의 언어적 특성
3. Kotlin의 언어 외적인 특징
4. Apple Silicon Mac 에서 SDKMan을 활용하여 Kotlin 개발환경구성
5. Kotlin으로 Hello World 애플리케이션을 만들고 컴파일 후 구동
에 관한 내용들을 전부 알 수 있었습니다.

다음 글은 예제를 통하여 Kotlin의 언어가 어떤 방식으로 구동되는지에 대해 살펴볼 예정입니다.
또한 kotlinc 를 사용하는 예제에서 사용된 -include-runtime 옵션에 대한 자세한 설명은 추후 다른 게시글로 풀 수 있도록 해보겠습니다.


원 글 : limc.dev

0개의 댓글