Android/개발

[Kotlin] Kotlin vs. Java - 코틀린, 자바 차이점 비교

시계는 와치 2020. 1. 27. 19:37


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("/"); // NPE
if (strNullable != null) {
strNullable.split("/");
}

- strNullable 변수에 null이 들어와 있을 때 첫번째 코드로 짠다면 NPE가 발생할 수 있습니다. 그래서 null을 체크하기 위해서 if 문을 사용하였습니다,


Kotlin

strNullable.split("/") // NPE
strNullable?.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과 Java를 비교해봤습니다. Java를 주로 사용하시던 분들이라면 오히려 불편하다고 생각하실 수도 있지만 Kotlin을 써보고 익숙해지면 Java와는 비교할 수 없을 정도로 편하게 사용할 수 있을 것입니다. 이 외에도 함수, For loop, 가변인자 등 자바에서도 사용되지만 사용방법이 다른것들 또는 Extension Function, let/apply/run/with/also block 과 같은 Kotlin에서만 사용할 수 있는 것들이 많이 있어서 이런것들에 익숙해지신다면 훨씬 좋은 개발 능력을 기를 수 있을것이라고 생각합니다.

 해당 게시글에 설명하지 않은 것들은 기회가 된다면 다른 글로 설명할 수 있도록 하겠습니다!


* 궁금한점이 있으시면 댓글로 남겨주세요~ 최대한 빨리 답변드리도록 하겠습니다!



코틀린 기본 문법 알아보기

Kotlin 기본 문법