ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [스칼라 문법편] CH03 조건문과 반복문
    레거시/레거시-누구나 쉽게 스칼라+플레이 2019. 1. 29. 22:05
    반응형

    * 이 포스팅은 책 "누구나 쉽게 스칼라 + 플레이 - 고락윤 한빛미디어" 를 읽고 정리한 것입니다.

    CH03 조건문과 반복문

    01. 조건식 if/else


    스칼라의 조건문은 기존 프로그래밍 언어와 동일하게 3단 구조, if ~ else if ~ else 구조입니다. 기본적인 형태는 다음과 같습니다.

    val x = 15
    
    if (x > 15){
        println("x is bigger than 15")
    } else if (x < 15){
        println("x is smaller than 15")
    } else {
        println("x is equal 15")
    }


    다만 한 가지 다른점이 있다면, if, else 는 statement가 아닌 value로 평가됩니다. 무슨 말이냐면, 위 코드를 다음과 같이 바꿀 수도 있습니다.

    val x = 15
    val res = if (x > 15)
            "bigger"
        else if
            "smaller"
        else
            "equal"
    
    println(s"x is ${res} compared ${x}")


    res는 15의 조건에 따라 문자열을 나타내는 값이 되없습니다. 이는 스칼라에서는 if/else 등이 평문이 아닌 값으로 평가된다는 것을 의미합니다. 밑에 println에서 문자열 앞에 s를 붙이고 ${변수}를 이용하면 스크립트 언어처럼 템플릿 문자열을 가질 수 있습니다.

    02. 반복문 while, do~while


    이전 절에서 배운 if/else 는 기존 프로그래밍 언어와 비교해서 보면 구조는 같고 평가되는 방식이 달랐습니다. 그러나 while, do~while은 그냥 똑같습니다. 다음은 1부터 10까지 while, do~while로 루프를 돌아 출력시키는 코드입니다.

    var a = 1
    
    while (a <= 10){
        println(a)
        a += 1
    }
    
    a = 1
    
    do {
        println(a)
        a += 1
    } while (a <= 10)


    스칼라에서는 증감 연산자 ++, --가 제공되지 않습니다. 따라서 a = a + 1 등의 표현식은 오로지 복합 대입문으로만 줄일 수 있습니다. while과 do~while의 차이점은 do~while문은 무조건 한 번은 실행된다는 것입니다.

    03. 반복문 for


    다만, 스칼라에서 for문은 Java나 다른 언어에 비해서 조금은 다릅니다. 개인적으로 C, C++, Java보다는 Python에 가깝습니다. 우선 for문을 이용하여 1~10까지 출력시켜보겠습니다.


    for (x <- 1 to 10){
        println(x)
    }


    이 코드를 돌려보면 1~10까지 차례대로 출력된는 것을 확인할 수 있습니다. 이번에는 1, 10은 바꾸지 않고 1~9로 출력시켜보겠습니다.


    for (x <- 1 until 10){
        println(x)
    }


    이렇게 하면 1~9까지 출력됩니다. to는 마지막 구간까지 순회를 until은 마지막 구간 이전까지 순회를 시킨다고 생각하시면 됩니다. 만약 현재 순회하는 index를 알고 싶다면, 다음처럼 쓸 수 있습니다.

    for ( (x, idx) <- (1 to 10).zipWithIndex){
        println(idx, x)
    }


    그럼 현재 순회하는 index와 그 원소 x가 순서대로 출력 될 것입니다. 여기서 1 to 10은 1 ~ 10까지 원소를 가진 리스트 객체라고 생각하시면 편합니다. zipWithIndex가 리스트에서 제공하는 메소드거든요. (개인적으로는 Iterable과 같은 객체일 것 같습니다만) 또한, 스칼라에서 for는 기존 Java에 비해 더 깔끔한 표현을 해줄 수 있습니다. 이번에는 1~10까지 짝수만 출력하도록 하겠습니다.

    for ( x <- (1 to 10) if (x % 2 ==0) ){
        println(x)
    }


    이렇게하면, 1~10 사이의 짝수만 출력되죠. 마치 파이썬의 for 컴프리헨션과 유사하게 표현할 수 있습니다. 심지어 이중 for 문도 비슷하죠. 이번에는 2중 for문을 이용해서, 구구단을 작성해볼까요? 이것은 한 번 해보시고 코드를 보는 것을 추천합니다. 힌트는 ;을 이용하면 if와 같이 한 줄에 이중 for문 선언도 가능합니다. 다음은 코드입니다.

    for ( x <- 1 until 10; y <- 1 until 10 ){
        println(s"${x} * ${y} = ${x * y}")
    }


    다음 코드를 실행하면, 1~9단까지 구구단을 출력시키죠. 물론 단과 단 사이의 줄을 넣고 싶으면, 이중 for 문을 분리하거나 if 식을 넣어주면 가능합니다. 이렇게 해서 스칼라의 if/else 조건 식, while, do~while, for 반복문에 대해 알아보았습니다. ㅎㅎ 어떤신가요? 스칼라에 대해서 더 자세히 공부해보고 싶다면 다음 장 스칼라의 OOP 에서 만나요!

Designed by Tistory.