[Kotlin] 조건문 if-else, when, try-catch, while, for

Yeon·2023년 7월 7일
0

Android

목록 보기
4/9
post-thumbnail

비교 연산자

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

논리 연산자

연산자의미예시결과
&&논리곱. 두 항이 모두 true라면 true, 아니면 false(7 < 9) && (2 < 1)false
||논리합. 두 항 중 하나의 항이라도 true라면 true, 아니면 false(7 > 9) || (2 < 1)true
!부정 단항 연산자. true를 false로, false를 true로 바꿈! (7 > 9)true

if - else

  • Java와 다르게 Kotlin에서는 if, else도 표현식이며, if else는 항상 반환값이 있음
  • {} 블럭으로 있을 경우에는 마지막줄의 값을 반환
  • if, else를 표현식으로 사용할 경우, if가 있으면 항상 else도 있어야 함
// java
int x = 2;
int b = 7;

int maxValue = x;

if (x > y) {
    maxValue = x;
} else {
    maxValue = y;
}
// kotlin
val x = 2
val y = 7

var max: Int

if (x > y) {
    max = x
} else {
    max = y
}

// 표현식으로서의 사용
val max = if (x > y) x else y

when

  • Java의 switch-case와 대응되지만 Kotlin에서는 표현식으로 사용될 수 있어 값을 할당할 수 있음
  • Kotlin의 is는 Java의 instanceOf와 비슷함
  • 처리해야 되는 양이 많을 때는 {} 블럭으로 묶는데, 그걸 표현식으로 사용할 때에는 제일 마지막 라인의 값을 반환
  • when을 표현식으로 사용할 경우에는 항상 else를 사용 (enum 제외, 표현식이란 무언가 값에 할당한다는 것을 의미)
  • when으로 type을 분기하면 별도로 casting을 하지 않아도 됨
// java
int x = 1;
switch (x) {
    case 1:
        system.out.println(1);
        break;
    case 2:
        system.out.println(2);
        break;
    default:
        system.out.println(default);
        break;
}
// kotlin
val x = 1

when {
    x == 1 -> print("x == 1")
    x == 2 -> print("x == 2")
    else -> {
        print("x is neither 1 nor 2")
    }
}

//위에 조건을 줄여서 표기 가능
// 1.
when(x) {
    1 -> print("x == 1")
    2 -> print("x == 2")
    else -> {
        print("x is neither 1 nor 2")
    }
}

//2.
when(x) {
    0, 1 -> print("x == 0 or x == 1")
    else -> print("otherwise")
}

//3.
val s = "1"
val x = 1

when(x) {
    parseInt(s) -> print("s encodes x")
    else -> print("s does not encode x")
}

fun parseInt(value: String): Int  = 1


//4.
val x = 129
val validNumbers = 100..120

//when의 조건에 표현식이 들어갈 수 있음
when(x) {
    in 1..10 -> println("x is in the range")
    in validNumbers -> println("x is valid")
    !in 10..20 -> println("x is outSide the range")
    else -> println("none of the above")
}

if vs when

  • if 문: 범위가 넓고 값을 특정 할 수 없을 경우 사용
  • when 문: 범위가 제한되고 값을 특정할 수 있는 경우 사용
when (week) {
    mon -> red
    tue -> orange
    wed -> yellow
    thu -> green
    fri -> blue
    sat -> navy
    else -> purple
}

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

if (week == mon) {
    red
} else if (week == tue) {
    orange
} else if (week == tue) {
    yellow
} else if (week == tue) {
    green
} else if (week == tue) {
    blue
} else if (week == tue) {
    navy
} else {
    purple
}

가독성이 떨어지고 효율성이 떨어짐
이처럼 사용하려는 값을 특정할 수 있고 값의 범위가 넓지 않다면 when문을 사용하는 것이 더 좋음

try - catch

  • Java의 try-catch와 비슷하지만 표현식으로 사용할 수 있어서 변수 등에 값을 할당할 수 있음
  • 정상적인 케이스에는 try 값이 exception이 발생하면 catch 값이 할당됨
  • try, catch는 {}의 마지막 줄의 값을 반환
  • Java와 마찬가지로 finally도 제공하지만 선택적임
// java
String value = "text"

int ParsedInt;

try {
    parsedInt = Integer.parseInt(value);
} catch (NumberFormatException e) {
    e.printStactTrace();
    parsedInt = -1;
}

System.out.println(parsedInt);    // -1
// kotlin - 표현식으로서의 사용
val value = "test"

val parsedInt: Int? = try {
    value.toInt()
} catch (e: NumberFormatException) {
    -1
}
println(parsedInt)    // -1

while

  • Kotlin의 while문과 do while문의 기능 및 문법은 Kotlin 문법의 일반적인 특징을 제외하면 Java와 완전히 동일함
// java
// while
int x = 0;
int y = 7;

while (x < y) {
    Log.d("Number", "x=" + x + "y=" + y);
    x += 2;
    y ++;
}

// do while
int x = 0;
int b = 7;

do {
Log.d("Number", "x=", + x + "y=" + b);
    x += 2;
    y ++;
} while (x < y);
// kotlin
var x: Int = 0
var y: Int = 7

while (x < y) {
    Log.d("Number", "x=$x y=$y");
    x += 2
    y ++
}

// do while
var x: Int = 0
var y: Int = 7

do {
    Log.d("Number", "x=$x y=$y")
    x += 2
    y ++
} while (x < y)

for

  • Java가 인덱스 기반 for문과 for-each문을 지원하는 반면 Kotlin은 for-each 형태만 지원하며, 반자를 통해 접근하는 인자의 타입을 생략할 수 있음
// java
List<String> names = ...    // 이름 목록

// for-each
for (String name : names) {
    Log.d("Name:", "name = " + name);
}
// kotlin
val names: List<String> = ...

// 변수 name의 타입은 List names를 통해 String으로 추론하므로
// 타입을 굳이 명시하지 않아도 됨

for에서의 인덱스 접근

  • for문 내에서 현재 항목의 인덱스가 필요할 경우, Collection.indicies Property를 사용하면 Collection의 인덱스를 순환하여 인덱스 인자로 배열 내 항목에 접근할 수 있음
val names: List<String> = ...

for (i in names.indicies) {
    // 인덱스 인자로 배열 내 항목 접근
    Log.e("Name", "name=${names[i]}")
}

범위

  • .. : 시작과 끝을 포함하는 범위
val myRange : IntRange = 0..10

for (i in myRange) {
    // Do smething
}

// for문 안에서 바로 범위 지정
for (i in 0..10) {
    // Do somthing
}
  • until: 가장 마지막 값을 포함하지 않는 범위
val items: List<String> = ...

val myRange: IntRange = 0..4        // 0, 1, 2, 3, 4
val myRange: IntRange = 0 util 4    // 0, 1, 2, 3
  • downTo(): 역순으로 수행
for (i in 7 downTo 3) print(i)    // prints "76543"
  • step(): interval 설정
for (i in 3..8 step 2) print(i)          // prints "357"

for (i in 8 downTo 1 step 2) print(i)    // prints "8642"

[참고 사이트]

"Expression", kotlin

0개의 댓글