기본 선언 방법
- val : 자바의 final 키워드처럼 초기화 후에 변경X
- var : 가변 변수이므로 초기화 후에 변경 가능
(val|var) 변수명 : 반환 타입 = 변수에 담을 값
변수 선언
- 타입은 생략 가능 (추론)
- 선언 -> 할당(지연 할당)의 경우 타입 명시 필수
val a : Int = 1
탑-레벨에 선언 가능
fun 함수명(인자: 타입, 인자 : 타입) : 반환 타입 { }
fun sum(a: Int, b: Int) : Int = a + b
void처럼 Unit이 반환 타입이 된다. (생략 가능)fun greeting(message:String = "hello") {}
greeting(message = "안녕")
if .. elsewhenwhen (대상변수) {
조건1, 조건2 -> 참인 경우 실행
조건3 -> 참인 경우 실행
else -> 참인 조건이 없을 경우 실행
}for loopfor (i in 0..3) { } // 0 <= i <= 3 반복
for (i in 0 until 3) { } // 0 <= i < 3 반복
for (i in 0..6 step 2) { } // 2씩 증가
for (i in 3 downTo 1) { } // 3 >= i >= 1 1씩 감소
for (i in numberList) { } // 배열값 반복 foreach와 유사하며 사용법은 위와 같다. while loopOptional을 지원하기 시작했다.val a : String? = nulla?.lengthval b = a?.lenth ?: 0val d = c!!.lengthThrowable을 상속한다. Exception 계층을 코틀린 패키지로 래핑한다.try .. catch로 감싸지 않아도 된다.try .. catch .. finally 구문을 사용할 수 있다. try .. catch .. finally 구문 역시 표현식이다.class 키워드를 사용하여 클래스 선언후행 쉼표를 사용할 수 있다. (git diff에서 유용)var, val 모두 사용 가능하다.var로 선언된 프로퍼티의 getter, setter를 자동으로 생성한다.val로 선언된 프로퍼티는 getter만 존재한다.class Coffee {
val brand: String
get() = "스타벅스" //커스텀 getter
var quantity: Int = 0
set(value) {
if (value > 0) {
field = value
}
}
} - 또한 위와 같이 var로 선언된 프로퍼티에 한하여 커스텀 setter를 만들 수 있다.field라는 식별자를 사용해 필드의 참조에 접근하는데 이를 Backing Field에 접근한다고 한다.field가 존재하지 않으면 값을 할당할 때 무한 재귀가 발생한다. (위에서 field 대신 quantity 사용)final키워드 사용 가능 상속을 목적으로 하지 않는 클래스는 상속을 막아라라는 것이 존재 open 키워드로 상속을 허용:을 추가하고 상위 클래스 입력 open class Dog
class Bulldog : Dog()open을 사용해 오버라이드를 허용해야함.open되어 있으므로 final 키워드로 하위 클래스 오버라이드를 막을 수 있음. super 키워드 사용 가능 abstract 키워드를 통해 추상 클래스도 사용 가능 interface 키워드를 사용해 인터페이스 정의 가능 interface Cart {
fun add(num: Int) //추상함수 -> 구현 필요
fun rent() { //구현함수 -> 구현 불필요
...
}
}super<인터페이스명>을 통해 특정 인터페이스를 선택할 수 있다. enum class PaymentStatus(val label: String) : Payable {
UNPAID("미지급") {
override fun isPayable() = true
},
PAID("지급완료"){
override fun isPayable() = true
},
FAILED("지급실패"){
override fun isPayable() = true
},
REFUNDED("환불"){
override fun isPayable() = true
},
}
enum 키워드를 사용해 열거형을 정의할 수 있다. enum 클래스도 클래스이므로 생성자와 프로퍼티를 정의할 수 있다.for (status in PaymentStatus.values()) {
println("${status.name}, ${status.label}, ${status.ordinal}")
}
values() : Array<EnumClass> 함수를 사용한다.