Android 앱/Kotlin Language

kotlin 코틀린 - 반복문

arvigoes 2020. 2. 29. 23:02

증감연산자

증가연산자 ++

변수의 앞이나 뒤에 ++ 을 붙여서 사용하는 연산자입니다.

++ 이 변수 앞에 붙으면 전치 증가연산자, 변수의 뒤에 붙으면 후치 증가연산자 입니다.

정수형 변수의 경우 값을 1 증가시켜주는 역활을 합니다.

var number = 10
++number
number = number + 1
number++

결과적으로 보면 위 3가지는 동일한 결과 입니다.

그러면 왜 전치와 후치 증가 연산자로 구분이 될까요?

그 차이는 아래 코드를 보면서 설명 하도록 하겠습니다.

fun main() {
    var numberPre = 10
    var numberPost = 10

    println(++numberPre)
    println(numberPost++)

    println(numberPre)
    println(numberPost)
}

전치 증가 연산자는 변수의 값을 먼저 증가 시키고 현재 구문 을 수행합니다.

후치 증가 연산자는 현재 줄을 먼저 수행하고 값을 증가 시켜 줍니다.

 

감소연산자 --

증가연산자와 반대로 값을 1 감소 시켜주는 역활을 합니다.

var number = 10
--number
number = number - 1
number--

전치 후치 감소연산자는 증가연산자와 동일한 특성을 가집니다.

 

 

조건형 반복문

반복문에는 조건이 참인 경우에만 반복을 수행하는 조건형 반복문이 있습니다.

조건형 반복문에서는 while 과 do while 만 사용 할 수 있습니다.

 

while( 조건 ) {

     수행내용

}

 

while 문 기본형태 입니다. 예제로 확인 하도록 하겠습니다.

fun main() {
    var number = 0
    while(number++ < 5) {
        println(number)
    }
}

number 를 후치 증가 연산자를 사용했으므로 0 ~ 4까지 연산의 비교에 사용되고 값을 1 증가시켜

화면에는 1 ~ 5 로 출력이 됨을 확인 할 수 있습니다.

While 문은 다른 언어에서도 항상 비슷한 형태인데, 가장 실수를 자주 하는 부분이

조건의 기본이 되는 변수의 값을 조정하는 코드가 없어서 while 이 무한르푸로 빠져버리는 어쳐구니 없는

실수가 빈번하게 나옵니다.

본문의 수행해야할 내용에 집중하다 보니 변수 number 의 조건을 변경하여 반복제어를 하지 않아 버린 것이죠

    while(number < 5) {
        println(number)
    }

단순 실수이지만 치명적인 실수가 될 확률이 높으니 항상 주의 하시길..

 

do while 문도 조건을 체크하여 반복 수행한다는 내용은 같지만 최초 한번은 조건에 상관 없이 무조건 수행이 됩니다.

 

do {

     수행내용(본문)

} while( 조건)

 

do while 문의 기본 형태 입니다. 예제로 보도록 하겠습니다.

fun main() {
    var number = 10
    do{
        println(number)
    }while(number++ < 5)
}

조건으로만 보면 number 는 10 이므로 5보다 큽니다. 그러므로 false 이고 반복문 수행이 될 수 없습니다.

그러나 do while 구문이므로 최초 한번은 수행이 되어 수행결과에는 10이 출력 됩니다.

 

두 반복문중에 상황에 따라 적절히 선택하여 사용하시면 될 듯합니다.

 

 

범위형 반복문

범위형 반복문은 반복 범위를 정해서 반복을 수행하도록 합니다.

범위형 반복문에는 for 문이 있습니다.

 

for( 변수 in 범위) {

      수행내용(본문)

}

 

for 구문의 변수 는 따로 변수를 선언하는 var 등은 적어줄 필요는 없습니다.

for문의 기본 형태 입니다.

fun main() {
    for( index in 0..9) {
        println(index)
    }
}

수행결과를 확인 하도록 하겠습니다.

예상대로  범위 0 부터 9까지 화면에 출력이 됩니다.

for문에는 while 문 처럼 흐름제어를 위해 변수값을 변경 해 줄 필요가 없습니다.

구문이 수행되면 변수값이 항상 1증가 하도록 정의 되어 있습니다.

1증가라함은 숫자 1 보다는 다음값 이라고 생각하시는게 좀 더 바르게 표현되는것 같네요

 

이 증가 값을 변경시키고 싶다면 step 키워드를 사용하시면 됩니다.

fun main() {
    for( index in 0..9 step 2) {
        println(index)
    }
}

두단계 다음값을 가져오는 결과를 확인 할 수 있습니다.

 

이번에는 역순으로 가는 방법을 확인해 보도록하겠습니다.

downTo 키워드를 활용해서 9 - 0 까지 역순으로 수행 합니다.

fun main() {
    for( index in 9 downTo 0) {
        println(index)
    }
}

마찬가지로 step 으로 단계를 조정할 수 있습니다.

 

범위는 시작..종료 이렇게 지정이되고 문자에도 적용이 가능합니다.

fun main() {
    for( index in 'a'..'d') {
        println(index)
    }
}

그리고 나중에 확인 하게 되겠지만 array list 등의 컨테이너 객체를 순회 할때도 자주 사용하게 됩니다.

 

 

흐름제어

return

함수나 프로그램에서 현재의 영역을 중단하고 상위로 이동하는 키워드입니다.

예를 통해서 보면 mul 함수에서 return 구문을 만나면 mul 함수를 종료 하고 호출한 상위 함수 main 함수로 이동합니다.

main 함수에서도 return 키워드를 만나면 프로그램을 종료하게 됩니다.

mul 함수에서는 함수의 종료시에 반환값이 Int 형태로 설정이되어 있으므로 반환시 Int 값 (곱셈의 결과) 를 같이 가지고 main 함수로 돌아가게 됩니다.

 

break

반복문이 실행되는중간에 이 키워드를 만나면 즉시 반복구문을 종료하고 다음 구문으로 역활을 합니다.

 

continue

반복문이 실행되는중간에 이 키워드를 만나면 즉시 현재의 반복구문을 종료하고 다음 반복구문을 수행합니다.

 

흐름제어를 코드로 확인해 보도록 하겠습니다.

fun testReturn() {
    println("")
    println("test Return begin")
    for( index in 0..9 ) {
        if(index == 5)
            return
        print(index)
    }
    println("")
    println("test Return end")
}

fun testBreak() {
    println("")
    println("test break begin")
    for( index in 0..9 ) {
        if(index == 5)
            break
        print(index)
    }
    println("")
    println("test break end")
}

fun testContinue() {
    println("")
    println("test Continue begin")
    for( index in 0..9 ) {
        if(index == 5)
            continue
        print(index)
    }
    println("")
    println("test Continue end")
}

fun main() {
    testReturn()
    testBreak()
    testContinue()
}

결과

차이점을 이해 하셨나요?

testReturn 의 경우 반복중에 return 을만나서 바로 함수를 종료하고 호출한 함수 main함수로 넘어가서 test Resturn end 를 출력하지 못하고 종료 되었습니다.

 

testBreak 의 경우 반복중에 break 를 만나서 현재 반복구문을 즉시 중단하고 반복문 밖의 구문 개행용 println 과 test Break End 를 출력 하였습니다.

 

testContine 의 경우 반복중에 continue 를 만나서 현재 반복구문을 즉시 중단하고 다음 반복문을 수행 하여 반복문이 종료 될 때까지 수행을 하였습니다. 그리고 밖의 구문 개행용 println 과 test continue End 를 출력 하였습니다.

 

기본적인 흐름제어 이외에도 코틀린에선 다중 반복문 제어용 label 이 새로 추가 되었습니다.

다중반복문의 흐름제어는 괭장히 귀찮은 코딩을 한번에 해결해줄 수 있는 기능인데요

예제를 통해 바로 보도록 하겠습니다.

fun main()
{
    mainloof@ for(idx in 1..9) {
        for(idxMul in 1..9){
            if(idx == 5 && idxMul == 5)
                break@mainloof
            println(idx*idxMul)
        }
    }
}

사용법은 원하는 반복문앞에 lable이름과 @ 를 붙여서 반복문에 label 을 붙여줍니다.

그리고 흐름제어를 하고싶을때 return, break,cotinue 뒤에 @ 와 label 이름을 써 주시면 됩니다.

 

이 label 흐름제어는 예시같은 반복문 보다는 추후에 배우게 될 foreach 같은 lambda 표현식에서 

많이 사용하며 이렇게 사용 될 경우 아주 괜찮은 모습을 볼 수있습니다.

 

 

논리연산자

연산자 설명 사용 예시
&& (and) 두 입력값 A, B 가 모두 true일 경우에 true  A && B
|| (or) 두 입력값 A, B 중 한개라도 true일 경우에 true A || B
! (not) 입력값 A 에 대해 반대값 (true 일 경우 false , false 일 경우 true) !A

label 설명에서 논리연산자 and 연산자가 사용되어 논리 연산자 에 대한 설명 잠깐 하도록 하겠습니다.

논리 게이트와 동일한 논리연산자 입니다.

진리표

입력값 X , Y 에 대한 결과 F 입니다.

if( idx == 5 && idxMul ==5 ) 에서 idx == 5 의 결과가 X 가 되고, idxMul == 5 는 Y에 대응 되어 결과 F 가 추론 됩니다.

많이 써보시면서 익혀두시길 바랍니다.

설명은 길지 않지만 많이쓰이는 내용입니다.