본문 바로가기

kotlin

[kotlin vs java ] 코틀린과 자바의 차이, 코틀린의 장점

기존에 java로 구현했던 spring 프로젝트를 kotlin으로 전환했다. 

코틀린을 도입하기로 결정한 이유는 다음과 같았다. 

왜 kotlin인가?

간결성, 생산성

코틀린은 자바보다 더 간결하고 직관적이라, 쓰고 읽는 데 시간이 덜 걸린다.

  • 자바에 존재하는 여러 가지 번로운 준비 코드(생성자, 게터, 세터 등)들을 코틀린은 묵시적으로 제공하기 때문에 그런 준비코드 없이 더 깔끔하다.
  • 기능이 다양한 표준 라이브러리를 제공하기 때문에 반복되는 코드를 줄일 수 있다.

안정성

실행 시점에 오류를 발생시키는 대신 컴파일 시점 검사를 통해 오류를 더 많이 방지해준다.

  • 코틀린은 null이 될 수 없는 값을 추적하며, 실행 시점에 NullPointException이 발생할 수 있는 연산을 사용하는 코드를 금지한다.
  • 자바에서 객체의 null을 다루는데 사용되는 많은 코드라인을 생략할 수 있다.

nullalbe type

  • null이 될 수 있는 타입 명시적으로 표시할 수 있다.
  • nullable이 아닌 변수에 null을 넣으면 컴파일 타임에 에러를 발생시킨다. (자바는 런타임에 NPE 발생)

null 체크

java에서는 NPE(Null Point Exception)를 방지하기 위해 Optional이나 catch를 이용해 짰던 방어로직을 아래와 같은 연산자로 대체할 수 있다.

  • null safe operator (?.) : null 아님을 확인 후에 안전하게 호출함
  • elvis operator (?:) : null에 대한 직접적인 처리

상호 운용성

Java와 100% 호환되며, 기존 라이브러리를 활용할 수 있어서 기존의 자바 코드를 가능하면 최대한 활용할 수 있다.

  • java 클래스를 kotlin 클래스에서, kotlin 클래스를 java 클래스에서 사용할 수 있다.
  • 라이브러리가 어떤 api를 제공하던 간에 코틀린에서 그 api를 활용할 수 있다.

도구 친화

Kotlin은 개발 도구인 ItelliJ IDE를 개발한 JetBrains가 설계한 언어라, 사용하고 있는 IDE intellij가 Kotlin을 더 잘 지원한다.

  • intellij 15부터 코틀린 플러그인이 기본적으로 포함되어 있다.

java vs kotlin 코드 비교

실제로 코틀린으로 전환하고 많은 부분이 편해졌지만 가장 좋은 점은 코드가 간결하다는 것이다. 

생성자

우선 생성자, 코틀린의 사용자는 기본적으로 프로퍼티의 선언과 초기화를 동시에 하기 때문에 자바에 비해서 코드 양이 훨씬 적다. 

프로퍼티 선언으로 만들어진 모든 필드를 포함하는 생성자와, 초기화해준 필드(아래에서 os)를 제외한 생성자를 따로 선언하지 않아도 사용할 수 있다.

java

@Getter
@Builder
@AllArgsConstructor
public class PageOptionRequest {
  @NotNull(message = "actionType is required!")
  private String actionType;
  @Nullable
  private String os;  
 
  public PageOptionRequest(String actionType) {
    this.actionType = actionType;
    this.os = "ios";
  }
}

kotlin

class PageOptionRequest(
    val actionType: String,
    val os: String? = "ios"
)

data class

data class는 데이터 보관 목적으로 만든 클래스인데, spring 프로젝트의 DTO로 활용하면 매우 편하다. toString(), hashCode(), equals(), copy() 메소드를 기본으로 제공해서, 이에 대한 boilerplate code를 생략할 수 있다.

java

@EqualsAndHashCode
@ToString
public class PageOptionRequest {
   ...
}

kotlin

data class PageOptionRequest(
   ...
)

문자열 처리

코틀린에서는 문자열 처리를 간편하게 하는 여러가지 기능을 제공한다. 

  • 문자열 템플릿
  • 여러 줄의 문자열을 """를 이용해 하나의 문자열로 구성 가능
  • trimIndent와 같이 문자열 사용을 편하게 하는 메소드 존재 - 관련 포스팅 참고

java

private final String GET_USER_NAME = ""
    + "SELECT DISTINCT user_name\n"
    + "FROM tbl\n"
    + "WHERE user_id = 63;

kotlin

const val GET_USER_NAME = """
        SELECT DISTINCT user_name
        FROM tbl
        WHERE user_id = 63
    """.trimIndent()

분기 처리

아래 기능들을 이용해서 분기 처리를 더 깔끔하게 구현할 수 있음

  • return 값이 있는 if expression : 코틀린에서는 자바와 달리 조건문을 return값이 있는 '식'으로 제공한다. 
  • switch보다 간결한 when

null 처리

코틀린의 최대 장점인 null처리! 매우 편하고 안전한 null 처리를 제공한다. 자바8부터 Optional을 제공하긴 하지만 Optional 객체로 만드는 과정을 생략할 수 있어 훨씬 간결하다. 

java

public class OptionRequest {
  @NotNull(message = "user_id is required!")
  private String user_id;
  @Nullable
  private String os;  
}

kotlin

class OptionRequest(
    val user_id: String,
    val os: String? = "ios"
)

java

Optional.ofNullable(optionRequest.getOs())
    .map(data -> "   and os_type=" + data).orElse("")

kotlin

optionRequest.os?.let { data -> "and os_type=$data" } ?: ""
반응형