티스토리 뷰
Kotlin이란?
코틀린은 2011년 7월 IntelliJ를 만든 JetBrains 에서 최초 공개했다.
다중패러다임 언어이며 자바와 같은 객체지향 특성과 함수형 언어의 특징을 가지고 있다.
자바의 보일러플레이트를 삭제하기 위해 언어 차원에서의 고민이 느껴지고 무엇보다 스프링에서 공식 지원한다. 안드로이드의 공식 지원 언어이기도 하다.
기본문법
java의 문법을 조금이라도 간결하게 표현하기 위해 조금씩 바뀐 모습이 있다.
1. 코틀린에서는 문단의 끝을 알리는 ; (세미콜론)을 사용하지 않는다.
2. primitive type이 없다. (char, int, double 등.. 변수 선언을 var, 상수 선언을 val로 한다.)
3. 변수의 타입이나 메소드의 리턴 타입이 이름 뒤에 따라오는 콜론(:) 뒤에 나온다.
4. 함수를 변수처럼 사용하는 것이 가능하다.
5. Destructuring을 지원한다.
6. method를 표현할 때 fun 으로 표현한다.
7. new 키워드를 쓰지 않고 객체를 생성한다.
8. Null의 안정성을 추구하기 위해 기본적으로 변수 값은 Null이 될 수 없다.
Main
각 언어의 main method 작성방식에 대해 알아본다.
java
public class Main {
public static void main(String[] args){
System.out.println("Hello World");
}
}
kotlin
fun main(args: Array<String>){
println("Hello World")
}
생성자
java
public class Foo {
public Foo(int a){
//생성자에서 수행할 작업들
...
}
}
kotlin
class Foo(a: Int) {
init {
//생성자에서 수행할 작업들
...
}
}
주 생성자 외에 다른 형태의 생성자가 필요한 경우 constructor 키워드를 사용하여 추가 생성자를 선언할 수 있다.
kotlin
class Foo(val a: Int, var b: Char){
//a의 값만 인자로 받는 추가 생성자
//기본 생성자를 반드시 호출해야 한다.
constructor(a: Int) : this(a, 0)
//두 인자의 값을 모두 0으로 지정하는 생성자
constructor(): this(0, 0)
}
접근 제한자
코틀린에서 접근 제한자를 사용하는 방법은 자바와 매우 유사하지만 조금 차이가 있다. 바로 제한자가 없을 경우에 차이가 있는데 java에서는 접근 범위를 package로 한정짓지만 코틀린에서는 public과 동일한 표현으로 사용된다. 대신 코틀린에서는 모듈 범위로 하고 싶을때 internal 접근 제한자를 사용한다.
java
public class Foo {
public int a = 1;
protected int b = 2;
private int c = 3;
//패키지 단위 제한자(별도 표기 없음)
int d = 4;
}
kotlin
class Foo {
//접근 제한자가 없으면 public 으로 간주
val a = 1
protected val b = 2
private val c = 3
//internal을 대신 사용한다.
internal val d = 4
}
객체 초기화
객체를 new로 초기화 하지 않아도 객체를 선언할 수 있다. apply block 을 사용하여 전달할 데이터까지 묶어서 간결하게 선언할 수 있다. block 안에서는 아래와 같이 사용할 수 있으므로 가독성과 코드가 깔끔해진다. 복잡할수록 더 효과가 있다.
java
Intent intent = new Intent(this,JavaActivity.class); //객체 초기화 및 생성
intent.putExtra("Java",1);
intent.putExtra("Kotlin",2);
kotlin
val intent = Intent(this,MenuActivity::class.java).apply{ //apply block
putExtra("java",1)
putExtra("Kotlin",2)
}
Boilerplate
java
public class Student {
private String name;
private String age;
public Student(String name) {
this.name = name;
}
...
kotlin
data class Student (val name: String, val age: Int)
비교문
javascript에서 비교하는 방법처럼 ==, === 을 통해 값 뿐만 아니라 Type까지 비교한다.
java
Member a = new Member("abc");
Member b = new Member("abc");
if(a.equals(b)) System.out.println("equals -> true");
if(a == b) System.out.println("== -> false");
kotlin
var a = Member("abc")
var b = Member("abc")
if(a == b) println("equals -> true")
if(a === b) println("=== -> false")
조건문
kotlin
fun countItems(count: Int){
when(count){
1 -> println("There is $count item.")
else -> println("There are $count item.")
}
}
반복문
인덱스 기반 for 문과 for-each 문을 모두 지원하는 자바와 달리 코틀린은 for-each문만 지원한다. while 문은 java와 동일하다.
kotlin
val items = listOf("foo", "bar", "baz")
for (item in items){
println("item: $item")
}
Default Argument
java
public void printHello (String message){
if (null == message || message.length() == 0) {
message = "hi";
}
System.out.pringln("Hello" + message);
kotlin
fun printHello (message: String = "hi") {
println("Hello $message")
}
Readable Argument
method 의 인자값이 많을 경우 순서와 의미를 착각하기 쉬운데 코틀린에서는 가독성이 좋게 표현을 하였다.
java
sampleMethod("tom", 50, 30, 30);
kotlin
sampleMethod(name="tom", age=50, total=30, zia=30)
Try Catch
java
try {
Thread.sleep(5);
} catch (InterruptedException e) {
e.printStackTrace();
}
kotlin
Thread.sleep(5)
Casting
코틀린에서는 when 절을 통해 체크후 바로 캐스팅을 암묵적으로 해준다.
java
List<Bird> list = Lists.newArrayList(new Eagle(), new Owl());
for(Bird bird : list) {
if (bird instanceof Eagle) ((Eagle) bird).fly();
if (bird instanceof Owl) ((Owl) bird).sleeping();
}
kotlin
val birds = listOf(Owl(), Eagle())
for(b in birds){
when(b){
is Owl -> b.sleeping()
is Eagle -> b.fly()
else -> throw ClassCastException("Unknown Bird")
}
}
Return
함수의 return을 간단하게 {} 없이 처리할 수 있다.
java
public double cube(double x) {
return x * x * x;
}
kotlin
fun cube(x: Double) : Double = x * x * x
참조
https://warpgate3.tistory.com/entry/Kotlin-vs-Java
https://dev-seungwon.tistory.com/8
https://readystory.tistory.com/83
'Lang > Java' 카테고리의 다른 글
Java 8 버전 이후 새로운 기능 정리 및 코드 예제 (펌) (0) | 2022.05.31 |
---|---|
JDK11 to JDK17 migration point & features (0) | 2022.05.31 |
make field(List or Map) transient or serializable 조치 (0) | 2022.02.08 |
파일 다운로드 시 Content-Disposition 한글 파일 이름 깨지는 오류 조치 (0) | 2022.01.25 |
[Java] java.io.IOException: Stream Closed 오류 조치 (1) | 2022.01.20 |