본문 바로가기

# 02/코틀린

[Kotlin] return and jumps and This-expressions

반응형

Jump Expression


- return                          // 값을 반환

- break                           // 루틴을 빠져나갈 때

- continue                       // 특정 조건에서만 처리하지 않을 때



Labels 정의


loop@ for (i in 1..100) {

// ...

}


-> label을 정의할 때는 name@

-> label을 사용할 때는 @name



Break and Continue Labels


for (i in 1.. 100) {

for (j in 1.. 100) {

if (j > 10) break

print( j )

}

println()

}

println("end")



-> label 추가

for (i in 1..100) {

loop@ for (j in 1..100) {

if (j > 10) break@loop

print(j)

}

println()

}

println("end")

// 12345678910 - 100번 찍히고 end



loop@ for (i in 1..100) {

for (j in 1..100) {

if (j>10) break@loop

print(j)

}

println()

}

println("end")

// 12345678910end




Return at Labels


fun foo() {

val ints = mutableListOf (1, 2, 0, 4. 5)

ints.forEach {

if (it ==0) return                                                       // nonlocal return from inside lambda directly to the caller of foo()

print(it)

}

}

// 1, 2 출력



val ints = mutableListOf (1, 2, 0, 4. 5)

fun foo() {

ints.forEach lit@ {

if (it == 0) return@lit                                                   

print(it)

}

}

// 1, 2, 4, 5 출력



fun foo() {

val ints = mutableListOf (1, 2, 0, 4. 5)

ints.forEach {

if (it == 0) return@forEach                                                   

print(it)

}

}

// 1, 2, 4, 5 출력




Return


private val mOnNavigationItemSelectedListener = BottomNavigationView.OnNavigationItemSelectedListener { item ->

when (item.itemId) {

R.id.navigation_home -> {

message.setText(R.string.title_home)

return@OnNavigationItemSelectedListener true

}

R.id.navigation_dashboard -> {

message.setText(R.string.title_dashboard)

return@OnNavigationItemSelectedListener true

}

R.id.navigation_notifications -> {

message.setText(R.string.title_notifications)

return@OnNavigationItemSelectedListener true

}

}

false

}


// 람다식은 맨마지막 줄이 리턴 되기 때문에 중간에 리턴값을 나타내고 싶으면 return + @{람다식 리스너 이름} 꼭 표시해줘야됨!!




This expression 


class Sample {

val temp = this@Sample                  // class 자체를 가지게 됨

val temp1 = this

}

// temp, temp1 동일한 결과 가지게 됨!!



class Sample {

fun Int.foo() {

val a = this@Sample                            // Sample class 자체를 가리킴

val b = this                                        // foo 내부의 Int 를 가리킴

val c = this@foo


println("b === c ${b === c}")

}


fun test (a : Int ){

a.foo()

}

}




class Sample {

inner class SampleB {

fun Int.foo() {

val a = this@Sample

val a1 = this@SampleB


test()                                      // inner 클래스 안에 있는 test() 호출

this@Sample.test()                    // inner 클래스 안에서 밖에 있는 test() 호출


val b = this

val b1 = this@foo


println("b === b1 ${b === b1}")

}

fun test(a : Int) {

a.foo()

}

fun test() {

println("test - inner class SampleB")

}

}


fun test() {

println("test - class Sample")

}

}

반응형

'# 02 > 코틀린' 카테고리의 다른 글

[Kotlin] Null 예외처리  (0) 2019.07.11
[Kotlin] Null 처리 방법  (0) 2019.07.11
[Kotlin] Lambda  (0) 2019.07.11
[Kotlin] Control Flow - if/when/loops  (0) 2019.07.11
[Kotlin] Function  (0) 2019.07.11