본문 바로가기
Kotlin

[Kotlin] Package , Return and Jumps

by 신입같은 3년차 2019. 6. 19.

코틀린에서 패키지(Package)

소스파일은 패키지 선언으로 시작된다 . 

모든 콘텐츠는 패키지에 포함

패키지를 명세하지 않으면 이름이 없는 기본 패키지에 포함된다 . 

 

 

코틀린의 기본 패키지 


Kotlin.*

Kotlin.annotation.*

Kotlin.collections.*

Kotlin.comparisons.* - version 1.1

Kotlin.io.*

Kotlin.ranges.*

Kotlin.sequences.*

Kotlin.text.*

JVM : 

    java.lang.*

    kotlin.jvm.*

 

JS : 

    kotlin.js.*

 

직접 생성하여 테스트해보도록 하겠습니다 . 

// Test.kt
fun main(args: Array<String>) {
    printCustom()
}

 

//Other.kt
fun printCustom(){
    println("Hello Custom Other File")
}

Other.kt에서 만든 printCustom()을 Test.kt에서 import 하지 않아도 사용할 수 있다 . 

 

그렇다면 package를 맘대로 선언하고 한다면 어떻게 될까요 

 

// Test.kt
import yunjin.choi.printCustom
fun main(args: Array<String>) {

    printCustom()
}
//Other.kt
package yunjin.choi

fun printCustom(){
    println("Hello Custom Other File")
}

위와 같은 방식으로 호출하여 사용할 수 있습니다 . 

 

imports


import 하는 방식에도 변화가 생겼습니다 . 

// A라는 kt파일에서 custom이라는 함수를 사용하겠다 .

import A.custom 

 

// A라는 kt파일안에있는 모든것을 사용하겠다 .

import A.*

 

// A라는  kt 파일에서 custom이라는 함수를 사용할텐데 별칭으로 ct라고 하겠다.

import A.custom as ct

 

Return and Jumps


코틀린에는 자바와 다르게 Lable 로 Break와 Continue가 사용 가능하다 . 

 

사용법은 간단합니다.

 Lable은 label@ 로 사용하며 식별자+@형태로 사용합니다 이말이 무슨말인지 코드로 확인해보겠습니다 . 

fun main(args: Array<String>) {
    first@ for ( i in 1 .. 10 ){
        for (j in 1 .. 10) {
            println("${i} : ${j}");
            if (j == 5) {
                break@first
            }
        }
    }
}

2중 for문을 돌면서 j 가 5일때 break를 하는 반복문입니다 원래대로 lable 이 없다면 j가 5일때만 가장 안에있는 2중포문중 2번째 포문을 break하고 다시 첫번째 포문을 돌아야하지만 first라는 이름으로 label을 만들어주고 break@first로 걸어주었기때문에 j가 5라면 제일 밖에있는 for문을 멈추게하는 코드입니다 . 

 

그렇다면 어떻때 label과 return 을 활용해야할까요 

코틀린에 중첩 될 수 있는 요소들에는 함수리터럴 , 지역함수 , 객체표현식 , 함수들이 있습니다 . 

fun main(args: Array<String>) {
    val fruits : Array<String> = arrayOf("바나나" , "사과" , "포도", "망고" , "수박")
    fruits.forEach (fun (value : String){
        if ("사과".equals(value)) return
        println(value)
    })
}

 위의 코드는 forEach안에 선언되어있는 fun 익명함수에서 return 하기때문에 사과일때만 reutrn 을 하고 사과를 제외한 나머지 요소들을 출력해준다 . 

 

fruits.forEach ({
    if (it.equals("사과")) return
    print(it)
})

위의 코드는 첫번째 코드와 동일한 결과를 나타낼까요?? 정답은 아닙니다 .이유는 위의 코드는 함수가 아닌 람다로 작성되어 forEach전체를 return 해버리기떄문에 사과를 만났을때 return 시켜버려서 바나나만 출력되고 나머지 로직은 수행되지 않습니다 . 

 

이럴때 Label을 써서 해결하면 좋을것같습니다 . 밑의 코드와 같이 forEach의 뒤에 Label을 사용하고 람다의 안에서 label을 return 해줄수 있으니 참고해서 사용하면 좋을것 같습니다 . 

fruits.forEach fruits@{
	if (it.equals("사과")) return@fruits
	print(it)
}

 

만약 나는 Label도 달기 싫다라는분들을 위해 암시적 label도 있습니다 .

바로 foeEach자체를 label로 사용하는 방식입니다 사용방법은 간단합니다 . 

fruits.forEach ({
	if (it.equals("사과")) return@forEach
	print(it)
})
    

 

반응형

'Kotlin' 카테고리의 다른 글

[Kotlin] Data Classes  (0) 2019.06.19
[Kotlin] 상속  (0) 2019.06.19
[Kotlin] class 의 활용 및 개념  (0) 2019.06.19
[Kotlin] 코틀린 Control Flow  (0) 2019.06.19
[Kotlin] 코틀린의 기본 타입 ( Java와의 비교 )  (0) 2019.06.19

댓글