[Kotlin] 0. Intro

zxcev·2023년 1월 25일
0

Kotlin

목록 보기
1/1
post-thumbnail

KotlinJetBrains 사에 의해 2011년 공개된 프로그래밍 언어다.

Java도 섬 이름에서 유래되었기 때문에 Kotlin도 개발사인 JetBrains의 개발팀의 거주지 근처의 섬 이름을 따왔다.

창시자인 제임스 고슬링과 썬마이크로시스템즈사에 의해 1995년에 개발되어 현재까지도 가장 많이 사용되는 프로그래밍 언어중 하나인 Java를 대체하기 위해 개발된 것으로 보여진다.

시기적으로 보면 오라클이 썬마이크로시스템즈 인수 직후 구글에 소송을 건 행보 등의 영향도 컸던 것으로 생각된다.

어쨌든 코틀린의 등장으로 인해 장황하기로 유명한 Java의 문법이 상당히 간결해졌으며, 상당한 시간이 걸리겠지만 Java를 대체할 가능성이 가장 높다고 한다.

같은 JVM 상에서 돌아가기 때문에 Java와 완벽하게 호환되기 때문이다.

확장자는 .kt로 우리에게 친숙한 한국통신의 약자와도 같다.

Hello World를 출력하는 코드는 아래와 같다.

// Main.kt
fun main(args: Array<String>) {
    println("Hello World")
}

Java와 달리 클래스를 따로 만들지 않아도 실행이 가능하며 세미콜론을 생략할 수 있다는 특징이 있다.

Interllij에서 Ctrl + Shift + R로 실행해보면 위와 같이 Hello World가 출력되는 것을 볼 수 있다.

Tools - Kotlin - Show Kotlin Bytecode를 누르면 위에 작성한 코틀린 코드가 Java 코드를 컴파일 했을 때 나오는 .class 파일로 변환되는 것을 볼 수 있다.

// ================MainKt.class =================
// class version 52.0 (52)
// access flags 0x31
public final class MainKt {


  // access flags 0x19
  public final static main([Ljava/lang/String;)V
    // annotable parameter count: 1 (visible)
    // annotable parameter count: 1 (invisible)
    @Lorg/jetbrains/annotations/NotNull;() // invisible, parameter 0
   L0
    ALOAD 0
    LDC "args"
    INVOKESTATIC kotlin/jvm/internal/Intrinsics.checkNotNullParameter (Ljava/lang/Object;Ljava/lang/String;)V
   L1
    LINENUMBER 2 L1
    LDC "Hello World"
    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
    SWAP
    INVOKEVIRTUAL java/io/PrintStream.println (Ljava/lang/Object;)V
   L2
    LINENUMBER 3 L2
    RETURN
   L3
    LOCALVARIABLE args [Ljava/lang/String; L0 L3 0
    MAXSTACK = 2
    MAXLOCALS = 2

  @Lkotlin/Metadata;(mv={1, 7, 0}, k=2, xi=48, d1={"\u0000\u0014\n\u0000\n\u0002\u0010\u0002\n\u0000\n\u0002\u0010\u0011\n\u0002\u0010\u000e\n\u0002\u0008\u0002\u001a\u0019\u0010\u0000\u001a\u00020\u00012\u000c\u0010\u0002\u001a\u0008\u0012\u0004\u0012\u00020\u00040\u0003\u00a2\u0006\u0002\u0010\u0005\u00a8\u0006\u0006"}, d2={"main", "", "args", "", "", "([Ljava/lang/String;)V", "kt_playground"})
  // compiled from: Main.kt
}


// ================META-INF/kt_playground.kotlin_module =================



MainKt"*

이는 Java 코드를 javac로 컴파일 했을 때 결과물로 주어지는 Java Bytecode다.
코틀린도 JVM 상에서 실행한 Java Bytecode로 컴파일이 가능한 것이다.

import kotlin.Metadata;
import kotlin.jvm.internal.Intrinsics;
import org.jetbrains.annotations.NotNull;

@Metadata(
   mv = {1, 7, 0},
   k = 2,
   d1 = {"\u0000\u0014\n\u0000\n\u0002\u0010\u0002\n\u0000\n\u0002\u0010\u0011\n\u0002\u0010\u000e\n\u0002\b\u0002\u001a\u0019\u0010\u0000\u001a\u00020\u00012\f\u0010\u0002\u001a\b\u0012\u0004\u0012\u00020\u00040\u0003¢\u0006\u0002\u0010\u0005¨\u0006\u0006"},
   d2 = {"main", "", "args", "", "", "([Ljava/lang/String;)V", "kt_playground"}
)
public final class MainKt {
   public static final void main(@NotNull String[] args) {
      Intrinsics.checkNotNullParameter(args, "args");
      String var1 = "Hello World";
      System.out.println(var1);
   }
}

또한 위와 같이 Java Bytecode는 Java 코드로 다시 디컴파일도 가능하다.
그렇기 때문에 Kotlin -> Java Bytecode -> Java로 완벽하게 호환이 가능한 것이다.

// Main.kt
fun main(args: Array<String>) {
    println("Hello World")
    System.out.println("JAVA")
}

게다가 Java와 마찬가지로 JVM 상에서 돌아가기 때문에 JDK에서 제공하는 패키지를 그대로 사용할 수 있다.
그래서 위와 같이 Java 코드인 System.out.println("JAVA")를 실행할 수 있는 것이다.

세미콜론이 없다는 사실을 확인하자. 문법은 코틀린에 맞춰야한다.

또한 코틀린은 Java Bytecode 외에도 LLVM 기반의 네이티브 컴파일과 JS로의 변환도 가능하다고 한다.

0개의 댓글