Kotlin
(Kotlin) Kotlin vs Java (+ 추가기능, 코틀린 컴파일 과정)
Developer RyanKim
2020. 8. 23. 16:07
Kotlin vs Java 추가 기능 코틀린 컴파일 과정
https://lion-king.tistory.com/entry/Kotlin-what-is
이전 글에 이어 Kotlin의 컴파일 과정, Kotlin과 Java의 차이점을 정리합니다.
Kotlin 컴파일 과정
Java 코드와 Kotlin 코드가 함께 있는 프로젝트의 빌드 과정
- Kotlin 컴파일러가 Kotlin 코드를 컴파일해 .class 파일을 생성한다.
이 과정에서 Kotlin 코드가 참조하는 Java 코드가 함께 로딩되어 사용된다. - Java 컴파일러가 Java 코드를 컴파일해 .class 파일을 생성한다.
이때 이미 Kotlin이 컴파일한 .class 파일의 경로를 클래스 패스에 추가해 컴파일한다.
Kotlin vs Java 및 추가 기능
(거의 Kotlin의 장점을 나열하게되는 것 같다)
1. 간결한 코드
- Java 코드
package com.example.jinsu.hellokotlin;
public class JavaMoney {
@Override
public int hashCode() {
return super.hashCode();
}
@Override
public boolean equals(Object obj) {
return super.equals(obj);
}
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
@Override
public String toString() {
return "JavaMoney{" +
"amount=" + amount +
", currency='" + currency + '\'' +
'}';
}
public JavaMoney(int amount, String currency) {
this.amount = amount;
this.currency = currency;
}
private int amount;
private String currency;
public int getAmount() {
return amount;
}
public String getCurrency() {
return currency;
}
}
- Kotlin 코드
package com.example.jinsu.hellokotlin
data class Money(val amount: Int, val currency: String)
Kotlin으로 작성한 위의 코드에서 살펴볼 수 있는 Kotlin의 기본 문법은 다음과 같습니다.
- Java에서는 패키지가 파일 시스템의 디렉터리 구조와 동일했는데, Kotlin에서는 패키지가 디렉터리 구조와 동일하지 않아도 됩니다.
- 클래스의 파라미터를 선언할 때 Java에서는 '타입 이름'의 형식으로 작성하지만, Kotlin에서는 '이름: 타입'의 형식으로 작성합니다.
- 파라미터 이름 앞에 있는 val은 변경 불가능한(read-only) 변수임을 나타내는 키워드입니다. Java의 final 키워드와 같습니다. 변경 가능한(mutable) 변수를 나타낼 때는 var 키워드를 사용합니다. Java에서 final 키워드를 사용하지 않은 일반적인 변수와 같습니다.
- data class는 특별히 별도의 함수가 필요하지 않고 데이터만 갖고 있는 클래스를 의미하는 키워드입니다.
- data class 키워드가 있으면 컴파일러가 자동으로 equals() 메서드와 hashCode() 메서드, toString() 메서드, copy() 메서드 등을 생성합니다.
2. 객체생성
data class Money(val amount: Int, val currency: String)
fun main(args: Array<String>) {
val tickets = Money(100, "$")
val popcorn1 = tickets.copy(500, "EUR")
var popcorn2 = tickets.copy(100, "$")
if (tickets != popcorn1) {
println("popcorn1 is different!")
}
if (tickets != popcorn2) {
println("popcorn2 is different!")
}
}
이 예에 나타난 Kotlin 문법의 특징은 다음과 같습니다.
- 객체를 생성할 때 Java에서는 new 생성자를 사용하지만 Kotlin에서는 new 생성자를 사용하지 않습니다.
- 인스턴스를 생성할 때 정확한 타입을 명시하지 않아도 자동으로 타입을 유추해 적용합니다. 그래서 val 키워드와 var 키워드만으로 인스턴스를 생성한 것을 볼 수 있습니다.
- 다음과 같이 명시적으로 타입을 명시해 인스턴스를 생성할 수도 있습니다.
val popcorn3: Money = Money(100, "$)
3. 연산자 오버로딩
연산자 오버로딩(operator overloading)은 클래스에 사용할 수 없는 기본 연산자(+, -, *, /, ++, -- 등)를 클래스에 사용할 수 있게 연산자를 정의하는 것입니다.
operator fun Money.plus(money: Money) =
if (currency == money.currency) {
Money(amount + money.amount, currency)
} else {
throw IllegalArgumentException("We're gonna have a problem here!")
}
fun main(args: Array<String>) {
val tickets = Money(100.bd, "$")
val popcorn = tickets.copy(500.bd, "EUR")
val cost = tickets + popcorn
}
모든 내용은
https://d2.naver.com/helloworld/7543578
를 참고하였습니다.