매일 한줄 코딩

#5. 코틀린 패키지, 리턴&점프 (Packages, Return and Jumps) 본문

develop/kotlin

#5. 코틀린 패키지, 리턴&점프 (Packages, Return and Jumps)

ShipJH 2022. 6. 6. 23:22
5. Packages, Return and Jumps

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표현식

  1. return : 함수나 익명 함수에서 반환
    fun sum(a: Int, b: Int): Int {
    	return a + b 
    }

  1. break : 루프를 종료시킴
for (x in 1..10) {
	if (x == 2 ) {
		break
	}
}

  1. 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 처럼 써주면 된다.

'develop > kotlin' 카테고리의 다른 글

#7. 코틀린 상속 - Inheritance  (0) 2022.06.06
#6. 코틀린 클래스 - Class, 생성자  (0) 2022.06.06
#4. 코틀린 흐름 제어 ( if, for .. 등 )  (0) 2022.06.06
#3. 코틀린 기본 타입  (0) 2022.06.06
#2. 코틀린 기본 문법.  (0) 2022.06.06
Comments