티스토리 뷰

프로젝트 디렉토리 구조

test 라는 이름으로 프로젝트 생성 후, test.kt 이름으로 된 파일에 소스코드 작성

디렉토리 구조가 제일 이해가 안돼서 소스 파일을 여기저기 이동 후 돌려보거나 git 디렉토리 보고 비교하는 중.. 몇번 해보고 정확히 파악 필요.

# 소스 경로: AndroidStudioProjects/test/app/src/main/java/com/example/test

% tree -L 2 test                                                        
test
├── app
│   ├── build
│   ├── build.gradle
│   ├── libs
│   ├── proguard-rules.pro
│   └── src
├── build
│   └── kotlin
├── build.gradle
├── gradle
│   └── wrapper
├── gradle.properties
├── gradlew
├── gradlew.bat
├── local.properties
└── settings.gradle

9 directories, 8 files


% tree -L 2 test/app/src 
test/app/src
├── androidTest
│   └── java
├── main
│   ├── AndroidManifest.xml
│   ├── java
│   └── res
└── test
    └── java


% tree -L 4 test/app/src/main/java/ 
test/app/src/main/java/
└── com
    └── example
        └── test
            └── test.kt

4 directories, 1 file

main 함수만 있는 코틀린 소스

package com.example.test


fun main() {
    println("hello")
}
/*
fun main(args: Array<String>) {
    println("hello")
}*/

실행

alt + Cmd + R

(한번 써본 단축키)

주석 Cmd + /

여러 줄 주석 Cmd + Shift + /

(이것저것 눌러보다가 얻어걸린 단축키)
함수 접기 Cmd + -
합수 펼치기 Cmd + +

바이트 코드 보기

//TODO 코틀린 바이트코드란?

Kotlin Bytecode

// ================com/example/test/TestKt.class =================
// class version 52.0 (52)
// access flags 0x31
public final class com/example/test/TestKt {


  // access flags 0x19
  public final static main()V
   L0
    LINENUMBER 5 L0
    LDC "hello"
    ASTORE 0
   L1
    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
    ALOAD 0
    INVOKEVIRTUAL java/io/PrintStream.println (Ljava/lang/Object;)V
   L2
   L3
    LINENUMBER 6 L3
    RETURN
   L4
    MAXSTACK = 2
    MAXLOCALS = 1

  // access flags 0x1009
  public static synthetic main([Ljava/lang/String;)V
    INVOKESTATIC com/example/test/TestKt.main ()V
    RETURN
    MAXSTACK = 0
    MAXLOCALS = 1

  @Lkotlin/Metadata;(mv={1, 7, 1}, k=2, d1={"\u0000\u0008\n\u0000\n\u0002\u0010\u0002\n\u0000\u001a\u0006\u0010\u0000\u001a\u00020\u0001\u00a8\u0006\u0002"}, d2={"main", "", "test.app.main"})
  // compiled from: test.kt
}


// ================META-INF/test.app.main.kotlin_module =================


com.example.testTestKt"*

Decomile 버튼 클릭 시 .java 파일에서 자바 소스로 확인가능하다.

test.decompiled.java

package com.example.test;

import kotlin.Metadata;

@Metadata(
   mv = {1, 7, 1},
   k = 2,
   d1 = {"\u0000\b\n\u0000\n\u0002\u0010\u0002\n\u0000\u001a\u0006\u0010\u0000\u001a\u00020\u0001¨\u0006\u0002"},
   d2 = {"main", "", "test.app.main"}
)
public final class TestKt {
   public static final void main() {
      String var0 = "hello";
      System.out.println(var0);
   }

   // $FF: synthetic method
   public static void main(String[] var0) {
      main();
   }
}