Kotlin - Grammar(Basic, Control Flow)

정현철·2023년 4월 14일
0

Android App

목록 보기
1/6
post-thumbnail

Basic syntax

  • Java나 C++과 다르게, statement나 expression 뒤에 semi-colons(;)을 삽입할 필요가 없다.
    • semi-colon은 multiple statements를 한 줄에 쓰고싶을 때에만 사용한다.
val mynum = 10; println(mynum)
  • val과 var
    • val : Read-only local variable. Can be assigned a value only once
    • var : Variables that can be reassigned
val a : Int = 1 // immediate assignment
val b = 2 // Int type is inferred
// if there is no initializer, Type required
val c: Int 
c = 3 // deferred assignment

var x = 5 // Int type is inferred
x += 1 // because x = "var"
  • Type inference
    • 앞서 한 것처럼, 변수에 initial value를 assign하면 kotlin compiler가 해당 value의 type을 바탕으로 type infer을 해준다.
    • kotlin이 statically-typed language이기 때문에 반드시 type이 필요한 것.
    • 이는 곧, 변수의 type이 컴파일 시 해석되고, 이후에 절대 바뀔 수 없다는 말이다.

Control Flow

Conditional expressions

Kotlin Docs - Control flow
1. if expression

// 기본형 statement
if (a > b) { 
	return a
} else {
	return b
}

// if can also be used as an expression.
// 값을 return할 수 있다. 아래 둘 다 가능
val maxValue = if (a > b) a else b
val minValue = if (a < b) {
	a
} else {
	b
}

// 대신 삼항연산자(ternary operator)를 지원하지 않는다.
  1. when expression
  • when은 'switch'와 비슷하게, multiple branches를 다루는 conditional expression이다.
when (x) {
  1 -> print("x == 1")
  2 -> print("x == 2")
  else -> { // switch에서의 default
  	print("nothing")
  }
}

// 역시 값 return 가능
val check: Boolean? = null
val value = when(check) {
	true -> 1
    false -> 0
	// 반드시 모든 경우의 조건을 정의해야 한다. 아니면 컴파일 에러.
    null -> null // 1) 남은 값 추가
    else -> null // 2) else 추가
}

// 표현식을 조건식으로 가질 수도 있다.
val p = Person("Alice", 10)
when (p) { // 객체 p의 type이 Person이면 is Person
	is Person -> println("yes")
    else -> println("no")
}

// range
val cnt = 100
val grade = when (cnt) {
	in 90 .. 100 -> "A" // 90 ~ 100
    in 80 until 90 -> "B" // 80 ~ 89
    else -> "F" // ~ 79
}
  • 다음과 같은 경우에는 반드시 else가 필요하다.
    • when has a subject of an Boolean, enum, or sealed type, or their nullable counterparts.
    • branches of when don't cover all possible cases for this subject.
enum class Color(val rgb: Int) {
    RED(0xFF0000),
    GREEN(0x00FF00),
    BLUE(0x0000FF)
}

when (getColor()) {
	Color.RED -> println("red")
    Color.GREEN -> println("green")
    Color.BLUE -> println("blue")
    // 이때에는 all cases가 covered되었기 때문에 'else' 불필요.
}

when (getColor()) {
	Color.RED -> println("red")
    else -> println("not red") // no branches for GRENN and BLUE. so else is required
}

Loop expressions

  1. for loop
  • forEach문과 같이, iterator의 모든 요소를 반복한다.
  • C에서와 같이 단순 숫자 반복을 원한다면, in 연산자를 사용할 수 있다.
for (item in collection) print(item)
for (idx in collection.indices) { // index-based loop
	println("item is ${items[idx]}")
}

// range
for (i in 1..3) println(i) // 1 2 3
for (i in 6 downTo 0 step 2) println(i) // 6 4 2 0
  1. while loop
  • condition을 만족할 때 계속 반복(다른 while과 동일)
while (x > 0) {
	x--
}

do {
	println(y)
    y--
} while (y >= 0)
  • loop에서는 break, continue 역시 지원한다.

0개의 댓글