본문 바로가기

개발 노트/Kotlin

[kotlin]조건문

# 조건문

- 특정 조건에 따라 결과를 다르게 실행하고자 할때 사용

- 주어진 조건식의 결괏값이 참인지 거짓인지에 따라 코드를 실행할 것인지 or 다른 코드를 실행할것인지 판단하기 위해 사용

- "제어문" 이라고도 함

- 제어문 -> 조건문(if, when) / 반복문(for, while)

 

 

# 조건문 ( if )

var myNumbers = "1, 2, 3, 4, 5, 6"
var thisWeekNumbers = "5, 6, 7, 8, 9, 10"
if (myNumbers == thisWeekNumbers){ 
	// if문 시작(해당 조건을 만족하면 if 블록 내의 코드를 수행)
    Log.d("Lotto", "당첨되었습니다!") 
}

 

-> if를 통해 myNumbers와 thisWeekNumbers가 같은지 비교한 후, 같은 경우에는 "당첨되었습니다" 를 출력

-> 조건이 맞지 않을 경우, 아무것도 출력하지 않음

 

 

# if 문을 사용하기 위한 조건

-  if 문의 조건식에는 비교 연산자(==, <, >)논리 연산자(&&, ||)를 사용한 조건식만 사용 가능

- 조건식의 결과는 Boolean 타입ture(참)false(거짓)로 나타남

 

- 비교 연산자

-> 결괏값은 true 또는 false 중의 하나인 Boolean 타입으로 반환

연산자 의미
>
왼쪽이 크면 true, 작으면 false
< 왼쪽이 작으면 true, 크면 false
>=
왼쪽이 크거나 같으면 true, 아니면 false
 
<= 왼쪽이 작거나 같으면 true, 아니면 false
== 2개 항의 값이 같으면 true, 아니면 false
!= 2개 항의 값이 다르면 true, 아니면 false

 

var a = 30
var b = 19
var bigger = a > b
Log.d("비교 연산자", "a는 b보다 큽니다.: $bigger") 
// a는 b보다 큽니다.: true

 

 

 

- 논리 연산자

-> 비교 연산자로 나타난 결과를 한 번 더 연산하기 위해서 사용

-> 결괏값은 true 또는 false 중의 하나인 Boolean 타입으로 반환

연산자 의미
&& 논리곱(AND) /  두 항이 모두 true일 때에는 true, 아니면 false
|| 논리합(OR) / 두 항 중 하나의 항이 true일 때에는 true, 아니면 false
!
 
부정 단항 연산자(NOT) / true를 false로, false를 true로 바꿈

 

var a = 30
var b = 19
var c = 37
var bigger = a > b && a > c
Log.d("비교 연산자", "a는 b보다 크고, c보다도 큽니다:$bigger")
// a는 b보다 크고, c보다도 큽니다.: false

 

 

* 다른 연산자들 더 살펴보기

https://coding-juuwon2.tistory.com/207

 

[kotlin] 연산자와 우선순위

코틀린의 연산자와 이 연산자들의 우선순위를 알아보자 # 산술 연산자 - 덧셈, 뺄셈, 곱셈, 나눗셈, 나머지 연산을 수행하는 연산자다 연산자 설명 예 + 덧셈 a + b - 뺄셈 a - b * 곱셈 a * b / 나눗셈 a

coding-juuwon2.tistory.com

 

 

 

# 기본적인 if문

if (조건식) {
    // 조건식이 참일 경우 실행되는 코드 영역
}

 

 

다음 예제의 코드 결과를 예측해보자

var out = 0
var strike = 3
if (strike > 2) {
    out = out + 1
}

- strike가 3이기 때문에 strike > 2 라는 조건을 만족한다. 

만족하기 때문에 다음줄을 실행하여 out에 1을 더해주면 1이된다. 따라서 결과는 1이 출력된다

 

#  if ~  else문 

if (조건식) {
    // 조건식이 참일 경우 실행되는 코드 영역
} else {
    // 조건식이 거짓일 경우 실행되는 코드 영역
}

 

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

        var ball = 4
        if (ball > 3) { // ball이 3보다 크면 여기 블록의 코드가 실행됩니다.
            Log.d("ControlFlow", "4볼로 출루합니다.")
        } else { // 그렇지 않으면 else 다음에 있는 블록의 코드가 실행됩니다.
            Log.d("ControlFlow", "타석에서 다음 타구를 기다립니다.")
        }
    }
}

 

-> ball > 3 이라는 조건식을 만족하기 때문에 "4볼로 출루합니다" 가 출력된다

 

 

# 주석이란?

- 개발자가 코드관련 설명 메모를 작성할 수 있는 것으로 // 를 사용하여 주석을 처리할 수 있고, 주석이 처리된 문장은 컴퓨터가 해석하지 않는다

- 주석을 사용하는 것도 좋지만 이왕이면 변수명, 클래스명, 함수명, 이름 등은 구체적으로 작성하는것이 좋음

 

# if ~ else if ~ else 문

if (조건식1) {
    // 조건식1의 결과가 참일 경우 실행되는 코드 영역
    
} else if (조건식 2){
    // 조건식1의 결과가 거짓이고, 조건식2의 결과가 참일 경우 실행되는 코드 영역
    
} else {
    // 조건식1과 조건식2의 결과가 모두 거짓일 경우 실행되는 코드 영역
}

 

 

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

        var a = 1
        var b = 2
        var c = 3

        // 1. if 문 두 번 사용하기
        if (a < b) {
            Log.d("ControlFlow", "1: a는 b보다 작습니다.")
        }
        if (a < c) {
            Log.d("ControlFlow", "1: a는 c보다 작습니다.")
        }
        

        // 2. else if 문 사용하기
        if (a < b) {
            Log.d("ControlFlow", "2: a는 b보다 작습니다.")
        } else if (a < c) {
            Log.d("ControlFlow", "2: a는 c보다 작습니다.")
        }
    }
}

/** [로그캣 출력 내용]
1: a는 b보다 작습니다.
1: a는 c보다 작습니다.
2: a는 b보다 작습니다.
*/

 

-> 두개의 경우를 비교해봤을때 if문만 2번 사용할 경우 2개의 if문이 모두 실행되지만, else if문을 사용하면 앞에 if문 조건식을 만족하면 else if문은 실행되지 않는 차이가 있다

 

# 변수에 직접 if 문 사용하기

- if문의 조건식 결과를 변수에 대입할수있음

var a = 5
var b = 3
var bigger = if (a > b) a else b

 

->  다음 예제는 a와 b를 비교했을때, a가 b보다 더 크므로 변수 bigger에 a값인 5를 대입한다 

 

# if문의 마지막 값을 반환값으로 사용하기

var a = 5
var b = 3
var bigger = if (a > b){
     var c = 30
     a
} else {
     b
}

 

-> if문의 코드 영역이 여러줄일땐, 마지막 줄을 변숫값으로 사용한다 

-> 마지막 줄의 a값이 변수 bigger에 저장된다 

 

 

package net.flow9.thisiskotlin.basicsyntax

import android.os.Bundle
import android.util.Log
import androidx.appcompat.app.AppCompatActivity

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

        var eraOfRyu = 2.32
        var eraOfDegrom = 2.43

        val era = if (eraOfRyu < eraOfDegrom) {
            Log.d("MLB_Result", "2019 류현진이 디그롬을 이겼습니다.")
            eraOfRyu
        } else {
            Log.d("MLB_Result", "2019 디그롬이 류현진을 이겼습니다.")
            eraOfDegrom
        }

        Log.d("MLB_Result", "2019 MLB에서 가장 높은 ERA는 ${era}입니다.")
    }
}
/** [로그캣 출력 내용]
2019 류현진이 디그롬을 이겼습니다.
2019 MLB에서 가장 높은 ERA는 2.32입니다.
*/

 

 

# 문자열 템플릿 (문자열 안에서 수식 사용하기)

- 문자열 안에서 수식을 사용하고 싶을땐 ${ } 의 형식으로 사용함

- 변수가 하나인경우에는 $변수 의 형태로 사용할수있지만, 추가적인 연산식이 필요한 경우에는 ${ } 중괄호안에 수식을 입력하는 형태로 사용 (가독성을 높이기 위해 변수 하나만 있을때도 ${ } 이렇게 사용해도됨)

 

# 조건문 when

<switch문>

- 조건문 when을 이해하기위해 먼저 다른 언어의 switch문을 먼저 공부하는것이 도움이 된다

- switch문은 if문의 연산식에서 사용되는 비교연산자 중에 == 만 사용해서 같은 값인지를 비교하는 조건문 

- kotlin을 제외한 거의 모든 컴퓨터 언어에서는 switch라는 이름으로 사용되며, 선택문이라고 불리기도 함

switch (변수){
    case 비교값:
        // 변숫값이 비교값과 같다면 이 영역이 실행됩니다.
}

 

- kotlin의 when문은 다른 언어와는 다르게 같은 값뿐만 아니라 범위값도 처리할수있고, 사용방법도 더 많음

- kotlin의 when문특정값을 선택할수있는 switch의 사용법에 +  if문의 범위 비교기능이 더해진 if문의 확장판이라고 생각하면 더 쉬울것같다

 

 

- 일반적인 형태의 when 사용하기

when (파라미터) {
    비교값 -> {
        // 변숫값이 비교값과 같다면 이 영역이 실행됩니다.
    }
}

 

- when 다음에 ( ) 를 작성하고,  괄호 안에는 주로 비교 대상 파라미터로 사용할 변수명을 입력한다 

- if에서처럼 { } 를 사용해서  when 블록을 구분하고,  블록 내부에서 비교할 값화살표 연산자 (Arrow Operator ' -> ')를 사용해서 선택한다

 

when (파라미터) {
    비교값1 -> {
        // 변숫값이 비교값1과 같다면 이 영역이 실행됩니다.
    }
    비교값2 -> {
        // 변숫값이 비교값2와 같다면 이 영역이 실행됩니다.
    }
    else -> {
        // 변숫값이 앞에서 비교한 것들과 다르면 이 영역이 실행됩니다.
    }
}

 

-> 이렇게 여러개의 값을 하나의 when문에서 비교할수도 있다

 

 

package net.flow9.thisiskotlin.basicsyntax

import android.os.Bundle
import android.util.Log
import androidx.appcompat.app.AppCompatActivity

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

        var now = 10
        when (now) {
            8 -> {
                Log.d("when", "현재 시간은 8시 입니다.")
            }

            9 -> {
                Log.d("when", "현재 시간은 9시 입니다.")
            }

            else -> { // 위의 모든 조건에 맞지 않으면 else 다음 코드가 실행 됩니다.
                Log.d("when", "현재 시간은 9시가 아닙니다.")
            }
        }
    }
}

/** [로그캣 출력 내용]
현재 시간은 9시가 아닙니다.
*/

 

-> now가 10이니깐 else값에 있는 "현재시간은 9시가 아닙니다" 라는 로그가 출력된다

 

 

 

- 콤마로 구분해서 사용하기 

-> 특정 값을 비교하는데 결과처리가 동일하다면 콤마(,) 로 구분해서 한번에 비교할수있다

package net.flow9.thisiskotlin.basicsyntax

import android.os.Bundle
import android.util.Log
import androidx.appcompat.app.AppCompatActivity

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

        var now = 9
        when (now) {
            8, 9 -> {
                Log.d("when", "현재 시간은 8시 또는 9시 입니다.")
            }
            else -> { // 위의 모든 조건에 맞지 않으면 else 다음 코드가 실행 됩니다.
                Log.d("when", "현재 시간은 9시가 아닙니다.")
            }
        }
    }
}

/** [로그캣 출력 내용]
현재 시간은 8시 또는 9시 입니다.
*/

 

-> 콤마(,)로 8,9를 한꺼번에 비교했다

-> now가 9이므로 "현재시간은 8시 또는 9시 입니다" 로그가 출력된다

 

 

 

- 범위 값을 비교하기

-> in을 사용해서 범위값을 비교할수도 있다

-> if 문의 비교연산자 중 <= , >= 와 같은 기능을 구현할 수 있다 

 

package net.flow9.thisiskotlin.basicsyntax

import android.os.Bundle
import android.util.Log
import androidx.appcompat.app.AppCompatActivity

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

        var ageOfMichael = 19
        when (ageOfMichael) {
            in 10..19 -> {
                Log.d("when", "마이클은 10대 입니다.")
            }

            !in 10..19 -> {
                Log.d("when", "마이클은 10대가 아닙니다.")
            }

            else -> {
                Log.d("when", "마이클의 나이를 알 수 없습니다.")
            }
        }
    }
}

/** [로그캣 출력 내용]
마이클은 10대 입니다.
*/

 

-> in 10..19 를 이용해서  10에서 19까지라는 범위를 표현했다

-> ageofMichael이 19이므로, "마이클은 10대 입니다"라는 로그가 출력된다

 

 

 

- 파라미터 없는 when문 사용하기

-> when 다음에 오는 괄호를 생략하고, 마치 if문처럼 사용할수도 있다

 

package net.flow9.thisiskotlin.basicsyntax

import android.os.Bundle
import android.util.Log
import androidx.appcompat.app.AppCompatActivity

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

        var currentTime = 6
        when {
            currentTime == 5 -> {
                Log.d("when", "현재 시간은 5시 입니다.")
            }

            currentTime > 5 -> {
                Log.d("when", "현재 시간은 5시가 넘었습니다.")
            }

            else -> {
                Log.d("when", "현재 시간은 5시 이전입니다.")
            }
        }
    }
}

/** [로그캣 출력 내용]
현재 시간은 5시가 넘었습니다.
*/

 

-> currentTime이 6이므로 "현재 시간은 5시가 넘었습니다" 라는 로그가 실행된다

 

 

 

# if문과 when문은 언제 사용할까?

-> 연도 데이터와 요일 데이터를 기준으로 비교를 해보겠다 

  • 연도 데이터 -> 2019,2020... : 범위를 한정할 수 없고 개수가 많다
  • 요일 데이터 -> 월화수목금토일 : 값을 특정할수있고 개수가 7개로 한정되어있다

-> 범위가 넓고 값을 특정할수없을 경우에는, if문을 사용해서 처리하는것이 더 효율적이다

ex) 연도 데이터

 

-> 반면, 범위가 제한되고 값도 특정할 수 있는 경우에는, when문을 사용하는것이 더 효율적이다 

ex) 요일 데이터

when (요일) {
    월 -> 영어 공부를 합니다.
    화 -> 자전거 모임이 있습니다.
    수 -> 친구를 만납니다.
    목 -> 피아노를 칩니다.
    금 -> 코딩 공부로 밤을 세웁니다.
    토 -> 빨래를 합니다.
    else -> 집 청소를 합니다.
}

 

 

위의 코드를 if문으로 작성하면 아래와 같다

if (요일 == 월) {
    영어 공부를 합니다.
} else if (요일 == 화){
    자전거 모임이 있습니다.
} else if (요일 == 수){
    친구를 만납니다.
} else if (요일 == 수){
    피아노를 칩니다.
} else if (요일 == 목){
    코딩 공부로 밤을 세웁니다.
} else if (요일 == 수){
    빨래를 합니다.
} else {
    집 청소를 합니다.
}

 

-> 위의 코드는 너무 많은 else if문으로 인해, 가독성이 떨어진다는것을 확인할수있다

-> 이처럼 사용하려는 값을 특정할 수 있고, 값의 범위가 넓지 않다면 when문을 사용하는것이 바람직한 방법일것이다!

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

'개발 노트 > Kotlin' 카테고리의 다른 글

[kotlin]반복문  (0) 2024.01.16
[kotlin]배열과 컬렉션  (0) 2024.01.16
[kotlin]변수  (0) 2024.01.16
Log, Logcat  (0) 2024.01.16
버튼 눌러서 글자 바꾸기 예제  (0) 2024.01.15