[코틀린 인 액션] 1장, 코틀린이란 무엇이며 왜 필요한가?

kindof

·

2023. 8. 13. 19:17

[코틀린 인 액션] 책을 읽으면서 이해한 내용을 정리합니다.

책의 설명을 기반으로 하되, Java와의 비교나 주관적인 생각들도 써보려고 하는데요. 코드를 작성하면서 궁금한 부분이나 다른 기본적인 내용들은 최대한 공식 문서를 참고해서 작성해보겠습니다.

 

이번 글은 첫 시간이니, 간단한 코틀린 코드 맛보기와 코틀린 소스 코드의 빌드 과정에 대해 살펴보겠습니다.

 

1. 코틀린 맛보기

책에서는 코틀린이 어떤 특징을 가지고 있는 언어인지 소개하기 위해 아래 예시 코드를 가장 먼저 설명합니다.

data class Person(val name: String, val age: Int? = null)

fun main(args: Array<String>) {
    val persons = listOf(Person("영희"), Person("철수", age = 29))
    val oldest = persons.maxBy { it.age ?: 0 }
    println("나이가 가장 많은 사람: $oldest")
}

 

Person이라는 클래스를 정의하고 리스트에서 가장 나이가 많은 사람을 출력하는 코드입니다.

 

Java에서는 보지 못했던 'data', 'val', 'listOf', 'maxBy', '?', ':' 등의 키워드가 보이는데요. 이 코드를 자바로 작성하면 어떻게 쓸 수 있을까요?

class JavaPerson {
    private String name;
    private Integer age;

    public JavaPerson(String name) {
        this.name = name;
    }

    public JavaPerson(String name, Integer age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {return name;}
    public Integer getAge() {return age;}
}

import java.util.Comparator;
import java.util.List;
import java.util.Optional;

public class Main {
    public static void main(String[] args) {
        List<JavaPerson> persons = List.of(new JavaPerson("영희"), new JavaPerson("철수", 29));

        Optional<JavaPerson> oldest = persons.stream()
                .max(Comparator.comparingInt(p -> p.getAge() != null ? p.getAge() : 0));

        JavaPerson oldestPerson = oldest.get();
        System.out.println("나이가 가장 많은 사람: " + oldestPerson.getName());
    }
}

Lombok을 사용하면 조금 더 간결하게 클래스를 정의할 수 있고 Main 클래스에서도 Stream을 사용하여 꽤나 간결한 코드를 작성할 수는 있었지만, 코틀린으로 작성한 코드에 비하면 복잡하다는 느낌은 지울 수 없습니다.

 

책 한 장 분량을 읽고 느낀 코틀린은 마치 미래의 jdk 버전에서 소개할 내용들을 모아서 새로운 언어로 각색한 느낌이었습니다.

 

저자는 코틀린의 주요 특성을 네 가지로 설명합니다.

  • [1] 서버, 안드로이드 등 자바가 실행되는 모든 곳이 대상 플랫폼이다.
  • [2] 정적 타입 지정 언어다.
  • [3] 함수형 프로그래밍과 객체지향 프로그래밍을 조합해서 사용한다.
  • [4] 무료 오픈소스이다.

각 특징에 대한 설명은 나중에 구체적으로 살펴볼 예정이기 때문에 여기서 정리하지는 않겠습니다.

 

다만, 위 네 가지 특징을 조합해보면 코틀린의 장점이 요약되는 것 같습니다.

 

[4] 누구나, [1] JVM 환경이라면 언제든, [2] 안정적이고 좋은 성능을 기반으로, [3] 간결하고 효율적인 코드를 작성할 수 있다.

 

과연 코틀린이 어떤 방식으로 위와 같은 장점을 제공할 수 있는지 앞으로 차차 알아가보겠습니다.

 

 

2. 코틀린 코드 컴파일

코틀린 소스코드를 저장할 때는 .kt 확장자를 파일에 붙입니다. 

 

코틀린 컴파일러는 자바 소스코드를 컴파일 할때와 마찬가지로 코틀린 소스코드를 분석해서 .class 파일을 만들고, 만들어진 .class 파일은 패키징 과정을 거쳐 실행될 수 있죠.

코틀린 빌드 과정

코틀린 컴파일러로 컴파일한 코드는 코틀린 런타임 라이브러리에 의존합니다.

 

코틀린 런타임 라이브러리에는 코틀린 자체 표준 라이브러리 클래스와 코틀린에서 자바 API의 기능을 확장한 내용이 들어가있는데요.

 

다만, 코틀린 공식 문서에서 설명하듯 Kotlin 1.8.0 버전부터는 kotlin-stdlib-jdk* 의존성이 kotlin-stdlib에 통합되었기 때문에 kotlin-stdlib-jdk*의존성을 추가해서 사용 중이었다면 kotlin-stdlib로 대체하라고 말합니다.

https://kotlinlang.org/docs/whatsnew18.html#updated-jvm-compilation-target

 

 

실제로 build.gradle.kts 파일에 코틀린 stdlib 의존성을 추가해보면 코틀린에서 기본적으로 제공하는 여러 기능들이 추가되는 것을 볼 수 있습니다.

dependencies {
    implementation ("org.jetbrains.kotlin:kotlin-stdlib:1.7.10")
    ...
}

kotlin-stdlib

 

3. 정리 / Reference

이번 글에서는 코틀린으로 작성된 간단한 코드를 통해 코틀린이 자바와 어떤 점이 다른지 대략적으로 살펴보고, 앞으로 정리해나갈 코틀린의 장점에 대해 언급하는 정도로 설명을 마쳤습니다.

 

그리고 코틀린 빌드 과정에서 코틀린 런타임이 중간에 개입한다는 점을 설명하면서 Java 소스코드 빌드와 약간의 차이점이 있다는 것을 짚어봤습니다.

 

다음 글에서는 여러 예시 코드를 작성해보면서 코틀린의 기초적인 기능들에 대해 정리해보겠습니다.

 

감사합니다.

 

 

 

Kotlin in Action | 드미트리 제메로프 - 교보문고

Kotlin in Action | 코틀린이 안드로이드 공식 언어가 되면서 관심이 커졌다. 이 책은 코틀린 언어를 개발한 젯브레인의 코틀린 컴파일러 개발자들이 직접 쓴 일종의 공식 서적이라 할 수 있다. 코틀

product.kyobobook.co.kr