본문 바로가기
Kotlin/Release Notes

[Kotlin Release Notes] Kotlin M3 is Out!

by 노력남자 2023. 8. 27.
반응형

2012년 9월 20일

 

지난 번에는 "다가오는 Kotlin M3"에서 흥미로운 새로운 기능에 대해 작성했습니다. 오늘은 Kotlin M3이 더 이상 "다가오는" 것이 아니라 여기에 있다는 것을 알립니다. 이 글은 새로운 마일스톤에 대한 개요를 제공합니다.

 

kotlin.jetbrains.org를 새롭게 디자인했습니다. 현재 이 페이지의 링크는 우리 위키의 익숙한 문서를 가리키고 있지만, 이것도 시간이 지나면서 개선될 것입니다.

 

개선 사항 및 버그 수정

 

이 마일스톤에서 우리가 해결한 거의 400개의 문제 중 많은 것들은 Kotlin을 더 깔끔하고 빛나게 만드는 버그 수정과 작은 개선 사항들입니다. 유형 인수 추론 알고리즘에서는 큰 개선이 이루어졌습니다. 아직 완성되지 않았지만 이미 상당히 괜찮습니다.

M3에서는 IDE와 컴파일러의 성능을 조정하고 프로파일링을 시작했습니다. 많은 작업이 필요하지만, 결국 모든 것이 빠르고 적은 메모리를 소비할 것입니다. 이번에는 대부분의 개선 사항이 코드 완성과 관련되어 있습니다.

 

다중 할당과 데이터 클래스

 

이것은 지난 주의 항목에서 다루어졌습니다. 간단히 말하면, 다음과 같은 것들을 작성할 수 있습니다:

 

val map = hashMap("one" to 1, "two" to 2, "three" to 3)
for ((k, v) in map) {
    println("$k -> $v")
}

 

그리고 이렇게 데이터 클래스를 정의할 수 있습니다:

 

data class Point(val x: Int, val y: Int)

 

여기에서 Point는 자동으로 toString(), equals()/hashCode() 및 component 함수를 얻어 이렇게 작성할 수 있습니다:

 

val (x, y) = functionReturningPoint()

 

앞서 언급한 게시물에서 더 자세히 알아보세요.

이러한 기능은 우리가 튜플을 폐기할 수 있게 했습니다. 그것들은 다음 마일스톤에서 완전히 제거되며, IDE 플러그인을 사용하여 코드를 자동으로 마이그레이션할 수 있습니다.

 

컬렉션


정적 JVM 언어들은 자바 컬렉션들이 이러한 언어가 가진 멋진 기능을 활용하지 않기 때문에 자신들만의 컬렉션 라이브러리를 만드는 경향이 있습니다. 따라서 우리는 정말 멋진 컬렉션을 얻게 되지만, 불행히도 호환되지 않아 자바 API를 사용할 때 래핑하거나 복사해야 합니다.

Kotlin에는 많은 멋진 기능이 있지만, 자바와 원활하게 상호 운용하고 싶어합니다. 그리고, 알고 보니, 이 케이크를 가지고 먹을 수도 있습니다. Kotlin의 컬렉션을 만나보세요:

 

 

여기에서 볼 수 있듯이, 기본 구조는 java.util이 우리에게 제공하는 것과 매우 유사하지만 몇 가지 중요한 차이점이 있습니다:


가변과 읽기 전용 컬렉션을 구분하는 특성("인터페이스")이 있습니다.

 

  • 읽기 전용 특성(예: List 또는 Set)은 공변입니다(즉, List<String>을 List<Any>에 할당할 수 있습니다).
  • 좋은 예전 java.util.ArrayList는 여전히 존재하지만, Kotlin에서는 이것이 Kotlin의 MutableList에서 상속받은 것처럼 봅니다. 이러한 방식으로 컬렉션에 대한 호환성과 좋은 유형 속성을 모두 얻을 수 있습니다. 예를 들어, List<Any>가 기대되는 곳에 List<String>을 전달할 수 있습니다.

 

주의할 점은 이전의 이름(예: List 또는 Collection)이 이제 다른 의미를 가지므로 일부 코드가 깨질 것이라는 것입니다. 빠르고 지저분한 해결책으로, 모든 List를 MutableList로 변경할 수 있습니다. 하지만 대부분의 데이터가 읽기 전용이라면 더 좋을 것입니다.

또한 이전 코드에서 java.util.Collection과 같은 것을 가져왔다면 이 가져오기에 대한 경고를 받게 되며, 제거해야 할 것입니다.

외부 어노테이션

 

Kotlin은 null-안전성을 타입 시스템에 통합하여 프로그램을 더 안전하게 만듭니다. 자바는 이에 대해 크게 신경 쓰지 않기 때문에, 자바에서 반환된 것들이 null이 아님을 '!!' 연산자를 사용하여 확인해야 합니다:

 

if (file.getName()!!.endsWith(extension)) {...}

 

(참고로, 좋은 예전 sure() 함수는 라이브러리에서 제거되었으며, 코드를 자동으로 마이그레이션할 수 있습니다.)

많은 자바 메서드는 실제로 null을 반환하지 않습니다. 사람들은 이를 알려주기 위해 어노테이션을 사용하지만, 만약 제3자 라이브러리를 사용하고 있다면 어떻게 해야 할까요?

Kotlin M3에서는 외부 어노테이션을 지원합니다: 소스 코드를 제어하지 않더라도 것들에 어노테이션을 추가할 수 있습니다. 이것은 IDE에서 쉽게 수행됩니다.

라이브러리 코드에서 어노테이션을 추론할 자동화된 도구를 만들 계획입니다. 그 때까지는 IDE를 사용하여 수동으로 어노테이션을 추가합니다.

로컬 함수와 클래스

 

로컬 함수 외에도, Kotlin M3는 로컬 클래스와 객체 선언을 지원합니다:

 

fun foo() {
  class Bar {...}
  val bars = ArrayList<Bar>()
  // ...
}

 

로컬 데이터 클래스를 만들려면 "data" 어노테이션을 대괄호로 둘러싸야 합니다:

fun foo() {
    [data] class Data(...)
    // ...
}

 

자바 상호 운용성: 열거형과 어노테이션

 

Kotlin에서 어노테이션에 대한 지원이 크게 향상되었습니다. 다른 여러 가지 사항 중에서도, Kotlin의 어노테이션은 이제 자바 어노테이션과 완전히 호환되며, 어노테이션의 인수 목록에서 열거형 상수를 사용할 수 있습니다.

열거형도 이제 훨씬 더 나아졌습니다: valueOf(), name() 및 ordinal()을 지원하며 자바와 잘 동작합니다.

 

REPL/스크립트

 

Kotlin에서 스크립트를 지원하기 위한 작업을 진행했습니다. 스크립트 지원은 아직 초기 단계이지만, 다음과 같은 것을 실행할 수 있습니다:

// tree.ktscript
import java.io.File

fun tree(dir: File, indent: String) {
    val files = dir.listFiles()!!
    for (file in files) {
        println(indent + file!!.getName())
        if (file.isDirectory()) {
            tree(file, indent + "  ")
        }
    }
}

tree(File("."), "")

 

명령줄에서 호출하여 실행할 수 있습니다:

 

$ kotlinc/bin/kotlinc-jvm -script tree.ktscript
foo
  bar.txt
tree.ktscript

 

"Shebang" 주석도 지원됩니다.

스크립트는 REPL을 가질 수 있을 만큼 가까워졌지만, 아직 그렇지 않습니다. 대신 웹 데모를 사용해 주세요.

 

좋은 Kotlin 되세요!


새 플러그인은 IntelliJ IDEA 12가 필요하며, 이는 EAP 빌드로 제공됩니다(이 버전의 IntelliJ IDEA는 아직 출시되지 않았으며 문제가 있습니다. 예를 들어, 이 안드로이드와 관련된 문제). 그리고 kotlin-runtime.jar를 업데이트하는 것을 잊지 마세요(IDE가 그렇게 할 것을 제안할 것입니다)!

보통처럼, 여러분의 피드백은 매우 환영됩니다!

 

원문

 

https://blog.jetbrains.com/kotlin/2012/09/kotlin-m3-is-out/

반응형

댓글