Kotlin vs. Java 비교하기
Android 개발에 있어서 Java 언어보다 kotlin 언어를 많이 사용하는 추세입니다. 물론 아직도 Java를 많이 사용하고 있지만 구글에서도 Kotlin을 제 1언어로 채택하고 앞으로의 컴포넌트나 라이브러리들도 Kotlin으로 개발된다고 하니 안드로이드 개발자들은 Kotlin을 안 할 이유가 없어보입니다.
그래서 코드 사용에 있어서 Java와 Kotlin을 비교해보도록 하겠습니다.
비교 순서는 변수/상수, view 사용, Null 안정성, 객체 초기화, Data Class 순으로 알아보도록 하겠습니다.
1. 변수/상수
Java
String strVar = ""; // 변수
final String strVal = ""; // 상수
- 변수 : final을 사용하지 않음
- 상수 : final을 사용함
Kotlin
var strVar = "" // 변수
val strVal = "" // 상수
- 변수 : var 사용
- 상수 : val 사용
변수/상수 선언에 있어서 무엇이 더 보기 좋고 사용하기 좋은지는 사용자에 따라 다르지만 Kotlin은 iOS 개발에서 사용하는 Swift와 비슷하게 사용할 수 있어 안드로이드와 iOS를 같이 개발하는 개발자라면 Kotlin이 좀 더 편할 수 있을거라 생각드네요.
2. view 사용
* activity_main.xml의 btn_test라는 id를 가진 button 사용
Java
btnTest = findViewById(R.id.btn_test); // 객체를 만들어 findViewById() 함수로 객체에 할당
btnTest.setText("Test");
- findViewById() 함수로 Button 객체에 할당
Kotlin
btn_test.text = "Test" // xml에서 정의한 id 값으로 view 사용
- xml에서 정의한 id 값을 그대로 사용
Java에서는 view의 id를 객체로 할당하는 과정이 필요한 반면 Kotlin에서는 view의 id를 그대로 사용할 수 있습니다. 사용하는 view나 layout이 한, 두개면 상관 없겠지만 10~20개도 넘을 땐 코드가 적어도 10~20줄이 줄어드는 효과를 볼 수 있어 Kotlin에서 훨씬 더 편하게 사용할 수 있습니다.
물론 나중에 DataBinding을 사용하게 된다면 이마저도 쓰지않아도 되겠지만 Java와 Kotlin의 사용만 비교해보면 Kotlin이 더욱 편하게 사용될 수 있습니다.
3. NULL 안정성
Java
@Nullable String strNullable = null;
@NonNull String strNonNull = "";
- Java는 @(Annotation)을 사용해서 Nullable과 NonNull을 구분 할 수 있습니다. @Nullable은 null이 들어 올 수 있는 변수고, @NonNull은 null이 될 수 없는 변수입니다. Default는 Nullable입니다.
Kotlin
var strNullable: String? = null
var strNonNull: String = ""
- Kotlin은 ?(Optional)을 사용해서 Nullable과 NonNull을 구분 할 수 있습니다. ?(Optional)을 사용하기 위해서는 변수뒤에 자료형을 꼭 붙여주셔야 하고 ?을 붙이게 되면 null이 들어올 수 있고, 붙이지 않으면 null이 될 수 없습니다. Default는 NonNull 입니다.
Java에선 Annotation을 사용하고 Kotlin에선 Optional을 사용합니다. 위 코드는 단순히 null이 들어올수 있는 또는 없는 변수를 선언하는 방법이며 안전하게 null을 사용/컨트롤 하는 방법은 아래와 같습니다.
Java
strNullable.split("/"); // NPEif (strNullable != null) {
strNullable.split("/");
}
- strNullable 변수에 null이 들어와 있을 때 첫번째 코드로 짠다면 NPE가 발생할 수 있습니다. 그래서 null을 체크하기 위해서 if 문을 사용하였습니다,
Kotlin
strNullable.split("/") // NPEstrNullable?.split("/")
- strNullable 변수에 null이 들어와 있을 때 첫번째 코드로 짠다면 빨간줄이 생기고 build가 되지 않습니다. IDE에서 nullable 변수를 확인해서 바로 사용이 되지 않습니다. 그래서 두번째 방법과 같이 Optional을 사용하고 만약 strNullable 변수가 null이면 split() 함수는 실행되지 않습니다.
위의 Java 코드와 Kotlin 코드를 보면 Kotlin 코드가 훨씬 직관적이고 깔끔한것을 볼 수 있습니다. 이런 식으로 Kotlin에서는 null을 안전하게 사용할 수 있고 null 체크하는 방법 또한 매우 간단합니다.
4. 객체 초기화
Java
Intent testIntent = new Intent(this, SecondActivity.class); // 일반적인 객체 초기화 및 초기 작업
testIntent.putExtra("ext1", 1);
testIntent.putExtra("ext2", 2);
testIntent.putExtra("ext3", "3");
testIntent.putExtra("ext4", "4");
testIntent.putExtra("ext5", false);
- 객체를 new로 초기화하고 초기화된 객체를 이용해 초기 작업을 수행합니다.
Kotlin
val testIntent = Intent(this, SecondActivity::class.java).apply { // 객체 초기화 시 초기 작업 수행
putExtra("ext1", 1)
putExtra("ext2", 2)
putExtra("ext3", "3")
putExtra("ext4", "4")
putExtra("ext5", false)
}
- apply block을 이용하여 초기화 작업을 수행합니다. apply block안에서는 초기화된 객체 자신을 this로 사용하기 때문에 객체를 따로 명시해주지 않아도 바로 객체의 함수를 사용할 수 있습니다.
하나의 객체만 초기화하고 초기 작업을 수행할 땐 보기에 불편함이 없지만 Java에서 여러객체를 한번에 초기작업을 수행할 땐 가독성이 떨어질 수 있습니다. 하지만 Kotlin에선 객체 초기화 작업을 하나의 block으로 감싸지고 어떤 작업을 수행하는지 한 눈에 확인하기 좋고 코드 관리가 편해집니다.
5. Data Class
Java
public class JavaData {
JavaData(String s, int i, boolean b) {
this.s = s;
this.i = i;
this.b = b;
}
private String s;
private int i;
private boolean b;
public String getS() {
return s;
}
public void setS(String s) {
this.s = s;
}
public int getI() {
return i;
}
public void setI(int i) {
this.i = i;
}
public boolean isB() {
return b;
}
public void setB(boolean b) {
this.b = b;
}
}JavaData data1 = new JavaData("", 0, true); // 생성자로 초기화
JavaData data2 = new JavaData(); // 빈 생성자로 생성 후 set 함수로 초기화
data2.setS("");
data2.setI(0);
data2.setB(true);
- Java에서 DTO를 만들기 위해선 변수에 대한 get/set 함수를 만들어주고(필수) 생성자를 만들어 변수를 초기화하는 작업을 수행할 수 있습니다.(선택)
Kotlin
data class KotlinData(var s: String?,
var i: Int,
var b: Boolean)val data1 = KotlinData("hi", 1, false) // 생성자로 초기화
- Kotlin에선 class를 data class로 만들어 생성자에 인자를 var로 정의해주면 DTO로 사용할 수 있습니다. data class의 생성자에 초기값을 미리주면 비어있는 객체도 만들 수 있습니다. 그리고 비어있는 객체는 위의 Intent 초기화와 같이 apply block을 이용하여 초기화 시킬 수 있습니다.
딱 봐도 코드량이 많이 차이납니다. 하나씩 get/set을 만들어주는 코드에서(Java) data class를 사용하는 방법(Kotlin)으로 간단하게 DTO를 만들어 사용할 수 있습니다.
'Kotlin' 카테고리의 다른 글
Kotlin Type aliases (0) | 2022.07.10 |
---|---|
lateinit 과 lazy의 차이점 (0) | 2022.03.15 |
DeciamlFormat 으로 숫자 천단위로 콤마 넣기 (0) | 2021.10.07 |
람다식에서 return 사용하기 (0) | 2021.05.02 |
코틀린 커스텀 다이얼로그 (0) | 2021.04.25 |