5. Packages, Return and Jumps
목차
1. 패키지 Package
1-1. 패키지 특징
- 소스 파일은 패키지 선언으로 시작
- 모든 콘텐츠(클래스, 함수, ....) 등은 패키지에 포함된다.
- 패키지를 명세하지 않아도 되며, 명세하지 않으면 이름 없는 기본 패키지에 포함됨.
package com.kotlin
fun aaa() {}
class Abc {}
fun main(args: Array<String>) {
com.kotlin.aaa()
com.kotlin.Abc()
}
1-2. 기본패키지
기본패키지는 import 해주지 않아도 된다.
예) kotlin.io, kotlin.collection .. 등
1-3. Import 특징
- 동일한 명칭의 패키지의 명칭일때 as를 줄 수 있다.
import apache.StringUtil
import com.kotlin.StringUtil as MyStringUtil
2. Return and Jumps
2-1. 3가지 Jump표현식
- return : 함수나 익명 함수에서 반환
fun sum(a: Int, b: Int): Int { return a + b }
- break : 루프를 종료시킴
for (x in 1..10) {
if (x == 2 ) {
break
}
}
- continue : 루프의 다음 단계로 진행
for (x in 1..10) {
if (x == 2) {
continue
}
}
2-2. Label로 Break and Continue
- 레이블 표현 → 식별자 + @ 형태로 사용된다. ex) label@, abc@ 마음대로 명칭 + @ 의 형태
loop@ for ( i in 1..10 ) {
println(" 첫번째 루프 ")
for ( j in 1..10 ) {
println(" 두번째 루프 ")
if (i + j > 15 ) {
break@loop
}
}
}
위와같이 작성시,
두번째 루프에서 break하게되면 1번째루프도 함께 다같이 멈춘다.
자바라면, 두번째 루프만 브레이크되고, 첫번째는 또 돌게되지만, 레이블을 사용하면, 2중 반복문일경우 바로 한번에 빠져 나갈 수 있다.
마찬가지로, continue도 레이블로 표현이 가능하다
loop@ for ( i in 1..10 ) {
println("첫번째 루프")
for ( j in 1..10 ) {
if ( j > 2 ) {
continue@loop
}
println("gogo~")
}
}
2-3. Label로 Return
- 코틀린에서 중첩 될 수 있는 요소들
함수 리터럴, 지역함수, 객체 표현식, 함수
fun foo() {
var ints = listOf(0,1,2,3)
ints.forEach(fun(value: Int) {
if (value == 1 ) return
print(value)
})
print("END")
}
//결과 : 023END
fun안에 fun이 충첩되어있을때 return은 forEach에서 리턴된다. foo()메서드 전체가 중단되지 않는다.
람다식을 사용한다면 foo()메서드 전체가 리턴된다.
fun foo() {
var ints = listOf(0,1,2,3)
ints.forEach {
if (it == 1 ) return
print(it)
}
print("END")
}
//결과 : 0
‼️ 즉, 가장가까운 fun 메서드가 리턴된다.
‼️ 그렇다면 람다식 안에서 foo()가 종료되지 않도록 하게 하려면 어떻게 해야할까?
fun foo() {
var ints = listOf(0,1,2,3)
ints.forEach label@{
if (it == 1 ) return@label
print(it)
}
print("END")
}
//결과 : 023END
💡람다를 사용할때에는 레이블을 사용하는것을 해야한다.
- 더 간략하게도 가능하다. 즉 람다를 실행하는 함수의 이름을 바로 사용가능하다.
fun foo() {
var ints = listOf(0,1,2,3)
ints.forEach {
if (it == 1 ) return@forEach
print(it)
}
print("END")
}
//결과 : 023END
// 람다식쓸때 함수중 forEach를 사용했으므로 레이블을 그 함수명으로 정해주면 foo()를 벗어나지 않는다.
- 레이블 return시 값까지 같이 반환해야 한다면?
fun foo(): List<String> {
var ints = listOf(0,1,2,3)
val result = ints.map {
if (it == 1 ) {
return@map "one"
}
"number $it"
}
return result;
}
//결과값 : [number 0, one, number 2, number 3]
위와같이 return@label value 처럼 써주면 된다.