Package
패키지 (C++이나 C#에서의 Library와 유사함.)
Package foo.bar
fun baz() {}
class Goo {}
fun main(args:Array<String>){
foo.bar.baz()
foo.bar.Goo()
}
기본 패키지
kotlin.*
kotlin.annotation.*
kotlin.collections.*
kotlin.comparisons.*
kotlin.io.*
kotlin.ranges.*
kotlin.sequences.*
kotlin.text.*
// JVM
java.lang.*
kotlin.jvm.*
// JS
kotlin.js.*
Imports
// Bar 1개만 import 함
import foo.Bar
// foo에 있는 모든 것(함수/변수)를 import함.
import foo.*
// Bar를 bBar로 import함. (충돌 방지)
import bar.Bar as bBar
Return and Jumps
3가지 Jump 표현식 (C++, C#이랑 똑같음.)
// return
fun sum(a:Int, b:Int): Int{
return a+b
}
// break
for (x in 1..10){
if(x>2){
break
}
println("x:$x")
}
// continue
for(x in 1..10){
if(x<2){
continue
}
println("x:$x")
}
Label로 Break and Continue
loop@ for(i in 1..10){
println("---i: $i---")
for(j in 1..10) {
println("j: $j")
if(i + j > 12){
break @loop
}
}
}
// for문이 두개 중첩되어 있을 경우 식별자 + @로 break했을 때 식별자가 있는 위치의
// 루프에 대해서 그냥 다 끝내버릴 수 있음. (continue도 동일함. Jump해 버림.)
Label로 Return
fun foo() {
var ints = listOf(0,1,2,3)
ints.forEach(fun(value:Int){
if(value == 1) return
print(value)
})
// forEach안에 함수가 또 있음. (1은 출력 안하는 함수) 근데 return이 함수를
// 끝내버리는게 아니라 함수에서 한번 돌고 또 다시 실행됨.
print("End")
}
// 결과 : 023End
// 함수가 중첩되어 있을때, 안에 있는 함수를 리턴하면, 그 함수만 반환한다.
람다식에서 return할 때 주의사항
// 람다는 조금 다름.
fun foo() {
var ints = listOf(0,1,2,3)
ints.forEach{
if(it == 1) return
print(it)
}
print("End")
}
// 결과 0 얘는 함수의 중첩을 허용하지 않음.
fun foo3() {
var ints = listOf(0,1,2,3)
ints.forEach label@{
if(it == 1) return@label
print(it)
}
print("End")
}
// 결과 023End -> 이렇게 하면 람다만 리턴이 되기 때문에 중첩시킨 함수에서의 return과
// 동일하게 나옴.
암시적 레이블
fun foo4()
{
var ints = listOf(0,1,2,3)
ints.forEach{
if(it == 1) return@forEach // 이런식으로 리턴하면 암시적 레이블
print(it)
}
print("End")
}
레이블 return시 값을 반환할 경우
fun foo(): List<String> {
var ints = listOf(0,1,2,3)
val result = ints.map{
if(it == 0){
return@map "zero"
}
"number $it"
}
return result
}