코틀린(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에서 싱글톤은 간편하게 만들어 사용할 수 있을 뿐만 아니라 내부적으로 쓰레드 동기화로 안전한 초기화를 보장합니다.
기존에 자바에서는 싱글톤을 안전하게 관리해주기 위해 volatile
와 synchronized
를 사용했습니다. 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 속도가 느리다고 합니다 ㅜㅜ