본문 바로가기
코틀린

코틀린(Kotlin)과 자바(Java)의 차이점

by 쎄오SseO 2023. 6. 1.

코틀린(Kotlin)과 자바(Java)의 차이점

 

 

안녕하세요

안드로이드 개발자가 되기 위해 노력하는 서경원입니다.

코틀린과 자바의 차이점에 알게된 내용을 알려드리려고 합니다.

이해가 안되는 내용이나 제가 잘못 적은 부분이 있다면 꼭 댓글 남겨주세요.

 

 

코틀린과 자바에 대해 조금 아시는 분이라면 코틀린이 자바보다 문법이 간결하며 사용이 편해 생산성이 증대되고 Nullable 타입이 존재하기 때문에 널 안정성을 갖고 있다는 것을 알고 계실 것 입니다.

이 부분에 대해 더 자세히 알아보고 다른 장점에 대해서도 설명해드리려고 합니다.

 

 

 

생산성

 

1. 문법

 

Kotlin은 세미 콜론을 작성하지 않고 여러 함수들이 사용하기 편하게 작성되어 있습니다.

String으로 타입을 변경할 때에도 변수 뒤에 .toString() 만 사용하는 등 간편하게 사용할 수 있습니다.

그 중에서 안드로이드에서 가장 편한 특징은 하나의 추상 메서드를 가지는 인터페이스를 함수형 인터페이스로 간주하고, 이를 람다 표현식으로 직접 작성할 수 있습니다. 따라서 Android에서 setOnClickListener 같은 경우 간편하게 사용할 수 있습니다.

 

// 기존 자바 코드
btn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        showToast("클릭 이벤트")
    }
});
// 코틀린 코드
btn.setOnClickListener {
    showToast("클릭 이벤트")
}

 

 

2.데이터 클래스

 

코틀린에서는 데이터를 보관하고 전달하기 위한 목적으로 사용되는 데이터 클래스가 존재합니다.

equals(), hashCode(), toString() copy() 메서드를 재정의해주지 않아도 자동으로 생성되기 때문에 간편하게 사용 가능합니다.

 

 

3. 싱글톤

 

Kotlin에서 싱글톤은 간편하게 만들어 사용할 수 있을 뿐만 아니라 내부적으로 쓰레드 동기화로 안전한 초기화를 보장합니다.

기존에 자바에서는 싱글톤을 안전하게 관리해주기 위해 volatilesynchronized 를 사용했습니다. synchronized는 임계 영역을 만들어 다른 쓰레드가 동시에 접근하지 못하도록 하는 것이고 volatile는 쓰레드 스택을 통해 접근하는 것이 아닌 메모리에 직접 접근할 수 있도록 만들어 다른 쓰레드가 바로 접근해서 생기는 문제를 방지해줍니다.

Kotlin에서는 이를 고려하지 않고도 보일러 플레이트를 작성하지 않고 편하게 싱글톤 클래스를 만들어 사용 가능합니다.

 

public class MySingleton {
    private static volatile MySingleton instance;

    private MySingleton() {
        // private 생성자
    }

    public static MySingleton getInstance() {
        if (instance == null) {
            synchronized (MySingleton.class) {
                if (instance == null) {
                    instance = new MySingleton();
                }
            }
        }
        return instance;
    }
} 
object MySingleton {

}

 

 

 

 

널 안정성

 

Kotlin에서는 Nullable 타입을 지원합니다. NullPointerException을 방지하기 위해 사용합니다.

var name: String? = "John" // 널 가능
var nullableName: String? = null

var address: String = "경기도" // 널 불가능

val length: Int = name?.length ?: 0 // name이 null이 아니라면 name.length를 실행
                                                                        // name.length가 null이라면 0을 할당

checkNotNull() 메서드를 통해 null이 아닌 값들만 받을 수도 있습니다.

 

개발을 하면서 간혹, nullable 타입이지만 null이 아니여야하며 null이 절대 들어오지 않을 변수가 존재할 수 있습니다. null이 들어오면 정말 이상하게 동작할 수도 있는 가능성이 존재하는 경우인데, 이런 경우는 nullable을 허용하여 그 후 동작이 망가져 사용자에게 정말 이상하게 보이게 하는 것 보다 null인 경우 차라리 앱 크래시가 되게 함으로써 덜 이상하게 보이게 하고 앱 크래시를 통해 에러 리포트를 받아볼 수 있게 하는 것이 좋을 수 있다고 합니다.

 

 

 

타입 안정성

 

Kotlin은 ClassCastException를 방지합니다.

어떤 객체를 다른 타입으로 캐스트하기 전에 타입을 미리 검사하지 않으면 exception이 발생할 수 있습니다. 코틀린에서는 타입 검사와 캐스트가 한 연산자에 의해 이루어지기 때문에 어떤 객체의 타입을 검사했고 그 타입에 속한다면 해당 타입의 메서드나 필드 등의 멤버를 별도의 캐스트 없이 사용할 수 있습니다.

if(value is String) //타입 검사
    println(value.toUpperCase()) //해당 타입의 메서드 바로 사용 가능

 

 

 

 

코틀린의 단점

코틀린의 컴파일 속도와 Unit Test 속도가 느리다고 합니다 ㅜㅜ