F.R.I.D.A.Y.

Kotlin: 08 분기 제어-if 본문

DEV/Kotlin

Kotlin: 08 분기 제어-if

F.R.I.D.A.Y. 2020. 4. 1. 23:01
반응형

 이번 시간에는 입력에 따라 프로그램이 하는 작업을 선택(분기)할 수 있는 if문 대해 알아봅니다. 이 조건문을 배움으로써 이젠 조금 더 나은, 간단한 게임[# 이라 말하고 싶지만, 결국엔 퀴즈 정도에 가깝겠네요.]도 만들 수 있습니다.


if문

 프로그래밍을 배운 사람들에게, 가장 먼저 배운 분기문(조건문, 분기 제어문)을 물어보면 열에 아홉은 if문을 꼽을 겁니다. 기초가 되면서도 필수적인 문법입니다. 꼭 알고 넘어가세요.

선언

 영단어 if를 번역하면 "만약"이 되겠죠. 프로그래밍에서도 똑같이 사용됩니다.

if(조건){
    // 수행 명령
}else if(조건){
    // 수행 명령
}else{
    // 수행 명령
}

 if문은 if-else, else if 구문이 함께 사용됩니다. 중요한 것은 앞선 조건식을 평가했을 때, 참이 나온다면 이후의 조건은 판단하지 않습니다.[# 그에 따라 해당 조건이 참이 되었을 때 수행될 코드 또한 실행되지 않습니다.]

if(조건)

 if문의 시작을 알리는 키워드입니다. 괄호 안에 조건식을 써넣어서 해당 조건식을 평가했을 때 참이 되면 가장 가까이 오는 단일 서술문[# 코드 한 줄], 혹은 중괄호로 감싸진 복합 서술문으로 분기합니다.

else if(조건)

 if 키워드를 작성한 뒤에 추가로 조건을 넣고 싶을 때 사용할 수 있는 키워드입니다. else if 구문은 단일로 사용할 수 없습니다. 이점 유의하세요. if 키워드와 다른 점이라 하면, if-else문에서 if 키워드는 하나만 작성할 수 있지만, else if는 0개 이상 사용할 수 있습니다.[# 즉, 사용하지 않아도 됩니다.]

더보기

# Kotlin에서 else if는 키워드가 아닙니다.

 프로그래밍 언어에서 언어 자체를 구성하며, 각각이 명령어에 대응하거나 명령어를 구성하는 등 언어 내부에서 의미 있게 사용되는 단어들을 말합니다.

 일부 프로그래밍 언어에서는 else if 또한 키워드로서 관리합니다. 그러나 코틀린의 경우에는 else와 if 키워드가 함께 사용되어 else if 구문이 완성됩니다. 일반적으로 if 구문을 생성할 때는 아래처럼 작성할 것입니다.

if(조건1){

}else if(조건2){

}else if(조건3){

}else{

}

 그러나 컴파일러는 이를 해석할 때 아래처럼 해석한다고 보면 됩니다.

if(조건1){

}else{
    if(조건2){
    
    }else{
        if(조건3){
        
        }else{
        
        }
    }
}

 포스트를 읽다 보면 코드를 else if처럼 작성할 수 있는 이유를 알 수 있습니다.

else

 앞선 조건식의 평가 값이 모두 거짓(false) 일 때, else로 넘어가게 됩니다.

사용

if(bar == 5){
    println("변수 bar는 5를 저장중입니다.")
}else{
    println("변수 bar는 5를 저장하고 있지 않습니다.")
}

 bar라는 변수가 있다고 할 때, bar의 값이 5인지 확인하여 출력하는 문자열을 달리합니다.

명령어가 하나인 경우

 사용의 예시로 보여준 코드는 조건이 참일 때 수행할 코드가 하나입니다. 이 경우 중괄호를 제거할 수 있습니다.

if(bar == 5) println("변수 bar는 5를 저장중입니다.")
else println("변수 bar는 5를 저장하고 있지 않습니다.")

 중괄호를 사용하지 않았을 때보다 훨씬 보기 편하지 않나요? 이렇게 수행할 명령어가 하나[# 이를 단일 서술문이라고 합니다.]인 경우에는 중괄호를 사용하지 않아도 됩니다. 역으로 생각하면 조건을 만족할 때 수행할 명령이 여러 개라면 꼭 중괄호를 사용해야 한다[# 이렇게 중괄호로 묶인 여러 명령어를 하나의 단어로 복합 서술문으로 부릅니다.]는 뜻입니다.


조건식

 분기 제어를 위해 if문 같은 구문이 필요한 만큼, 어떤 경우에 어디로 분기를 제어할 것인지 결정 내릴 수 있는 조건식도 필요합니다.

논리 연산자

 일전 연산자 파트에서 논리합, 논리곱 등의 연산자를 배운 적이 있습니다. 여태 왜 필요한가에 대한 의문이 들었을 수 있지만, 분기 구문을 배움으로써 그 의문을 해결할 것입니다.

 입력으로 들어오는 사람이 이미 알려진 정보인지 판단하는 프로그램을 만든다고 가정합니다.

fun main(args:Array<String>){
    val name:String ="홍길동"
    val age:Int = 23
    
    print("이름 입력:")
    var inputName:String = readLine()!!
    print("나이 입력:")
    var inputAge:Int = readLine()!!.toInt()
    
    if(name == inputName){
        if(age == inputAge){
            println("등록된 정보입니다.")
        }else{
            println("등록되지 않았습니다.")
        }
    }else{
        println("등록되지 않았습니다.")
    }
}

 논리 연산자가 없었다면 위 코드처럼 이름이 같을 때 나이를 판별[# 혹은 그 반대]한 뒤 그 결과를 바탕으로 후속 처리를 해야 합니다. 그러나 논리 연산자의 존재로 이처럼 작성할 필요가 없습니다.

fun main(args:Array<String>){
    val name:String ="홍길동"
    val age:Int = 23
    
    print("이름 입력:")
    var inputName:String = readLine()!!
    print("나이 입력:")
    var inputAge:Int = readLine()!!.toInt()
    
    if(name == inputName && age == inputAge) println("등록된 정보입니다.")
    else println("등록되지 않았습니다.")

}

 논리 연산자 &&[# 논리곱 연산자]를 활용해 훨씬 보기 좋아졌습니다.

범위 연산

 다음으로는 범위를 구성할 수 있습니다. 위에서 설명한 논리 연산자 또한 충분히 범위를 지정해 참을 구성할 수 있습니다. 두 조건을 만족시키도록 해야 합니다.

 점수를 입력하면 성적을 출력하는 프로그램을 구성해봅니다.

fun main(args:Array<String>){
    print("점수 입력: ")
    var score:Int = readLine()!!.toInt()
	
    print("${score}점은 ")
	
    if(score >= 90) print("A")
    else if(score < 90 && score >= 80) print("B")
    else if(score < 80 && score >= 70) print("C")
    else if(score < 70 && score >= 60) print("D")
    else print("F")
	
    println("학점 입니다.")
}

 범위 지정은 할 수 있지만 직관적이지 않습니다. 코틀린인 그래서 비교하는 값이 범위 내에 있을 때 참을 반환할 수 있도록 범위 연산자를 제공합니다.

범위 연산자

 모양은 아래와 같습니다.

if(bar in (작은 값)..(큰 값)){
    // 명령문
}

 이제 범위 연산자를 이용해 코드를 재구성해보겠습니다.

fun main(args:Array<String>){
    print("점수 입력: ")
    var score:Int = readLine()!!.toInt()
	
    print("${score}점은 ")
	
    if(score >= 90) print("A")
    else if(score in 80..89) print("B")
    else if(score in 70..79) print("C")
    else if(score in 60..69) print("D")
    else print("F")
	
    println("학점 입니다.")
}

 코드의 길이도 짧아졌을 뿐만 아니라 보기 더욱 직관적으로 변했습니다.

더보기

# 알고 가기: 코틀린에 범위 연산자란 단어는 없습니다.

 

 

Ranges and Progressions - Kotlin Programming Language

 

kotlinlang.org

 코틀린 공식 페이지를 보면 알 수 있겠지만, 코틀린에서는 범위 연산자(range operator)라는 말이 없습니다. 다만 사용하는 형태가 연산자와 비슷하고, 이해하기 더 쉽다고 판단하여 본 코틀린 프로젝트에서 임의로 사용하고 있습니다. 앞으로 범위 연산자라는 말이 나오면 in 키워드와 ".."을 합친 것을 의미합니다.


 원래 분기 구문을 모두 이 포스트에서 다루려 했지만 집중력 분산이 이루어질 듯하여 분기 제어란 소제목으로 여러 포스트에 담도록 합니다.

Next.

 

Kotlin: 09 분기 제어-when

분기 제어를 배우는 두 번째 시간입니다. C/C++ 언어[# 이하 C 계열] 등지에서는 switch-case 구문을 이용합니다. 이번 시간에 배울 when 구문은 switch-case 구문에 대응되는 코틀린의 문법이라고 볼 수 있습니..

pang2h.tistory.com

# index

728x90
반응형

'DEV > Kotlin' 카테고리의 다른 글

Kotlin: 10 반복문-for  (0) 2020.04.03
Kotlin: 09 분기 제어-when  (0) 2020.04.02
Kotlin: 07 함수  (0) 2020.03.31
Kotlin: 06 세이프콜과 non-null 단정  (0) 2020.03.29
Kotlin: 05 연산자  (0) 2020.03.28
Comments