ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 람다식, 싱글턴
    카테고리 없음 2024. 3. 18. 19:35

    1. 람다식

    람다식은 코드를 더욱 간결하게 만들기 위한 목적을 가지고 있다. 메소드에서 중괄호를 치지 않고 바로 값을 리턴하거나, 메소드를 선언하지 않고 중괄호를 이용해 로직을 작성할 수 있다.

    fun add(n1:Int, n2:Int, n3:Int) = (n1+n2+n3)/3 // 람다식 1
    
    var average = {n1:Int, n2:Int, n3:Int -> (n1+n2+n3)/3}
    print(average(10,20,30)) // 20

     

    2. 싱글턴 : 클래스의 객체는 단 한개!

    코틀린은 companion, object 키워드로 싱글턴을 구현할 수 있다.

    싱글턴은 두가지로 쓰일 수 있다. 첫번째로, 클래스에 대한 객체를 생성하지 않고 바로 클래스에 접근해서 메소드를 사용하는 방식이다. 이때는 앞에 class 대신 object로 선언한다. 또는, object 말고 class 로 선언하고 싶으면 내부에 companion object 를 써야 한다.

    fun main() { Bird.fly("참새") }
    
    // 방식 1)
    object Bird {
        fun fly(name: String) {
            println("${name}가 날아요~")
        }
    }
    
    // 방식 2)
    class Bird {
    	companion object {
        	fun fly(name:String) {
            	println("${name}가 날아요~")
            }
        }
    }

     

    두번째로는, 클래스에 대해서 하나의 객체를 서로 공유하는 것이다. 이때는 공유 객체라는 의미에서 companion object를 선언해준다. 메모리 전역에서 "유일한 객체" 임을 보장할 수 있고, 위치정보도 고정된다. 이때, singletonObject1 과 singletonObject2 는 서로 다른 객체처럼 보이지만, 사실상 하나의 객체를 공유하고 있다. 따라서, singletonObject2 가 클래스 내부의 변수 값을 바꿨을 때, 객체는 하나이기 때문에 singletonObject1의 변수값도 변경된다.

    fun main() {
        var singletonObject1 = MySingletonClass.getInstance()
        singletonObject1.setNum(5)
        println("첫번째 객체의 num 값 : ${singletonObject1.getNum()}") // 5
    
        var singletonObject2 = MySingletonClass.getInstance()
        singletonObject2.setNum(10)
    
        println("${singletonObject1.getNum()}") // 10
    }
    
    class MySingletonClass private constructor() {
    
        private val num:Int = 0
        
        companion object { // 싱글턴 선언부 → 해당 getInstance() 함수로 만들어지는 객체는 공유객체이다.
            private var instance: MySingletonClass? = null
    
            fun getInstance(): MySingletonClass {
                if (instance == null) {
                    synchronized(this) {
                        instance = MySingletonClass()
                    }
                }
                return instance!!
            }
        }
    
        fun setNum(num:Int) {
            this.num=num
        }
    
        fun getNum() : Int {
            return this.num
        }
    }

     

Designed by Tistory.