2016년 4월 23일 토요일

kotlin programming langauage - 반복제어문

while loop
자바와 거의 동일하다
[while문]
    while (x > 0) {
        x--
    }
[do..while 문]
do{
    print(x)
}while(x>0)
}

자바의 iterator를 이용한 for문과 비슷하다.
for (item in collection)
    print(item)
물론 {}를 사용해도 되고 타입을 지정해도 된다.
for (item:String in collection){
    print(item)
}
인덱스 기반으로 사용할 경우 indices함수를 사용한다. 해당 함수는 컬렉션의 int range를 리턴해준다.
for (item in collection.indices)
    print(item)
그리고 이터레이터를 이용한 for문 사용시 문제가 되었던 인덱스 사용도 withIndex()함수를 사용한다면 별도의 구현이 필요 없다.
for((index,value) in x.withIndex()){
    println("index:$index,value:$value")
}
ranges and in

label and return
kotlin에도 반복문을 제어하기위해  label과 continue, break, return이 있다.기본은 자바와 같다. 
 return : 실행중인 함수가 종료된다.
continue :가장 가까운 반복문의 다음 단계로 이동
break:가장 가까운 반복문을 종료 시킨다.

먼저 라벨을 설명하기 위해 자바와 비교하자면
자바의 Label  반복문 앞에 라벨명:<반복문>의 형식으로 사용한다
public static void main (String[] args){
    firstLabel:for(int i=0;i<10;i++){
        for(int j=0;j<10;j++){
            if(j%>0continue ;           
            if(j==4continue firstLabel;          
            System.out.println(i + "-"+j);
        }
    }
}
kotlin에서는 

fun main(args:Array<String>){
    val x =arrayOf("a","b","c")
    firstLabel@ for(i in 1..10) {
        for (j in 1..10) {
            if (j % 0continue
            if (j > 5continue@firstLabel 
           println("$i - $j")
        }
        println("after foreach")
    }
}

람다식 foreach에서의 라벨 사용
fun main(args:Array<String>){
    val x =arrayOf("a","b","c")
    x.forEach {
        if(it == "b"return
        println("$it")
    }
    println("after foreach")
}

if 조건에 맞아 return이 실행되면 함수가 종료되고 결과는 a만 출력된다.
fun main(args:Array<String>){
    val x =arrayOf("a","b","c")
    x.forEach loop@{
        if(it == "b"return@loop
        println("$it")
    } 
   println("after foreach")
}
라벨을 사용하면 함수전체가 종료되는 것이 아니라 해당 조건만 종료되고 계속진행된다.
결과는 a c after foreach가 출력된다.

람다식에서는 함수와 같은 이름의 라벨을 사용 한다면 라벨선언을 생략할 수 있다.
fun main(args:Array<String>){
    val x =arrayOf("a","b","c")
    x.forEach {
         if(it == "b"return@forEach
        print(it)
    }}

햇갈린다면 익명 함수를 람다 표현식 안에 선언하여 사용할 수 있다.
fun main(args:Array<String>){
    val x =arrayOf("a","b","c")
    x.forEach(fun(value:String){
        if(value == "b"return
        print(value)
    })

}


댓글 없음:

댓글 쓰기