코틀린 vs 자바
-
간결한 문법
-
세미콜론을 넣지 않아도 된다.
-
객체를 생성할 때 new 키워들르 사용하지 않는다.
-
타입 추론을 지원하므로 일반적인 경우 타입을 명시하지 않아도 된다.
//타입을 항상 명시해 주어야 한다. String name = "KnowRe"; //객체 생성 시 new키워드를 사용합니다. Person person = new Person(name);
//타입을 적지 않아도 타입 추론을 통해 String 타입으로 지정합니다. val name = "KnowRe" //객체 생성 시 new 키워드를 사용하지 않는다! val person = Person(name)
-
-
널 안정성(Null Safety)
-
자바에서는 객체가 null을 허용하는지의 여부를 따로 구분하지 않는다.
-
코틀린에서는 컴파일 단계에서 객체의 null 허용 여부를 구분하므로 런타임 오류를 줄일 수 있다.
//널 값을 허용하는 문자열 타입(String) val foo: String? = null //널 값을 허용하지 않는 문자열 타입(String) val bar: String = "bar"
-
-
가변/불변 구분
-
코틀린에서는 변수, 변수 내 할당된 값의 불변 여부를 구분할 수 있다.
-
최초 생성 시 할당된 값을 이후에도 변경할 수 없다면 val
-
최초 생성 후, 값을 변경할 수 있드면 var
//자바의 final String foo = "foo"; 와 동일합니다. val foo: String = "foo" //아래 코드는 컴파일 에러가 발생한다. foo = "foo" //자바의 String bar = "Bar"; 와 동일 var bar: String = "bar" //컴파일 성공 bar = "bar"
-
변수와 마찬가지로 컬렌션 자료형에 대해서도 가변/불변 여부를 구분한다.
-
자료의 가변/불변 여부는 인터페이스로 구분하며, 불변 인터페이스의 경우 삽입/삭제/수정과 같은 함수가 없다.
//자료를 변경할 수 없는 리스트 생성 val immutable: List<String> = listOf("foo", "bar" , "baz"); //컴파일 에러. add()함수가 정의되어 있지 않다. immutable.add("test") //자료를 변경할 수 있는 리스트 생성 var mutable: MutableList<String> = mutableListOf("foo" , "bar"); //MutableList에는 자료를 수정할 수 있는 함수가 정의되어 있다. mutable.add("test")
-
-
람다 표현식 지원
- 기존에는 안드로이드 개발 환경의 제약으로 람다 표현식을 사용하기 어려웠음.
- 코틀린에서는 람다 표현식을 기본으로 지원하므로 특별한 제약없이 코드를 간소화 할 수 있다.
-
스트림 API 지원
- 자바8은 컬렉션 내 자료를 다루는 데 유용한 스트림API를 제공하지만 안드로이드 6.0 이상을 사용하는 플랫폼에서만 이 API를 사용할 수 있었다.
- 코틀린 표준 라이브러리를 통해 제공하며 안드로이드 플랫폼 버젼과 상관없이 사용할 수 있어서 유용하다.
val items = listOf(10,2,3,5,6) //리스트 내 항목 중 짝수의 합을 구한다. val sumOfEvens = items.filter{it%2 == 0}.sum()
-
완벽한 자바 호환성
- 자바에서 코틀린을 사용하는것도 가능, 코틀린에서 자바를 사용하는것도 모두 가능하다.