굥뷰를 햡시댜
[Kotlin] Packages, Return and Jumps 본문
1. Packages
- Kotlin에서 소스 파일은 패키지 선언으로 시작됩니다.
- 모든 콘텐츠(클래스, 함수, ....)는 패키지에 포함됩니다.
- 패키지를 명세하지 않으면 이름이 없는 기본 패키지에 포함됩니다. -> 따로 import하지 않고 그냥 써도 무방함
package foo.bar
fun baz() {}
class Goo{}
fun main(args: Array<String>) {
foo.bar.baz()
foo.bar.Goo()
}
2. 기본 패키지
- package를 import하지 않으면 기본으로 import되는 package가 있습니다.
- 플랫폼 별로 import되는 package는 다른 부분도 있습니다.
//기본으로 import되는 패키지!
kotlin.*
kotlin.anootation.*
kotlin.collections.*
kotlin.comparisons.*
kotlin.io.*
kotlin.ranges.*
kotlin.sequences.*
kotlin.text.*
//JVM
java.lang.*
kotlin.jvm.*
//JS
kotlin.js.*
3. imports
- 기본으로 포함되는 패키지 외에도, 필요한 package들을 직접 import할 수 있음
//Bar 1개만 import함
import foo.Bar //foo라는 패키지에 bar라는 클래스
//'foo' 패키지에 모든 것을 import함
import foo.*
//foo.Bar
//bar.Bar
//foo와 bar라는 패키지에 Bar라는 이름이 동시에 존재
//-> 이름이 충돌 나는 경우 'as' 키워드로 로컬 리네임 가능
import bar.Bar as bBar
4. 3가지 Jump 표현식
- return : 함수나 익명 함수에서 반환
//return
fun sum(a: Int, b: Int): Int {
println("a: $a, b: $b")
return a + b
}
- break : 루프를 종료 시킴
//break
for(x in 1..10) {
if(x>2) {
break
}
println("x: $x")
}
- continue : 루프의 다음 단계로 진행
//continue
for(x in 1..10) {
if(x<2) {
continue
}
println("x: $x")
}
5. Label로 break와 continue 사용
- Label 표현 : label@, abc@, fooBar@ -> (식별자 + @) 형태로 사용
- Label이란? -> 2중 for문과 같은 반복문에서 반복문 자체를 break 하거나 continue하고 싶을 때 사용!
- ex) break
loop@ for(i in 1..10) {
println("---i: $i ---")
for(j in 1..10) {
println("j: $j")
if(i + j > 12) {
break@loop //여기서 break 될 경우 위에 있는 for문도 함께 break된다!
}
}
}
- ex) continue
loop@ for(i in 1..10) {
println("---i: $i ---")
for(j in 1..10) {
if(j < 2) {
continue@loop
}
println("j: $j")
}
}
6. Label로 Return
- 이 경우는 코드를 바탕으로 이해하도록 하겠습니다.
- list에 담긴 0,1,2,3중 0,2,3만 출력하는 함수를 작성하겠습니다.
//함수를 중첩했을 경우
fun foo() {
var ints = listOf(0,1,2,3)
//forEach는 객체를 순환하는 함수
ints.forEach(fun(value:Int) {
if(value == 1) return //이 경우, value가 1일때 forEach의 인자로 들어온 함수가 종료
print(value)
})
print("End")
}
- 위의 코드로 작성했을 경우 출력되는 값은 023End 입니다. -> 문제에서 요구한 값을 출력할 수 있습니다.
- 하지만, forEach에 람다식이 들어왔을 경우 다른 값이 출력됩니다.
//람다식이 들어왔을 경우
fun foo() {
var ints = listOf(0,1,2,3)
ints.forEach {
if(it == 1) return
print(it)
}
print("End")
}
- 이렇게 람다식이 들어왔을 경우 forEach가 순환하는 값이 1일 경우 함수 자체가 종료됩니다.
- 이 문제를 해결하려면 Label로 return해주시면 됩니다.
fun foo() {
var ints = listOf(0,1,2,3)
ints.forEach label@ {
if(it == 1) return@label
print(it)
}
print("End")
}
- 이렇게 label을 사용해주면 람다식에 대해서만 return 해줍니다.
7. 암시적 Label
- 람다식에서만 return하는 경우 label을 이용해서 return 해야함
- 직접 label을 사용하는것 보다 암시적 label이 편리함
- 암시적 label은 람다가 사용된 함수의 이름과 동일함
fun foo() {
var ints = listOf(0,1,2,3)
ints.forEach {
if(it == 1) return@forEach
print(it)
}
print("End")
}
8. Label return시 값을 반환할 경우
- return + @label + 값 형태로 사용
//0인 경우 zero, 나머지 숫자일 경우 number 숫자
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
}
'언어 > Kotlin' 카테고리의 다른 글
[Kotlin] Inheritance (0) | 2019.04.24 |
---|---|
[Kotlin] Class (0) | 2019.04.24 |
[Kotlin] Control Flow (0) | 2019.04.24 |
[Kotlin] Basic Types (0) | 2019.04.23 |
[Kotlin] Basic Syntax (0) | 2019.04.23 |
Comments