Package (패키지)
📌 패키지
- 소스 파일은 패키지 선언으로 시작 됨
- 모든 콘텐츠(클래스, 함수, ...)는 패키지에 포함됨
- 패키지를 명세하지 않으면 이름이 없는 기본 패키지에 포함됨
package foo.bar
fun baz() {}
class Goo {}
fun main(args: Array<String>){
foo.bar.bax()
foo.bar.Goo()
}
📌 기본 패키지
- 기본으로 import되는 package 가 있음
- 플랫폼 별로 import되는 package도 다른 부분도 있음
kotlin.*
kotlin.annotation.*
kotlin.collections.*
kotlin.comparisons.* (since 1.1)
kotlin.io.*
kotlin.ranges.*
kotlin.sequences.*
kotlin.text.*
JVM:
java.lang.*
kotlin.jvm.*
JS:
kotlin.js.*
📌 Imports
- 기본으로 포함되는 패키지 외에도, 필요한 package 들을 직접 import 할 수 있음
//Bar 1개만 import 함
import foo.Bar
// 'foo' 패키지에 모든 것을 import 함
import foo.*
// foo.Bar
// bar.Bar 이름이 충돌 나는 경우 'as' 키워드로 로컬 리네임 가능
import bar.Bar as bBar
Return and Jumps
📌 3가지 Jump 표현식
- return : 함수나 익명 함수에서 반환
for sum(a:Int, b:Int):Int {
println("a: $a, b: $b")
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
- 레이블 표현 : label@, abc@, fooBar@
- 식별자 + @ 형태로 사용
labelDefinition
(used by prefixUnaryOperation, annotatedLambda)
: LabelName ++ "@"
;
loop@ for (i in 1..10) {
println("--- i: $i ---")
for (j in 1..10) {
println("j: $j")
if (i+j >12) {
break@loop
}
}
}
loop@ for (i in 1..10) {
println("--- i: $i ---")
for (j in 1..10) {
if (j<2) {
continue@loop
}
println("j: $j")
}
}
📌 Label 로 return
코틀린에서 중첩 될 수 있는 요소들
- 함수 리터럴 (function literals)
- 지역함수 (local function)
- 객체 표현식 (object expression)
- 함수 (functions)
fun foo() {
var ints = listOf(0,1,2,3)
ints.forEach(fun(value: Int) {
if(value == 1) return
print(value)
}
print("End")
}
📌 람다식에서 return 할 때 주의사항
- 람다식에서 return 시 nearest enclosing 함수가 return 됨
- 람다식에 대해서만 return 하려면 label을 이용해야 함
fun foo2() {
var ints = listOf(0,1,2,3)
ints.forEach {
if(it == 1) return
print(it)
}
print("End")
}
fun foo()3 {
var ints = listOf(0,1,2,3)
ints.forEach lavbel@ {
if(it == 1) return@label
print(it)
}
print("End")
}
📌 암시적 레이블
- 람다식에서만 return 하는 경우 label을 이용해서 return 해야 함
- 직접 label을 사용하는 것보다 암시적 레이블이 편리함
- 암시적 레이블은 람다가 사용된 함수의 이름과 동일함
for foo4() {
var ints = listOf(0,1,2,3)
ints.forEach {
if (it ==1 ) return
print(it)
}
print("End")
}
📌 레이블 return 시 값을 반환할 경우
- return@label 1 형태로 사용
- return + @label + 값
fun foo(): List<String> {
var ints = listOf(0,1,2,3)
val result = ints.map {
if(it==0) {
return@map "zero" // return at named label
}
"number $it" // expression returned from lambda
}
}
728x90
반응형
'안드로이드 프로그래밍 > kotlin' 카테고리의 다른 글
[KotlinSyntax] Inheritance 상속 (0) | 2022.02.21 |
---|---|
[KotlinSyntax] Class (0) | 2022.02.21 |
[Android Studio] # date and time 다루기 (0) | 2022.02.16 |
[Android Studio] kotlin 기본 문법3( 함수, 클래스 ) (0) | 2022.02.14 |
[Android Studio] kotlin 기본 문법2( 배열, 컬렉션 ) (0) | 2022.02.13 |