본문 바로가기

kotlin

코틀린 : anonymous class, Companion, Singleton

익명 클래스 : 이름 없는 클래스, 이름 없는 객체

 

클래스의 인스턴스를 여러개 만들 필요가 없는 경우 클래스를 미리 만들어 두는 것은 자원의 낭비

 

클래스의 이름 없이 인스턴스를 바로 생성하기 위한 문법

 

 

val 인스턴스 이름 = object {

   프로퍼티 

   메소드

}

 

=> 클래스 내부에서 생성하면 외부 클래스에서는 익명 클래스의 멤버를 접근 할 수 없음

val 앞에 private 을 추가해서 접근이 가능하도록 할 수 있다!

 


다른 클래스를 상속 받거나 인터페이스를 구현 할 때는 object 다음에 다른 클래스 이름이나 생성자 또는 인터페이스를 기재해서 다른 클래스를 상속 받거나 인터페이스를 구현한 anonymous class 를 만드는 것도 가능

이 문법도 많이 사용 된다.

 

 

어떤 클래스나 인터페이스를 상속 받아서 사용

1.하위 클래스를 만들고 인스턴스을 생성해서 사용 : 인스턴스를 여러개 생성하고자 할 때

2. anonymous class 를 만들어서 사용 : 인스턴스가 한 개만 필요할 때

3. 추상 메소드가 한 개인 경우에는 람다 식을 이용해서 작업 : 인스턴스가 한 개만 필요할 때

 

최근의 android studio 는 옵션 설정에 따라 메소드가 1개인 인터페이스를 anonymous 로 구현 하면 람다로 변환 시켜 버립니다.

interface SomeInterface{
    fun interfaceFun()

    }

    // 인터페이스를 구현한 클래스를 생성
    class SomeInterfaceImpl : SomeInterface{
        override fun interfaceFun() {
            TODO("Not yet implemented")
        }

    }
fun main(args:Array<String>) {

    //안드로이드에서는 여기 인스턴스 생성까지 하고 메소드에 대입
    // 메소드는 자동 호출 되는 경우가 많습니다.
    var obj :SomeInterface = SomeInterfaceImpl()
    obj.interfaceFun()

    //SomeInterface 를 구현한 익명 클래스를 생성
    // annoy를 메소드의 매개 변수로 설정정
   val annoy : SomeInterface = object :SomeInterface{
        override fun interfaceFun() {
            TODO("Not yet implemented")
            println("익명 클래스를 이용한 인터페이스 사용")
        }
    }
    annoy.interfaceFun()

    // 인스턴스 이름 없이 만든 익명 클래스스
   object:SomeInterface {
        override fun interfaceFun() {
            TODO("Not yet implemented")
        }
    }.interfaceFun()
}

 

Companion

내부 클래스를 외부 클래스의 인스턴스 생성 없이 사용하고자 할 때 생성

 

Singleton class

어떤 클래스의 객체를 한 개만 만들어서 사용하는 디자인 패턴

val 인스턴스 이름 : 클래스 이름 = object: 생성자 이름() {

}

 

singleton 디자인 패턴의 클래스는 서버에서 클라이언트의 요청을 처리하는 클래스나 애플리케이션에서는 공통된 프로퍼티를 소유한 클래스나 진입접을 의미하는 클래스를 만들 때 사용

 

interface SomeInterface{
    fun interfaceFun()

    }

    // 인터페이스를 구현한 클래스를 생성
    class SomeInterfaceImpl : SomeInterface{
        override fun interfaceFun() {
            TODO("Not yet implemented")
        }

    }
fun main(args:Array<String>) {

    //안드로이드에서는 여기 인스턴스 생성까지 하고 메소드에 대입
    // 메소드는 자동 호출 되는 경우가 많습니다.
    var obj :SomeInterface = SomeInterfaceImpl()
    obj.interfaceFun()

    //SomeInterface 를 구현한 익명 클래스를 생성
    // annoy를 메소드의 매개 변수로 설정정
   val annoy : SomeInterface = object :SomeInterface{
        override fun interfaceFun() {
            TODO("Not yet implemented")
            println("익명 클래스를 이용한 인터페이스 사용")
        }
    }
    annoy.interfaceFun()

    // 인스턴스 이름 없이 만든 익명 클래스
   object:SomeInterface {
        override fun interfaceFun() {
            TODO("Not yet implemented")
        }
    }.interfaceFun()
}

 

'kotlin' 카테고리의 다른 글

코틀린 : Inline 함수  (0) 2020.10.20
코틀린 : 함수형 프로그래밍  (0) 2020.10.20
코틀린 : inner class - Nested Class  (0) 2020.10.19
코틀린 : 생성과 사용 멤버 등의 개념  (0) 2020.10.19
코틀린 : enum 열거형 상수  (0) 2020.10.19