클래스 프로퍼티
val을 사용해 프로퍼티를 선언하면 getter를 무조건 포함한다.
var을 사용해 프로퍼티를 선언하면 gettter와 setter를 포함한다.
class Car(val name: String, var position: Int = 0)
이 예제에서 name은 프로퍼티, 필드, getter, 생성자 파라미터의 역할을 한다.
position을 캡슐화하기 위해 아래와 같이 setter를 private로 바꾼다.
class Car(val name: String, var position: Int = 0) {
var position: Int = position
private set
}
상수 사용하기
private const val DEFAULT_POSITION: Int = 0
class Car(val name: String, var position: Int = DEFAULT_POSITION)
const는 int, string과 같은 원시 타입에만 사용할 수 있다.
객체에서 const를 사용하고 싶으면 val을 사용하거나 @JvmField 를 사용한다. Jvm 어노테이션은 나중에 알아보도록 하자.
class Car(val name: String, var position: Int = DEFAULT_POSITION) {
companion object {
@JvmField
val DEFAULT_CAR = Car("anna")
}
}
Companion Object는 클래스와 독립적으로 사용될 클래스 멤버를 정의하는 역할을 한다.
자바로 따지자면 정적 클래스나 변수를 의미하는데, 코틀린에는 static 이 없기 때문에 companion object를 사용한다.
스마트 캐스트
코틀린은 Nullable 타입을 지원한다.
var anna: Person?
이렇게 선언한다.
anna.age
Nullable 타입으로 선언된 변수의 내부 함수나 변수를 사용하려고 하면, 그냥 일반적인 방법으로 점을 찍고 사용하면 된다. 이를 스마트 캐스트라고 한다.
연산자
text가 String? 이라는 가정 하에 연산자를 알아보자.
text.length
이렇게 작성하면 에러를 띄운다. NPE가 뜰 수 있는 코드이기 때문이다.
val len = text?.length
len은 Int? 타입으로, Nullable 한 타입이된다.
val len = text?.length ?: 0
?:는 엘비스 연산자라고 불린다. text가 null 이라면 0을 반환하는 연산자이다. len 은 not null 타입이 된다.
text!!.length
!!은 not null을 강제하는 연산자이다. 만약 text가 null 이라면 NPE가 뜬다.
require vs check
require과 check을 사용해 간단하게 예외처리할 수 있다.
require은 IllegalArgumentException, check은 IllegalStateException을 던진다.
require(name.length <= 5)
name의 길이가 5 이하가 아니라면 에러를 던지는 코드이다.