우주먼지
Published 2023. 3. 24. 17:43
Java와 Kotlin의 차이 Languages/Kotlin

💡 Kotlin

  • 2017년 구글이 안드로이드 공식 언어로 채택한 언어이다.
  • 안드로이드 앱, 서버측 앱등을 개발하는데 사용한다.

 

간결성, 생산성

  • 코틀린은 자바보다 더 간결하고 직관적이며 읽고 쓰는 시간이 빠르다
  • 자바에 존재하는 여러 준비코드(생성자 등)을 묵시적으로 제공한다.
  • 기능이 다양한 표준 라이브러리를 제공하며 반복 코드를 줄일 수 있다.
  • 코틀린에서 함수는 일급 객체이며 고차 함수로 사용이 가능하다.
  • 타입추론 : 할당되는 값을 알아서 추론해준다.

 

안정성

런타임 에러보다 컴파일 타임 에러를 통해 디버깅이 용이하다.

  • 모든 타입 + 기본형 타입도 클래스 타입이다. (Nullable을 위해)
  • 코틀린은 Null이 될 수 없는 값을 추적한다.
  • 실행 시점에 NPE가 발생할 수 있는 연산을 가진 코드를 금지한다.
  • 자바에서 객체의 Null 방어로직을 작성하는데 사용되는 많은 코드라인을 생략 가능하다.

 

Nullable Type

  • Nullable Type을 통해 Null이 될 수 있는 타입명시적으로 표현 가능하다.
  • 즉, Nullable이 아닌 변수이 Null을 넣으면 컴파일 타임에 에러를 발생시킨다.

 

Null Check

자바에서 NPE를 방지하기 위해 Optional이나 Catch를 사용하던 것들 아래와 같은 연산자로 대체 가능하다.

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

 

상호 운용성

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

  • Java 클래스 <-> Kotlin 클래스 서로 호환 가능
  • 라이브러리가 어떤 API를 제공하던지 코틀린에서 그 API를 활용 가능

 

도구 친화적

코틀린은 IntelliJ의 제작사인 JetBrains가 설계한 언어라 IntelliJ에서 Kotlin을 가장 잘 지원한다.


💡 코드 비교

  • 주석의 표현방법은 자바와 동일하다.
  • 코틀린은 각 문장의 마지막에 세미콜론(;)이 없다.
  • 클래스를 상속할때 extends 대신 콜론(:)을 사용한다.
  • 콜론(:) 뒤에 부모 클래스 명이 오고 괄호를 붙이면 기본 생성자를 호출한다.

 

함수 정의

  • 함수를 정의할 때 fun 키워드를 붙이며, 상위 클래스 재정의시 override fun의 형식으로 사용한다.
  • 함수 정의 시 소괄호 안에 파라미터를 넣을 수 있다.
    • 자바는 함수에 파라미터를 넣을떄 자료형과 파라미터 명을 넣어준다.
    • 반면에 코틀린은 파라미터명 : 자료형 순이다.
    • 이것은 변수를 선언할때도 마찬가지이다.
    • 물음표(?) 기호는 변수나 파라미터에 Null을 허용한다는 의미이다.

 

자바

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
}

코틀린

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layOut.activity_main)
    }
}

생성자

코틀린에서의 생성자는 기본적으로 프로퍼티의 선언과 초기화를 동시에 하기 때문에 코드가 간결하다.

프로퍼티 선언으로 만들어진 모든 필드를 포함하는 생성자와,
초기화 해준 필드를 제외한 생성자롤 따로 선언하지 않아도 사용이 가능하다.

 

자바

@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";
    }
}

코틀린

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

Data Class

데이터 보관 목적으로 만들어진 클래스이다. (Spring의 DTO로 활용하면 편리하다.)

toString(), hashCode(), equals(), copy()를 기본으로 제공하며 이에 대한 Boilerplate Code를 생략 가능하다.

 

자바

@EqualsAndAHashCode
@ToString
public class abc {
    ...
}

코틀린

data class PageOptionRequest(
    ...
)

문자열 처리

  • 문자열 템플릿
  • 여러줄의 문자열을 """을 이용해 하나의 문자열로 구성 가능
  • trimIndent와 같은 문자열 사용을 편하게 하는 메서드 존재

 

자바

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

코틀린

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

분기 처리

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

Null 처리

코틀린의 최대장점이다. 자바에서 Optional로 만드는 과정을 생략할 수 있어 간결하다.

 

자바

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

코틀린

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

우주먼지

@o귤o

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

검색 태그