상세 컨텐츠

본문 제목

[Kotlin] 제어문 - 조건문

Mobile/Kotlin

by 클리엘 클리엘 2020. 10. 1. 03:05

본문

1. if

 

특정 조건이 참인지 거짓인지를 판단하고 해당 조건에 따른 구문을 실행합니다.

var year = 2020
if (year == 2020) {
    // year의 값이 2020인 경우 실행
}
else {
    // year의 값이 2020이 아닌 경우의 실행
}

만약 조건이 참(true)이면 바로 아래 {} 내부의 구문을, 거짓(false)이면 else이후 {} 안의 구문을 실행합니다.

 

이때 사용된 == 기호는 비교 연산자이며 비교대상이 같으면 true, 같지 않으면 false를 반환합니다. 또한 비교대상은 왼쪽 값에 대한 오른쪽 비교입니다.

 

사용가능한 연산자로는 ==외 다음과 같은 것들이 있습니다.

 

> 크다
< 작다
>= 크거나 같다.
<= 작거나 같다.
== 같다.
!= 같지않다.

 

비교 연산자는 말 그대로 '비교연산'을 수행합니다. if문은 괄호 안의 조건이 true인지 false인지만 판단하므로 true인지, false인지에 대한 결과만 넘겨주면 되는 것입니다.

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        var year = 2020
        var rtn = year == 2020
        if (rtn) {
            // year의 값이 2020인 경우 실행
        }
        else {
            // year의 값이 2020이 아닌 경우의 실행
        }
    }
}

만약 비교조건이 2개 이상인 경우에는 다음과 같이 할 수 있습니다.

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        var year = 2020
        var month = 5
        
        var rtn = year == 2020
        if (rtn && month == 5) {
            // year의 값이 2020이며 month의 값이 5인 경우 실행
        }
        else {
            // year의 값이 2020이 아니거나 month의 값이 5가 아닌 경우의 실행
        }
    }
}

rtn과 month == 5 사이에 있는 && 기호를 '논리연산자'라고 하며 사용가능한 기호와 의미는 다음과 같습니다.

 

&& 그리고
|| 또는
! 부정

 

따라서 만약 rtn && month == 5 라고 한다면 'rtn이 true이고 month의 값이 5인 경우'라고 해석될 수 있습니다. 따라서 if는 rtn이 true값을 가지면서 동시에 month의 값이 5라면 바로 아래 구문을 실행하며 rtn이 true가 아니거나 month가 5가 아니라면 else이후의 구문을 실행하게 됩니다.

 

상기 비교 연산자와 논리 연산자는 if뿐 아니라 다른 조건문이나 반복문 등에서도 동일하게 사용될 수 있습니다.

 

if문에서 거짓인 경우에 대한 처리가 필요하지 않으면 else는 생략할 수 있습니다. 또한 if문이나 기타 다른 제어문의 경우 실행해야 할 구문이 단 한 줄이라면 중괄호({})또한 생략이 가능합니다.

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        var year = 2020
        var rtn = year == 2020
        
        if (rtn)
            Log.d("실행", "$rtn")
    }
}

만약 판단해야 할 조건이 2개 이상이라면 해당 조건만큼 else if로 조건을 추가할 수 있습니다.

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        var year = 2020

        if (year == 2020)
            Log.d("_if", "올해")
        else if (year == 2019)
            Log.d("_if", "작년")
        else if (year == 2018)
            Log.d("_if", "재작년")
        else
            Log.d("_if", "기타")
    }
}

경우에 따라 if구문 실행결과를 다른 변수에 직접 대입할 수도 있습니다.

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        var year = 2020
        var yearDescription : String

        yearDescription =
        if (year == 2020)
            "올해"
        else if (year == 2019)
            "작년"
        else if (year == 2018)
            "재작년"
        else
            "기타"

        Log.d("rtn", "$yearDescription")
    }
}

이때 코드상으로 변수의 대입 범위를 분명하게 나타내고자 하는 목적으로 괄호를 붙여주는 경우도 있습니다.

var year = 2020
var yearDescription : String

yearDescription = (
    if (year == 2020)
        "올해"
    else if (year == 2019)
        "작년"
    else if (year == 2018)
        "재작년"
    else
        "기타"
)

Log.d("rtn", "$yearDescription")

2. when

 

C 계열의 다른 언어를 사용해본 적이 있으시다면 switch문을 떠올리시면 됩니다. 개념도 비슷하고 사용방법도 유사하지만 case에 해당하는 부분에서 값의 범위를 지정할 수 있는 등, 활용성이 코틀린에서 약간 더 유연성을 제공합니다.

when (변수) {
	값 -> {
    	//실행구문
    }
}

변수의 값에 따라 실행 영역을 분리합니다. 만약 값이 여러 개라면 그만큼 실행 영역을 만들면 되고, 어떠한 값에도 일치하지 않는 경우가 있다면 else로 분리하면 됩니다.

var year = 2020
when (year) {
    2019 -> {
        Log.d("test", "과거")
    }
    2020 -> {
        Log.d("test", "현재")
    }
    2021 -> {
        Log.d("test", "미래")
    }
    else -> {
        Log.d("test", "$year")
    }
}

값은 다르지만 처리할 구문이 동일하다면 , (콤마)로 값을 구분하여 지정할 수 있으며

var year = 2020
when (year) {
    2019, 2020 -> {
        Log.d("test", "과거와 현재")
    }
    2020 -> {
        Log.d("test", "현재")
    }
    else -> {
        Log.d("test", "$year")
    }
}

비교할 값의 범위가 , 로 일일이 열거하기 어려울 정도의 넓은 범위라면 in을 사용해 범위를 한정할 수 있습니다.

var year = 2020
when (year) {
    in 2001..2100 -> {
        Log.d("test", "21세기")
    }
    else -> {
        Log.d("test", "$year")
    }
}

when다음에 오는 변수명은 생략할 수도 있는데 이때는 직접 분기 영역에 비교할 변수와 값을 모두 사용해 분기영역을 만들어야 합니다.

var year = 1900
when {
    year in 2001..2100 -> {
        Log.d("test", "21세기")
    }
    year == 2200 -> {
        Log.d("test", "22세기 말")
    }
    year <= 2000 -> {
        Log.d("test", "과거")
    }
    else -> {
        Log.d("test", "$year")
    }
}

태그

관련글 더보기

댓글 영역