Skip to content

Instantly share code, notes, and snippets.

@ihoneymon
Created September 20, 2017 09:50
Show Gist options
  • Save ihoneymon/74cb22e51fd79c7e881b199ba71ce420 to your computer and use it in GitHub Desktop.
Save ihoneymon/74cb22e51fd79c7e881b199ba71ce420 to your computer and use it in GitHub Desktop.
코틀린 Kotlin 하나식 사용해보기
/**
 * 패키지 정의하기
 * - 소스 상단에 정의한다
 */
package io.honeymon.kotlin.study.syntax

import java.util.*

// IDE에서 실행하려면 `main(args: Array<String>) {fun call}` 으로 해야하는군.
fun main(args: Array<String>) {
    //call fun
}

/**
 * =================================================
 * 함수 정의하기
 * =================================================
 */
fun sum(a: Int, b: Int): Int {
    return a + b
}

fun sum2(a: Int, b: Int) = a + b

fun printSum1(a: Int, b: Int): Unit {
    println("Sum of $a and $b is ${a + b}")
}

fun printSum2(a: Int, b: Int) {
    println("Sum of $a and $b is ${a + b}")
}

fun printSum3(a: Int, b: Int) = println("Sum of $a and $b is ${a + b}")

/**
 * ==================================================
 * 지역변수 정의하기: 1회 할당가능한 읽기전용
 * ==================================================
 * - 함수(Function) 내에서 선언이 가능하군
 * - 변수를 즉시할당하는 경우에는 최상위에서 선언가능
 * - 지연할당(deferred assignment)의 경우에는 함수 내에 선언
 */
var a: Int = 1
var b = 2

fun localVal() {
    val a: Int = 1      // 즉시할당
    val b = 2           // 타입추론
    val c: Int
    c = 3
}

var x = 5
fun mutableVar() {
    var x = 5           // `Int` 형 타입추론
    x += 1
}

/**
 * ==================================================
 * 문자열 템플릿
 * ==================================================
 */
fun stringTemplate() {
    var a = 1
    var s1 = "a is $a"

    a = 2
    var s2 = "${s1.replace("is", "was")}, but now is $a"
    println(s2);
}

/**
 * ==================================================
 * 조건표현식
 * ==================================================
 */
fun maxOf(a: Int, b: Int): Int {
    return if (a > b) {
        a
    } else {
        b
    }
}

fun maxOf2(a: Int, b: Int): Int {
    return if (a > b) a else b  // == condition ? a : b
}

fun maxOf4(a: Int, b: Int) = if (a > b) a else b
/**
 * 3항 연산자는 안되나?
 */
//fun maxOf2(a: Int, b: Int) = a > b ? a : b

// ==================================================
// Null 일 수 있는 값 사용 및 Null 체킹
// ==================================================
// <a href="https://kotlinlang.org/docs/reference/null-safety.html">Null-safety</a>
fun parseInt(str: String): Int? {
    return str.toInt()          // null 이 나올 수도 있고..
}

fun printProduct(arg1: String, arg2: String) {
    val x = parseInt(arg1)
    val y = parseInt(arg2)

    if (x != null && y != null) {
        println(x * y)
    } else {
        println("either '$arg1' or '$arg2' is not a number")
    }
}

fun printProduct2(arg1: String, arg2: String) {
    val x = parseInt(arg1)
    val y = parseInt(arg2)

    if (x == null) {
        println("Wrong number format in arg1: '$arg1'")
        return
    }

    if (y == null) {
        println("Wrong number format in arg2: '$arg2'")
        return
    }


    println("either '$arg1' or '$arg2' is not a number")
}

/**
 * ==================================================
 * 타입 점검 및 자동 형변환
 * ==================================================
 * `is` 가 `instance of` 와 동일한 역할을 수행한다. 이건 좋구만
 * 불변 지역변수 또는 속성이 특정형태로 체크되고 있는 경우에는 명시적으로 형변활 필요가 없다.
 */
//
fun getStringLength(obj: Any): Int? {
    if (obj is String) {    // `obj` 는 자동으로 `String` 으로 형변환된다.
        return obj.length
    }

    // 타입체크된 `obj`는 여전히 `Any` 형태다.
    return null
}

fun getStringLength2(obj: Any): Int? {
    if (obj !is String) return null

    // `obj` 는 자동으로 `String` 으로 형변환된다.
    return obj.length
}

fun getStringLength3(obj: Any): Int? {
    // `obj` 는 `&&` 쪽에서만 자동으로 형변환된다.
    if (obj is String && obj.length > 0) {
        return obj.length
    }

    return null
}

/**
 * ==================================================
 * 반복문
 * ==================================================
 */
//
fun loop() {
    val items = listOf("apple", "banana", "kiwi")   // 리스트 만드는 거 간단해서 맘에 든다.
    for (item in items) {
        println(item)
    }
}

fun loop2() {
    val items = listOf("apple", "banana", "kiwi")
    for (index in items.indices) {  // for 문 돌고 있는 Iterator 가 가지고 있는 index 값을 주는건가?
        println("item at $index is ${items[index]}")
    }
}

/**
 * ==================================================
 * while 반복문
 * ==================================================
 */
//
fun whileLoop() {
    val items = listOf("apple", "banana", "kiwi")
    var index = 0
    while (index < items.size) {
        println("item at $index is ${items[index]}")
        index++
    }
}

/**
 * ==================================================
 * `when` 표현식
 * ==================================================
 * (switch - case) 보다 간결하다.
 */
//
fun describe(obj: Any): String? {
    return when (obj) {
        1 -> "One"
        "Hello" -> "Greeting"
        is Long -> "Long"
        !is String -> "Not a string"
        else -> "Unknown"
    }
}

/**
 * ==================================================
 * 범위 ranges 사용하기
 * ==================================================
 * link:https://kotlinlang.org/docs/reference/ranges.html[Ragnes]
 */
//
fun range1() {
    val x = 10
    val y = 9
    if (x in 1..y + 1) {
        println("fits in range")
    }
}

/*
 * 범위를 넘어서는지 확인
 */
fun range2() {
    val list = listOf("a", "b", "c")

    if (-1 !in 0..list.lastIndex) {
        println("-1 is out of range")
    }
    if (list.size !in list.indices) {
        println("list size is out of valid list indices range too")
    }
}

/*
 * 범위에서 반복
 */
fun range3() {
    for (x in 1..5) {
        print(x)
    }
}

/*
 * 범위에서 지정한 크기만큼 건너뛰기
 */
fun range4() {
    for (x in 1..10 step 2) {
        print(x)
    }
    for (x in 9 downTo 0 step 3) {
        print(x)
    }
}

/**
 * ==================================================
 * 컬렉션 사용하기
 * ==================================================
 */
//
fun collection1() {
    val items = listOf("first", "second", "third")
    for (item in items) {
        println(item)
    }
}

fun collection2() {
    val fruits = listOf("apple", "pineapple", "pitch")
    fruits
            .filter { it.startsWith("a") }  // 람다식을!!
            .sortedBy { it }
            .map { it.toUpperCase() }
            .forEach { println(it) }
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment