굥뷰를 햡시댜

[Kotlin] Packages, Return and Jumps 본문

언어/Kotlin

[Kotlin] Packages, Return and Jumps

GodZ 2019. 4. 24. 03:38

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