익명 클래스 : 이름 없는 클래스, 이름 없는 객체
클래스의 인스턴스를 여러개 만들 필요가 없는 경우 클래스를 미리 만들어 두는 것은 자원의 낭비
클래스의 이름 없이 인스턴스를 바로 생성하기 위한 문법
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 |