Kotlin

#Kotlin 수업 정리 1

청춘고양이 2022. 11. 8. 19:22
반응형
import insertSort as insertSort

fun main(args: Array<String>) {


    // 컬렉션 //
    //arrayOf : 여러개의 변수를 지정 가능
    //listOf : 불변의 리스트, 중복 가능
    //setOf : 불변의 리스트, 중복 x ex -> setOf("1", "2", "3", "3") -> 뒤에 3은 찍히지 않음
    //mapOf("a"to 1, "b"to 2, "c"to 3) 작성 예시, 키-값 형태로 변수를 여러개 저장 ,mapOf 또한 불변 키

    //mutableListOf : 바꿀 수 있는 리스트
    //mutableMapOf : 바꿀 수 있는 맵

    //상호간 변화 가능 함.
    //바꿀 수 없는 리스트틑 바꿀 수 있는 리스트로 만들 때에는 array.toMutableListOf() 사용 하면 됨
    //바꿀 수 있는 리스트를 바꿀 수 없는 리스트로 만들 때에는 array.toList() 를 사용 => listOf(....)
     val array = mutableListOf("1", "2", "3")
    //val array = arrayOf("1","2","3")
    array.forEachIndexed { idx, x ->
        println("${idx}" + x)
    }

    println();
    array[0] = "10"
    //이렇게 하면 컴파일 에러 발생 이유는 이 부분은 값을 가져오기 때문 !, 따로 add 를 해줘야됨
    //array[3] = "10"
    array.add("10");
    array.forEachIndexed { idx, x ->
        println("${idx} " + x)
    }

    // 덧셈 뺄셈
    //덧셈
    var something1 = 1 + 1
    var something2 = 1 + 1
    var something3 = something1 + something2

    //뺄셈
    something1 = 1 - 1
    something2 = 1 - 1
    something3 = something1 - something2

    //곱셈/나눗셈
    something1 = 1 * 1
    something2 = 1 * 1
    something3 = something1 / something2

    // 나머지 연산
    something1 = 10 % 3
    println(something1)

    //Modular _ Shifting
    something1 = 3 % 3 + 1

    //++, --, Pre / Post
    something1 = 1
    println(something1++) // something1--
    println(something1)
    println(++something1) // --something1
    println(something1)

    //관계 연산
    println(1 > 2)
    println(1 < 2)
    println(1 >= 2)
    println(1 <= 2)

    // kotlin 에서 삼항 연산은 없음
    // 대신 엘비스 연산자를 사용 할 수 있음.
    // 엘비스 -> null 이면 1을 찍음
    println(null ?: 1)

    //비트연산 예시
    var x: Int = 2 // Bit : 0000 0000 0000 0010
    var y: Int = 1 // Bit : 0000 0000 0000 0001
    var z = x or y // Bit : 0000 0000 0000 0011
    //좌측으로 밈
    var sx = x shl 1 // Bit : 0000 0000 0000 0100
    //우측으로 밈
    var sy = x shr 1 // Bit : 0000 0000 0000 0001
    // 비트와이즈라고 구글링하면 자료 많이 나옴.

    x = 2
    if (x > 2) {
        println("x > 2")
    } else if (x > 1) {
        println("x > 1")
    } else {
        println("ELSE")
    }

    if (x > 2) {
        return println("x > 2")
    }
    if (x > 1) {
        return println("x > 1")
    }

    //코드 수정시 when 이 유연함.
    when {
        x > 1 -> {
            println("x > 1")
        }

        x > 2 -> {
            println("x > 2")
        }

        x > 3 -> {
            println("x > 3")
        }

        else -> {
            println("ELSE")
        }
    }
    //명확하게 값을 아는 경우
    when (x) {
        1 -> {
            println("x == 1")
        }

        2 -> {
            println("x == 2")
        }

        else -> {
            println("ELSE")
        }
    }

    //반복문 : while(횟 수가 불명확 할 때), do-while, for(횟 수가 명확 할 때), for-in
    x = 0
    while (x < 10) {
        print("$x ")
        x++
    }
    println()

    y = 0
    do {
        print("$y ")
        y++
    } while (y < 10)
    println()

    var range = 0..10
    var list = listOf(1, 2, 3, 4, 5)

    for (i in 0 until 5) {
        print("${list[i]}")
    }
    println()

    for (i in 4 downTo 0 step 2) {
        print("${list[i]}")
    }

    println()

    //1. 사람의 구조를 변수, 상수를 사용하요 선언
    val head: Byte = 1
    val body: Byte = 1
    var arm: Byte = 2
    val lag: Byte = 2

    //Number 의 함수
    //toByte, toShort, toInt, toFloat, toDouble, toBooLean, toString
    //Unsigned 의 함수
    //toUByte, toUShort, toUInt, toULong
    arm = (arm.toByte() + 1.toByte()).toByte()

    //2. 사람이 할 수 있는 동작 만들어보기
    val action: () -> Unit = {
        println("action")
    }
    action()

    //3. 제어 및 반복

    //1 == 점프 2 == 걷기 4 == 달리기 8 == 발차기

    val user = 1
    val jumpOption = 1 shl 0
    val workOption = 1 shl 1
    val runOption = 1 shl 2
    val kickOption = 1 shl 3

    val optionList = listOf<Int>(jumpOption, workOption, runOption, kickOption)

    for (item in optionList) {
        when (item) {
            user and jumpOption -> println("점프")
            user and workOption -> println("걷기")
            user and runOption -> println("달리기")
            user and kickOption -> println("발차기")
        }
    }

    println("코틀린 구구단")

    for (x in 2..9) {
        println("== ${x}단 ==")
        for (y in 1..9) {
            println("$x x $y = ${x * y}")
        }
    }

    //알고리즘1 : 정수 내림차순 정렬하기, for 문 사용
    val list = arrayListOf(4, 2, 7, 1, 10, 6, 3, 8, 9, 5)
    println("---- 정렬 후")
    insertSort(list)
    list.forEach { (print("${it}")) }
    println("Program arguments: ${args.joinToString()}")


    val targetList = mutableListOf<Int>(4, 2, 7, 1, 10, 6, 3, 8, 9, 5)
    val swap: (MutableList<Int>, Int, Int) -> Unit = { it, iidx, jidx ->
        val value = it[iidx]
        it[iidx] = it[jidx]
        it[jidx] = value
    }

    var min: Int
    for (i in 0 until targetList.size - 1) {
        min = i
        for (j in i + 1 until targetList.size) {
            if (targetList[min] > targetList[j]) min = j
        }
        swap(targetList, i, min)
    }

    //라벨 : GOTO 구문처럼 특정한 위치로 바로 이동할 수 있도록 라벨 처리 단, 함수 이름은 항상 라벨링된 것으로 간주
    //패키지 : 파일의 묶음
    //함수 : 하나의 특별한 목적의 작업을 수행하기 위해 독립적으로 설계된 프로그램 코드의 집합
    //반환 값이 없을 경우 Unit 을 사용해서 void 처럼 사용 가능.
    //함수 몸체가 단일 줄 일 경우 이퀄로 단일 줄 사용 가능
    //가변 파라미터 : 가변적 개수만큼 파라미터를 사용하며, 배열로 취급
    //중위 : 두 피연산자의 중간에 들어가는 함수, 확장함수로 선언을 해줘야 함.
    //지역함수 : 함수 안에 지역적으로 사용되는 다른 함수를 선언 가능.
    //함수를 한번 만들어 보자.
    fun plus(a: Int, b: Int): Int {
        val result = a + b
        return result
    }

    //Dynamic parameter 가 있을 경우, 그리고 한번에 더해 줄 수 있는 reduce 를 사용.
    fun plusVarage(vararg value: Int): Int {
        val result = value.reduce { total, v ->
            total + v
        }
        return result
    }

    //타입 설정 안한 함수.
    fun printSome(str: String) {
        println(str)
    }
    "Hello" concat "World"
    println(plusVarage(1))


    //람다: 익명 함수로, 코드를 간결하게 사용하고 전달할 수 있도록 하는 개념의 함수, 리턴 값이 없는 함수
    val lambda: (Int) -> String = { it ->
        println(it)
        ""
    }
    lambda(1)

    //고차 함수 : 람다안에 람다 전달.
    fun lambdaCaller(externalLambda: (Int) -> String) {
        externalLambda(1)
    }
    lambdaCaller(lambda)

    //TODO 표준 함수 -> 이 부분은 구글링 하면서 찾아봐야됨.

    //인라인 함수 호출
    callInline() // => 변환 => println("callInline") <- 인라인 함수

    //리스트 2 개를 합치는 함수
    fun <T : Any> concatList(listValueFirst: List<T>, listValueSecondary: List<T>): List<T> {
        val listResult = mutableListOf<T>()
        listResult.addAll(listValueFirst)
        listResult.addAll(listValueSecondary)
        return listResult.toList()
    }
    concatList(
        listOf(2, 3),
        listOf(4, 5)
    ).forEach {
        print(it)
    }





}

//인라인 함수: 함수가 호출되는 위치에 인라인 함수 코드를 복제
inline fun callInline() {
    println("callInline")
}

//중위 함수
infix fun String.concat(str: String) {
    println(this + " " + str)
}

fun insertSort(list: ArrayList<Int>) {
    var startIdx = 1
    var lastIdx = 0
    var temp = 0
    for (i in startIdx until list.size) {
        temp = list[i]
        lastIdx = i
        while ((lastIdx > 0) && (list[lastIdx - 1] > temp)) {
            list[lastIdx] = list[lastIdx - 1]
            lastIdx--
        }

        list[lastIdx] = temp
    }
}
반응형