코틀린에서 패키지(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 |
댓글