-
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 } }