참조 : https://try.kotlinlang.org
if와 슬픈 소식
fun main(args: Array<String>) {
println(max(args[0].toInt(), args[1].toInt()))
}
fun max(a: Int, b: Int) = if (a > b) a else b
if else
가 하나의 표현으로써 값을 리턴함을 알 수 있다. 특히 저 함수에다 직접 때려박아 정의하는 부분은 보면 볼수록 js가 떠오른다. 여기서 슬픈 소식은 Kotlin은 삼항연산자가 없다고 한다. ?를 쓸수가 없는 것이다. 대신 ?는 다른 의미로 자주 쓰인다.
- ?
- Kotlin은 기본적으로 변수들이 null값을 가질 수 없다.(컴파일 에러 발생)
var temp :String?
라고 하면 temp는 null이 될수도 있다.
temp?.length
라고 하면 temp가 null일 경우 null을 리턴하지만 아니라면 length를 리턴한다.
val size = temp?.length ?: 0
라고 하면 temp가 null이 아니라면 length를 리턴하고, null이라면 0을 리턴하게 된다.
- !!
- NPE(NullPointException)이 그리운 사람을 위해 변수에 ?대신 !!를 붙히면 NPE를 발생시킬 수 있다고 한다.
is
fun main(args: Array<String>) {
println(getStringLength("aaa"))
println(getStringLength(1))
}
fun getStringLength(obj: Any): Int? {
if (obj is String)
return obj.length // no cast to String is needed
return null
}
is
연산자를 통해 변수가 어떤 타입인지 알 수 있다.
배운만큼 보인다고, 함수에 : Int?
를 써주어 null값을 리턴할 수 있게 한 점을 볼 수 있다. 이어서 if를 보면 Any(아무거나!) 타입의 obj라는 이름의 변수가 String이면 길이를 리턴하게 되어있다. 결과는 다음과 같다.
3
null
while
fun main(args: Array<String>) {
var i = 0
while (i < args.size)
println(args[i++])
}
냉무. do while도 똑같다.
in
fun main(args: Array<String>) {
val x = args[0].toInt()
//Check if a number lies within a range:
val y = 10
if (x in 1..y - 1)
println("OK")
//Iterate over a range:
for (a in 1..5)
print("${a} ")
//Check if a number is out of range:
println()
val array = arrayListOf<String>()
array.add("aaa")
array.add("bbb")
array.add("ccc")
if (x !in 0..array.size - 1)
println("Out: array has only ${array.size} elements. x = ${x}")
//Check if a collection contains an object:
if ("aaa" in array) // collection.contains(obj) is called
println("Yes: array contains aaa")
if ("ddd" in array) // collection.contains(obj) is called
println("Yes: array contains ddd")
else
println("No: array doesn't contains ddd")
}
in
은 for에서만 쓰는게 아니었다.
아래의 결과는 x == 4일 때이다. 찬찬히 읽어보면 별거 없다.
OK
1 2 3 4 5
Out: array has only 3 elements. x = 4
Yes: array contains aaa
No: array doesn't contains ddd
when
fun main(args: Array<String>) {
cases("Hello")
cases(1)
cases(0L)
cases(MyClass())
cases("hello")
}
fun cases(obj: Any) {
when (obj) {
1 -> println("One")
"Hello" -> println("Greeting")
is Long -> println("Long")
!is String -> println("Not a string")
else -> println("Unknown")
}
}
class MyClass() {
}
역시 찬찬히 읽어보면 이해가 간다. 이렇게 편할수가 있나...
Greeting
One
Long
Not a string
Unknown