Learning Kotlin - 1일차: Part 1 훑어보기

woonge·2022년 4월 26일
0

코틀린

목록 보기
1/1

진짜로 빨리 코틀린을 공부해놓아야하는 상황이 됐다.
그래서 집에 굴러다니는 [초보자를 위한 코틀린 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 이 끝난다.

느낀점은,

  • 자바가 가진 제약을 많이 풀어줬구나!
    • 어느 클래스에도 속하지 않은 매서드 및 전역 변수 선언 가능
    • 함수 내에서 로컬함수 선언 가능
    • 라벨 사용 가능
  • 기호를 쓰기보다는 예약어를 쓰는 걸 좋아하는구나!
    • and, or, xor, vararg 등 자바에서는 기호로 쓰던 걸 다 예약어로 바꿔놓음
  • 뭔가 fancy 하게 보이려 노력한 느낌이랄까?
    • String 내 $a. 이거 결국 String + 연산으로 치환되는 거면 로그 남길 떄는 여전히 {} 를 써야함.
    • 삼항연산자를 if 로 대체하면서 문법적으로 통일성이 생김.
    • when 의 switch-case 보다 더 발전된 표현력.

이 정도였던 것 같다.
음 내일은 좀 더 속도를 올려봐야겠다.

profile
6년차 쿠팡 웹 개발자

0개의 댓글