- 함수는 fun. 클래스 필요없음
- 변수는 var. 세미콜론 필요없음
- 타입은 콜론 뒤에 명시적 지정 가능. Reference Type으로만 작성. 코틀린이 타입을 추론함
- 상수는 val. 재할당 불가(자바 final)
- const val로 탑레벨 상수 지정 시 컴파일 타임에 사용 가능. main 함수 실행 전에 실행됨
const val top = 200
val num = 100
fun main() {
var i : Int = 10
var name : String = "hi"
var point : Double = 3.3
}
- String interpolation: "Hi! I'm ${name}"
- if문: 기본 문법은 자바와 같음. when문이 추가됨. IDE에서 Option + Enter로 변환 가능. if문의 결과를 변수로 받을 수 있음
fun main() {
var i = 5
when {
i > 10 -> {
print("10")
}
i > 5 -> {
print("5")
}
else -> {
print("")
}
}
fun main2() {
var i = 5
var result = if ( i > 10) {
print("10")
}
else if (i > 5) {
print("5")
}
else {
print("~!~")
}
- for문: for (item in items) {... }
- 리스트: val items = listOf(1,2,3,4,5). 제네릭 타입은 제외함 -> 조회는 대괄호 items[0]
- 변경 가능한 리스트: mutableListOf(1,2,3,4,5)
- nullable: var name: String? = null로 ? 추가해줘야됨
- name!! : null 아님을 보장. 좋은 코드는 아님
- name?.let { ... } : null이 아니라면 블럭 실행. 해당값은 it으로 참조함
함수
한 줄짜리 함수는 줄여서 쓸 수 있다. 아래 함수처럼 맨 바깥에 그냥 정의한 함수는 탑레벨 함수로 프로젝트 어디에서나 호출이 가능하다.
fun sum(a: Int, b: Int): Int = a+b
클래스
속성값은 소괄호 안에 둔다.
val은 final이라 재할당(setter)이 안됐었다. 앞에 private 까지 쓰면 getter까지 막혀서 접근 자체가 안된다.
data class Person(
private val name: String,
val age: Int,
) {
var hobby = "코딩"
private set
get() = "취미 : $field"
init {
...
}
}
class 앞에 data를 선언하면 자바의 인스턴스 동등 비교인 @EqualsAndHashCode 기능을 갖는다.
class 내부에 init {} 블럭을 정의하면 단순 속성값을 통한 인스턴스 생성 외에 다른 생성 시 동작을 추가할 수 있다.
위 코드의 var hobby 처럼 변수를 정의할 수 있다. 외부에서 설정할 수 없도록 아래에 private set을 적어줄 수 있다. 또한 getter의 동작을 위 코드처럼 바꿔줄 수 있다.
상속
콜론으로 상속받는다. 타이핑 시 소괄호 ()를 반드시 써서 기본 생성자를 호출해야한다.
함수 앞에 open 키워드를 적어야만 자식 클래스에서 override가 가능하다. abstract내 fun에만 open 키워드를 붙이는게 끝이 아니라, 일반 class 앞에도 open 키워드를 붙여줘야지만 다른 곳에서 상속이 가능하다.
interface Drawable {
fun draw()
}
abstract class Animal {
open fun move() {
}
}
class Dog : Animal(), Drawable {
override fun move() {
}
override fun draw() { }
class Cat : Animal()
인터페이스는 소괄호 필요없이 class 타이핑 부분에 적어주면 된다. 당연하지만, 반드시 메서드를 override 해야한다.
콜백함수
///
fun main() {
myFunc({
...
})
}
///
fun main() {
myFunc() {
...
}
}
fun myFunc(callBack: () -> Unit) {
callBack()
}
myFunc 실행문에서 함수 전달 시 {}를 사용한다.
함수를 인자로 전달하는 경우 함수 외부에 전달 함수를 블럭 { }으로 작성해줘도 된다. 만약 콜백함수만 받는다면 myFunc뒤 소괄호 ()도 생략할 수 있다.
suspend와 코루틴
suspend 함수는 함수가 모두 실행될 때까지 기다리게 하는 함수이다. 이 suspend 함수는 lifecycleScope를 통한 코루틴 내부에서만 동작시킬 수 있다.
lifecycleScope.launch {
myFunc(10) {
}
}
suspend func myFunc(a: Int, callBack : () -> Unit = {}) { ... }
참고
오준석의 생존 코딩: Kotlin 문법 총 정리 - 1시간
'Programming-[CrossPlatform] > Kotlin' 카테고리의 다른 글
[TIL] 코틀린 gradle querydsl 설정 (0) | 2023.07.02 |
---|