# 조건문
- 특정 조건에 따라 결과를 다르게 실행하고자 할때 사용
- 주어진 조건식의 결괏값이 참인지 거짓인지에 따라 코드를 실행할 것인지 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
# 기본적인 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 |