프로그래밍적인 특징
- 확장 함수, 연산자 오버로딩을 지원한다.
- int 형을 확장해 'i = 3 power 4'식으로 새 연산자를 만들 수 있다.
- '==' 연산자의 경우 equals()와 똑같이 작동 하므로 i == j는 true이다.
- 자바의 '==' 를 쓰려면 '===' 를 쓰고, != 의 경우 !== 이다.
- static 메서드가 없다. 대신, companion object를 사용해 '클래스명.companion.메서드_혹은_get변수명()'을 사용한다.
- 자바와 완전하게 상호 운용된다.
NPE(NullPointerException)
- 필드나 변수를 선언할 때 기본값을 강제하지 않으므로.
- field, method 등이 어느 시점에 초기화 되는지 잘 알 수 없다.
- 안드로이드의 Activity, Fragment의 생명주기 때문에 특정 시점에 null일 수 있다.
NPE 대처 방법
if ( foobar != null ) {
// foobar 사용하는 코드
}
try {
foobar.doSomething();
} catch ( NullPointerException e ) {
// 예외 처리
}
Null Safety
- null을 처리하는 데 있어 안전한 방법을 제공
- 변수를 선언할 때 읽기만, 쓰기 가능여부
- null 값을 가질 수 있는지 없는지
- 초기값으로 어떤 값을 가지는지 정해야 한다.
hello?.doSomething()
- ?는 null이 될 수 있음을 나타낸다.
- if ( hello != null ) hello.doSomething()과 동일
- hello가 null이 아닌 경우에만 doSomething()을 호출함
- hello!!.doSomething() 표현식을 쓰면 호출을 강제하고 null 이면 NullPointerException을 발생한다.
코드예제
var neverNull : String = "something"
var mightBeNull : String? = null // ?를 사용해 null이 될 수 있음을 나타낸다.
if ( neverNull.length > 0 ) { // 이 경우엔 문제 없음
...
}
if ( mightBeNull.length > 0 ) { // 이 구문은 컴파일러에서 에러
...
}
Higher-order Functions
- 함수 자체를 파라미터로 가져오거나 리턴할 수 있다.
- 함수는 변수에 저장되어 나중에 사용될 수 있다.
- 함수는 다른 함수 안에서 생성될 수도 있다.
Lambdas
- 함수가 선언되지 않았는데 전달 될 수 있다.
Java의 onClick에 대한 기본 형태
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
view.setAlpha(0.5f); // do something
}
});
Kotlin의 Lambda식으로 변환된 형태
button.setOnClickListener {
view -> view.alpha = 0.5f // onClick에 view를 변수로 가지므로
}
- 제공되는 it 키워드를 사용하는 경우 ( 제한 : 함수의 변수가 한 개 이어야 함 )
button.setOnclickListener {
it.alpha = 0.5f
}
Data classes
데이터를 가진 클래스
- 특정 데이터 타입을 정의할 때 클래스와 속성 필드만 있는 클래스를 만들어 왔다.
- Java에서는 각 필드의 get/set 메서드를 통해 접근하며 이러한 메서드를 만드는 과정이 지루하다.
- 코틀린에서는 클래스를 싱글라인으로 모든 속성과 함께 선언할 수 있다.
- 또한, 컴파일러가 모든 get/set을 만들고 toString(), copy() 함수까지 생성한다.
매개변수가 많은 메서드와 기본인수
- 기본인수의 사용
fun orderPizza ( size : Size, pepperoni : Boolean, mushrooms : Boolean,
ham : Boolean, pineapple : Boolean, pickles : Boolean,
sausage : Boolean, peppers : Boolean, onion : Boolean)
{
...
}
// Wait... did I just order pickles on my pizza?
// Why do we even have that option?
orderPizza ( Size.LARGE, true, false, false, false, true, false, true, false)
fun orderPizza ( size : Size,
pepperoni : Boolean = false,
mushrooms : Boolean = false,
ham : Boolean = false,
pineapple : Boolean = false,
pickles : Boolean = false,
sausage : Boolean = false,
peppers : Boolean = false,
onion : Boolean = false)
{
...
}
orderPizza ( Size.LARGE, ham = true, mushrooms = true )
- 아래쪽이 훨씬 읽기 쉽게 되어있다.
요약
- static 대신 companion object를 사용해 접근한다.
- 자바와 완전하게 상호 운영된다.
- NPE(NullPointerException)을 대처할 수 있다.
- 필드나 변수를 선언할 때 기본값이 반드시 정해져야 한다.
- null 가능성이 있을때는 ?, NPE를 발생 시키려면 !!를 사용한다.
- Higher-order 함수는 함수 자체를 파라미터로 가져오거나 리턴할 수 있다.
- data 클래스는 get/setter 함수는 자동으로 만들며 싱글라인에 선언할 수 있다.
- 불변성/가변성 변수 선언을 위한 val, var을 제공한다.
'# 02 > 코틀린' 카테고리의 다른 글
[Kotlin] 변수와 타입 2 (0) | 2019.08.12 |
---|---|
[Kotlin] 변수와 타입 1 (0) | 2019.08.12 |
[Kotlin] super와 this의 참조 (0) | 2019.08.08 |
[Kotlin] 상속과 다형성 (0) | 2019.08.07 |
[Kotlin] 생성자 (0) | 2019.08.06 |