티스토리 뷰

Lang/Java

Java vs Kotlin 문법 비교

호형 2022. 7. 11. 18:17

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")
}​​​​​
 

생성자

 코틀린에서는 init 블록을 사용하여 기본 생성자를 대체한다. 생성자에 인자가 필요한 경우는 다음과 같이 인자를 받을 수 있다. 코틀린에서는 이를 주 생성자(primary constructor)라 부르며, 여기에서 받은 인자는 init 블록에서도 사용할 수 있다.

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에서 VO (Value Object)를 사용시 캡슐화 원칙에 따라 관례적으로 하던 setter, getter, 생성자 등을 만드는 행위를 하였다. 물론 lombok 등을 활용하여 간편화 할 수 있지만 코틀린은 언어 차원에서 이를 간결하게 표현하도록 했다. 

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")



조건문

 if 문은 사용법이 java와 동일하고 switch 문은 코틀린에서는 when으로 사용할 수 있다. 

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

 파라미터로 넘어온 값이 null 인 경우 Java 에서는 별도로 null 체크를 해줘야 하지만 코틀린에서는 default 값을 넣어줄 수 있다.

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

 Checked Exception의 표현은 java에서 만들어지고 사용되고 있지만 코틀린에서는 이를 제거했다. 

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

 

댓글
최근에 올라온 글
최근에 달린 댓글
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30