본문 바로가기
Java & Kotlin

자바(java) vs 코틀린(kotlin) 차이 비교

by Jammini 2021. 6. 24.
728x90

바로 간략하게 그림으로 설명하겠습니다.

Java and Kotlin compilation processes

JVM 위에서 실행 되는 것이 동일!

 

차이는 언어의 문법이 다르고 각각의 컴파일러가 있다는 것이다.

성능은 유사하나 문법적 차이가 크다

비교 자바 코틀린
성능 =
개발 편의성 <
활용 >
참고소스 >

코틀린으로도 어떠한 개발이 가능하다.

왜 코틀린이 흥하고 있을까?

구글에서 코틀린을 안드로이드의 공식 개발언어로 채택되었다. 코틀린을 최우선으로 사용하겠다는 언급하면서 메인 언어로 못을 박고 reference 문서들도 코틀린 기반으로 작성된 코드를 통해 배포가 주를 이룰 것이다.

 

코틀린의 장점은 무엇인가?

  • 간결성
  • 안정성
  • 상호운용성

코틀린 공식사이트에서는 이 세가지를 강조하고 있습니다.

 

간결성(Concise)

코틀린은 boilerplate 코드를 상당히 줄여줍니다. 변하지 않는 항상 같은 패턴의 코드는 직접 작성을 하지 않고 도구의 도움을 받자는 것입니다. 예를 살펴보겠습니다.

public class DataExample {
    private final String name;
    private int age;
    private double score;
    private String[] tags;

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

    public String getName() {
      return this.name;
    }

    void setAge(int age) {
      this.age = age;
    }

    public String[] getTags() {
      return this.tags;
    }

    public void setTags(String[] tags) {
      this.tags = tags;
    }

    @Override public String toString() {
      return "DataExample(" + this.getName() + ", "
        + this.getAge() + ", " + this.getScore() + ", "
        + Arrays.deepToString(this.getTags()) + ")";
    }

    protected boolean canEqual(Object other) {
      return other instanceof DataExample;
    }

    @Override public boolean equals(Object o) {
      //...
      return true;
    }

    @Override public int hashCode() {
     //...
    }

 

위와 같이 java 에서 data 를 표현하는 클래스는 보일러 플레이트 코드가 상당부분 존재합니다. 같은 코드지만 간략하게 어노테이션을 이용할 수 있는 플러그인 Lombok 이 있습니다.

  @Data 
  public class DataExample {
    private final String name;
    @Setter(AccessLevel.PACKAGE)
    private int age;
    private double score;
    private String[] tags;

 

  • kotlin
  data class DataExample(
    val name: String, var score: String?,
    var tags: Array<String>?
)

위에서 보았던 java 코드와 동일한 효과를 냅니다. 훨씬 간단해집니다.

data class 는 DTO, VO 등의 패턴을 쉽게 사용가능하도록 제공해주는 언어적 요소입니다. equals / hashCode, toString 등을 자동으로 생성해줍니다.

 

안전성(Safe)

비교적 최근에 탄생한 언어 답게 안전성에 대한 철학이 훌륭합니다. Null safety, 스마트 캐스트, 불변 등 편리한 기능을 문법적으로 제공해주고있습니다. 하나씩 살펴보겠습니다.

Null-safety

var output: String
output = null   // Compilation error
val name: String? = null    // Nullable type
println(name.length())      // Compilation error

kotlin 은 compile 시점에 NPE 을 검증하고 방어합니다.

Tony Hoare 는 Null 참조를 만든 것을 ‘billion-dollar mistake.’ 라 부릅니다.wikipedia

스마트 캐스트(Smart cast)

  • java
Object obj = "The quick brown fox jumped over a lazy dog";
if(obj instanceof String) {
    String str = (String) obj;
    System.out.println("Found a String of length " + str.length());
}

위 코드는 자바에서 instanceof 연산자를 통해 obj 가 String 인지 구문을 체크하고 맞다면 형변환을 해서 obj 를 사용하는 코드입니다. obj 가 String 의 객체인 것이 확인 되었는데 또 형변환을 해야 할까요? kotlin 코드를 살펴보겠습니다.

  • kotlin
val obj: Any = "The quick brown fox jumped over a lazy dog"
if(obj is String) {
  println("Found a String of length ${obj.length}")
}

그렇습니다. 의미 없는 캐스팅은 필요 없습니다. 이제 왜 스마트 캐스트라 부르는지 감이 오시나요?

상호운용성(Interoperable)

새로운 언어의 성공여부는 해당 언어로 프로그램을 작성함에이써 풍부한 라이브러리와 견고한 프레임워크가 아닐까 하는 생각이듭니다.

JVM

긴 세월동안 OOP 의 부흥과 같이 해온 JAVA 가 만들어 놓은 생태계는 가히 어마어마 하다고 말할 수 있습니다. 그런 JVM 과 호환은 kotlin 의 큰 장점이 아닐까 합니다.

 

[참고]

https://medium.com/@banmarkovic/process-of-compiling-android-app-with-java-kotlin-code-27edcfcce616

 

Process of compiling Android app with Java/Kotlin code

Did you ever wonder what the process of compiling your Java/Kotlin code and running application on Android device look like? What happens…

medium.com

 

https://www.youtube.com/watch?v=qFxQpq_yYnE 

https://gmunch.github.io/2019/07/15/why-kotlin.html

 

왜 코틀린을 써야 할까?

왜 코틀린을 써야 할까?

gmunch.github.io

 

반응형