kotlin

Kotlin enum, lateinit, couroutine 등

slow333 2023. 1. 14. 12:02

25. 함수의 argument 다루는 방법과 infix 함수

arguments

    함수 이름이 같아도 자료형이 다르거나 파라미터의 개수가 다르면 서로 다른 함수로 사용가능

-------------------------------------------------

fun a(x:Int)

fun a(x:Int, txt:String)

fun a(x:Int, y:Int)

 

fun main() {

    read(5)

    read("'문자'")

}

 

fun read(x : Int) {

    println("${x} is integer")

}

 

fun read(x : String) {

    println("${x} is string")

}

 

    파라미터를 받아야 하는 함수이지만 하지만 파라미터 없이도 동작해야 경우

    default arguments è 파라미터가 없으면 기본 지정값으로 동작

    named arguments è 순서와 상관없이 이름을 사용해서 할당

    variable number of arguments(vararg) è 같은 자료형을 개수와 상관없이 파라미터로 받고 싶을

-------------------------------------------------

fun main() {

    deliveryItems("가방", 2) // default arg

    deliveryItems("가방", 2, "회사")

    deliveryItems("", dest="울집") //named

   

    sum(3,4,5)

}

 

fun deliveryItems(n : String, count: Int =1, dest:String="home") {

    println("${n} ${count} 받아 ${dest} 배달")

}

 

fun sum(vararg nums: Int) {  // vararg

    var sum = 0

   

    for ( n in nums ) {

        sum += n

    }

    print(sum)

}

infix 함수

fun main() {

    println(5 multiply 4)

    print(5.multiply(4))

}

 

infix fun Int.multiply(x: Int): Int = this * x

 

// class안에서 infix 적용시 적용할 class 자기 자신이므로

 

26. nested class and inner class

class 안에 class 존재하는 유형

코드의 가독성 작성 편의성이 올라갈 있음

Nested Class

    하나의 class 다른 class 강하게 연관되어 있다는 의미

    형태만 내부에 존재할 실질적으로 내용을 직접 공유할 없는 별개의 class

class Mother { class Nested {} }  à Mother.Nested()

inner Class

    혼자서는 객체를 만들수 없고 외부 class 객체가 있어야 생성과 사용이 가능

    외부 class 객체의 속성이나 함수를 사용 가능

class Outer {  inner class Inner {}  }

-------------------------------------------------

fun main() {

    Outer.Nested().introduce()

   

    val outer = Outer()

    val inner = outer.Inner()

   

    inner.introduce()

    inner.introduceOuter()

   

    outer.txt = "Changed Outer class"

    inner.introduceOuter()

}

 

class Outer {

    var txt = "Outer class"

   

    class Nested {

        fun introduce() {

            println("Nested class")

        }

    }

   

    inner class Inner {

        var txt = "Inner class"

       

        fun introduce() {

            println(txt)

        }

       

        fun introduceOuter() {

            println(this@Outer.txt)

        }

    }

}

 

27. Data Class Enum Class

특별한 기능이나 형태를 갖는 class

Data Class

    데이터를 다루는 최적화된 class 5가지 기능을 내부적으로 자동 생성

·    equals() à 같은 내용 인지 비교

·    hashCode() à 객체의 내용에서 고유한 코드를 생성

·    toString()

·    copy() à 아무 파라미터가 없으면 똑같은 내용으로 생성

-    val a = Data(“d”,7) val b = a.copy

-    val a = Data(“d”,7) val b = a.copy(“C”) è b Data(“C”, 7) 같음

·    componentX() à 속성을 순서대로 반환

-------------------------------------------------

fun main () {

 

    val a = General("kotlin", 2039)

   

    println(a == General("kotlin", 2039))

    println(a.hashCode())

    println(a)

   

    val b = Data("java", 2929)

   

    println(b == Data("java", 2929))

    println(b.hashCode())

    println(b)

   

    println(b.copy())

    println(b.copy("python"))

    println(b.copy(id = 2020))

   

    val list = listOf(Data("kit", 333),

                     Data("co", 222),

                     Data("sos", 111))

    for ((a,b) in list) {

        println("${a} , ${b}")

    }

}

 

class General(val name: String, val id: Int)

 

data class Data(val name: String, val id: Int)

Enum Class

    enum class Color { RED, BLUE, BLACK } à 모두 enum class Color 객체를 생성하기 위한 선언

enum class Color (var num : Int) { RED(1), BLUE(3)

    fun isRed = this === Color.RED   }

-------------------------------------------------

fun main () {

    var a = Gen.SING

    println(a)

   

    a = Gen.POOP

    println(a.isPooping())

   

    a = Gen.EAT

    println(a.cat)

   

    a = Gen.POOP

    a.catPrint()

}

 

 enum class Gen(val cat : String) { //name enum 내부에서 사용하는 거라 쓰면 애러남

    SING("노래"),

    EAT("먹기"),

    POOP("누다. 싸다");

    

    fun isPooping() = this == Gen.POOP

   

    fun catPrint() {

        println(this.cat)

    }

}

 

28. 변수의 고급 기술(상수, lateinit, lazy)

상수(const)

    const val CONST_A = 3029 // 바꿀 없는 상수, 기본 자료형만 가능(String 가능)

    변수는 실행 변환에 따른 성능 저하 발생. 상수는 없음

-------------------------------------------------

fun main () {

    val foodCourt = FoodCourt()

    foodCourt.searchPrice(FoodCourt.FOOD_CREAM)

    foodCourt.searchPrice(FoodCourt.FOOD_SIDE)

}

 

class FoodCourt {

    fun searchPrice(foodName: String) {

        val price = when(foodName){

            FOOD_CREAM -> 10000

            FOOD_VEGE -> 1230

            FOOD_SIDE -> 500

            else -> 0

        }

        println("${foodName} ${price}입니다.")

    }

    companion object {

        const val FOOD_CREAM = "크림파스타"

        const val FOOD_VEGE = "김치류"

        const val FOOD_SIDE = "멸치류"

    }

}

lateinit

    일단 변수만 선언하고 나중에 초기값(객체) 할당

    초기값 할당 전까지 변수를 사용할 없음(애러 발생)

·    초기화 확인을 위해서 à ::a.isInitialized

    기본 자료형에는 사용할수 없음(String class 가능)

    lateinit var 변수의 제한 사항

-------------------------------------------------

fun main () {

    val a = LateInitSam()

    println(a.getLateInitText())

    a.txt = "새로 할당한 "

    println(a.getLateInitText())

}

 

class LateInitSam {

    lateinit var txt : String

   

    fun getLateInitText() : String {

        if (::txt.isInitialized) {

            return txt

        } else {

            return "기본값"

        }

    }

}

lazy

    일정 시간 기다린 후에 초기화를 수행

·    val a : Int by lazy {7}  println(a) // 7 후에 초기화

    코드의 실행 시간을 최적화 하는 코드

·    람다함수로 초기화가 진행되므로 val a : Int by lazy { println(a) 7 } 위와 같은 결과

-------------------------------------------------

fun main () {

    val a : Int by lazy{

        println("초기화를 합니다.")

        5 }

   

    println("코드를 시작합니다.")

    println(a)

    println(a)

}

 

29. 비트연산

    비트는 부호로 사용

    부호 비트를 제외한 모든 비트를 좌측으로 이동

·    shl(shift left), shr(shift right)

    부호를 포함 모든 비트를 우축으로 이동

·    ushr(unsigned shift right)

    연산자 : and, or, xor(같으면 0, 다르면 1)

-------------------------------------------------

fun main () {

    var binary : Int = 0b10000

    binary = binary or(1 shl 2) //1이라는 값을 좌측으로 2 밀음(100)

    println(binary.toString(2)) //2진수형의 문자열로 출력

   

    var result = binary and(1 shl 4)

    println(result.toString(2))

   

    println(result shr 4)

   

    binary = binary and((1 shl 4).inv())

    println(binary.toString(2))

   

    println((binary xor(0b10100)).toString(2))

}

 

30. 코루틴을 통한 비동기 처리

    여러 코드를 동시에 진행  à import kotlinx.coroutines.*

·    delay(milisecond:Long) // 밀리초 단위로 루틴을 잠시 대시 기키는 함수

·    Job.join() // Job 실행이 끝날때까지 대기하는 함수

·    Deferred.await() // Defferred 실행이 끝날때까지 대기하는 함수

·    3개는 coroutine내부, runBlocking 같은 루틴의 대기가 가능한 구문 안에서만 동작 가능

-------------------------------------------------

fun main () {

   runBlocking {

       val a = launch{

           for (i in 1..5){

               println(i)

               delay(10)

           }

       }

      

       val b = async {

           "async 종료"

       }

       println("async 대기")

       println(b.await())

       println("launch 대기")

       a.join()

       println("launch 종료")

   }

}

 

    cancel() // 취소

-------------------------------------------------

fun main () {

    runBlocking {

       val a = launch{

           for (i in 1..5){

               println(i)

               delay(10)

           }

       }

      

       val b = async {

           "async 종료"

       }

      

       println("async 대기")

       println(b.await())

       println("launch 취소")

       a.cancel()

       println("launch 종료")

   }

}

 

    withTimeoutOrNull() 제한 시간내 종료 안되면 null

-------------------------------------------------

import kotlinx.coroutines.*

 

fun main () {

   runBlocking {

       var result = withTimeoutOrNull(50) {

           for (i in 1..15){

               println(i)

               delay(10)

           }

           "Finish"

       }

       println(result)

   }

}

'kotlin' 카테고리의 다른 글

kotlin OOB basic  (0) 2023.02.06
kotlin data type  (0) 2023.02.06
Kotlin null 처리  (0) 2023.01.14
Kotlin String  (0) 2023.01.14
Kotlin List  (0) 2023.01.14