진짜로 빨리 코틀린을 공부해놓아야하는 상황이 됐다.
그래서 집에 굴러다니는 [초보자를 위한 코틀린 200제] 를 집었다.
빠르게 훑어보는 식으로 진행할 예정이다.

// part1.main.Main.kt 파일
package part1.main
typealias MyNumberType = Int // 타입에 별명을 붙일 수 있다.
fun main(args: Array<String>) {
// problem 1
println("Hello, Kotlin!")
// problem 5
println((53 + 62 - 126).toDouble()) // 숫자 타입끼리는 서로 상속 관계가 아니라 형변환을 괄호로 안 하고 .to~ 로 한다.
// problem 7
println(15 and 7) // 1111 and 111 => 7
println(5 or 2) // 101 or 10 => 111 => 7
println(15 xor 5) // 1111 xor 101 => 1010 => 10
println(32767.inv()) // 비트반전 (자바의 ~32767) => -32768
println(1 shl 3) // java 1 << 3
println(8 shr 1) // java 8 >> 1
println(-17 ushr 2) // java -17 >>> 2 (부호를 유지한 채 오른쪽 시프트) -> 이거 부호를 무시하고 오른쪽 시프트 같은데? 무조건 0으로 채워지게?
// problem 8
println(0xFFFF) // 65535
// problem 10
println('a'.code) // 97
println("Hello"[1]) // e
// problem 12
val a = 10
println("a의 값: $a")
println("a의 값: \$a")
println("a + 10 = ${a + 10}") // 내부적으로는 String + 연산으로 치환된다. 따라서, 그냥 Syntactic sugar 다.
// problem 13
val b: MyNumberType = 11
println(b)
// problem 17
val c = listOf(1, 2)
val d = listOf(1, 2)
println(c == d) // true -> java equals() 랑 동일
println(c === d) // false -> reference 비교다!
// problem 22
val e = if (a < b) {
println("$a 는 $b 보다 작다.")
a
} else {
println("$a 는 $b 보다 같거나 크다.")
b
}
println(e) // 10, if-else 문을 표현식으로 쓸 수 있다. 이게 삼항연산자까지 대체한다.
// problem 23
val output = when (e) {
6,7,8,9,10 -> {
println("6이상이다.")
"over six"
}
1,2,3,4,5 -> {
println("5이하다.")
"under five"
}
else -> {
println("몰라")
"unknown"
}
}
println(output) // java 의 switch-case 문이 when 절로 대체된다. 근데 훨씬 문법 표현 방식이 풍부하다.
// problem 29
var i = 0
myOuter@ while (i < 10) { // 이렇게 반복문에 라벨을 달아서
while (i < 5) {
println("$i 번째 루프에요. 안쪽")
i++
if (i == 3) {
break@myOuter // 이렇게 break 시에 어디까지 나갈 건지를 정할 수 있다.
}
}
println("$i 번째 루프에요. 바깥쪽")
i++
}
}
// part1.main.Main2.kt 파일
package part1.main
import part1.util.min
// problem 32
fun main(): Unit { // 코틀린에서는 void 대신 Unit 을 쓴다. Unit 리턴이면 생략이 가능하다.
println(problem33())
println(problem34(1, 2, 3, 4, 5, 6, 7, 8, 9, 10))
problem39()
problem43And44()
}
// problem 33
fun problem33(a: Int = 0): Int { // 파라미터에 default 값을 지정할 수 있다.
return a;
}
// problem 34
fun problem34(vararg numbers: Int): Int { // 자바에서 파라미터에 ... 붙이는 게, 코틀린에서는 vararg 키워드를 쓴다.
var sum = 0
for (number in numbers) {
sum += number
}
return sum
}
// problem 39
fun problem39() {
// 이렇게 함수 내에서 로컬함수를 선언해서
fun problem39Local() {
println("localFunction")
}
// 함수 내에서만 사용이 가능하게 할 수도 있다.
problem39Local()
}
// problem 43, 44
fun problem43And44() {
println(part1.util.max(1, 2)) // 다른 패키지 안에 있는 매서드를 호출할 때는, 패키지 경로까지 모두 명시해야한다.
println(min(1, 2)) // import 문을 쓰면 패키지 경로 명시 없이 다른 패키지의 함수를 사용할 수 있다.
}
// part1.util.Math.kt 파일
package part1.util
// 아래 함수들은 같은 패키지 내에서만 호출이 가능하다.
fun max(a: Int, b: Int): Int {
return if (a > b) a else b
}
fun min(a: Int, b: Int): Int {
return if (a < b) a else b
}
이렇게 Part 1 이 끝난다.
느낀점은,
이 정도였던 것 같다.
음 내일은 좀 더 속도를 올려봐야겠다.