Basic Syntax
기본 문법을 알아보자.
패키지 정의
패키지 정의는 파일 최상단에 위치한다.
디렉토리와 패키지를 일치시키지 않아도 된다. 이점은 자바와 다른 부분이다.
함수 정의
fun sum(a: int, b: int): int {
return a + b
}
자바와는 다르게 fun이라는 키워드를 이용하여 함수를 정의한다.
':' 문자가 나온 후 return 타입을 선언한다. 이는 생략될 수 있다.
또한 함수 몸체(body)가 식인 경우 return을 생략할 수 있다.
fun sum(a:int, b: int) = a + b
위 두 함수는 같은 함수이다.
return 할 값이 없는 경우 Unit(Object)을 return 한다.
fun printKotlin(): Unit{
println("hello Kotlin")
}
//같은 코드
fun printKotlin(){
println("hello Kotlin")
}
지역 변수 정의
- val: 읽기전용 변수 (선언 즉시 할당해야 한다. 타입을 선언 안 하면 자동으로 인식해서 할당)
- var: 모두 가능한 변수
주석
- 한줄 주석: //
- 여러 줄 주석: /* */
문자열 템플릿
String Interpolation (문자열 보간법)
var a = 1
val s1 = "a is $a"
a = 2
val s2 = "${s1.replace("is", "was")}, but now is $a"
자바스크립트와 같이 '$'로 중간에 삽입할 수 있다.
조건문
fun maxOf(a: int, b:int): int{
if(a > b){
return a
else{
return b
}
}
//Same
fun maxOf(a: int, b: int) = if (a > b) a else b
Java와 비슷하게 사용할 수 있다. 식으로 간단하게 표현 가능하다.
nullable
Kotlin의 장점이라 할 수 있는 부분이다.
값이 null 일 수 있는 경우 타입에 nullable 마크를 명시해야 한다.
fun parseInt(str: String): Int?{
//정수가 아닌 경우 null을 리턴
}
만약 ?를 명시하지 않았는데 null이 발생하면 에러가 발생한다.
fun printProduct(arg1: String, arg2: String){
val x: Int? = parseInt(arg1)
val y: Int? = ParseInt(arg2)
if(x != null && y != null) {
println(x * y)
}else{
println("either '$arg1' or '$arg2' is not a number")
}
}
자동 타입 변환
타입 체크만 해도 자동으로 타입이 변환된다.
fun getStringLength(obj: Any): Int? {
if(obj is String){
return obj.length
}
return null
}
when
fun describe(obj: Any): String =
when (obj){
1 -> "One"
"Hello" -> "Greeting"
is Long => "Long"
!is String -> "Not a string"
else -> "unknown"
}
switch case 구문처럼 사용한다. 어느 데이터 타입이든 사용할 수 있어 매우 효류적인 구문이다.
ranges
in 연산자를 이용해서 숫자 범위를 체크 가능하다.
for loop에서도 가능하다.
val x = 3
if(x in 1..10){
println("fits in range")
}
collections
컬렉션도 in으로 loop가 가능하다.
val items = listOf("apple", "banana", "kiwi")
for(itme in items){
println(item)
}
람다식을 이용해서 컬렉션에 filter, map 등의 연산이 가능하다.
val fruits = listOf("banana", "avocado", "apple", "kiwi")
fruits
.filter{it.startsWith("a")}
.sortedBy{ it }
.map {it.toUpperCase()}
.forEach{println(it)}