Kotlin Object keyword (singleton, companion, anonymous inner class)
Object keyword에 대해서 알아보는 포스팅이다.
Object kyword는 다양하게 사용된다.
다양하게 사용이 되지만 객체를 생성한다는 공통점이 있다.
https://play.google.com/store/apps/details?id=com.danchoo.tagalbum&hl=ko
1. singleton
Object keyword는 singleton 객체를 만들때 사용이 된다.
JAVA
비교를 위해 Java에서 사용하는 Singletone객체를 만드는 방법중 한가지인 singleton holder pattern을 간단히 끄적였다.
static 으로 선언된 변수는 한번만 생성을 하는 것을 이용한 방법이다.
쓰레드에 안전하기 때문에 많이 사용하는 것으로 알고있다.
SingletonTest.functionTest() 으로 함수 를 호출할 수 있다.
public class SingletonTest {
private static class SingletonTestHolder {
static final SingletonTest INSTANCE = new SingletonTest();
}
public SingletonTest getInstance() {
return SingletonTestHolder.INSTANCE;
}
public void functionTest() {
}
}
Kotlin
이번엔 Kotlin에서 사용하는 Singleton 객체를 만드는 방법이다.
object키워드를 사용하여 생성했다.
SingletonTest.functionTest() 으로 함수 를 호출할 수 있다.
object SingletonTest {
fun functionTest() {
}
}
Java보다 간단하게 Singleton 객체를 생성할 수 있다.
2. companion (동반 객체)
Kotlin에서 static 변수를 사용해야 하는경우가 있다. 하지만 Kotlin에는 static이 없다.
static변수 대신 사용할 수 있도록 companion객체를 지원한다.
companion객체는 아래와 같은 특징을 지닌다.
- companion객체는 class안에 정의된 일반 객체다.
- companion객체의 사용하는 구문은 static변수와 사용하는 구문과 동일하다. 즉, static변수처럼 사용이 가능하다.
- companion객체는 class안에서 1개만 생성이 가능하다.
- companion객체의 이름을 붙일수도 붙이지 않을수도 있다.
- companion객체의 이름을 붙이지 않았을 경우 Companion으로 자동으로 이름이 생성된다.
- companion객체에서도 인터페이스를 구현할 수 있다.
이름을 붙이지 않았을 경우.
https://smartstore.naver.com/happysiso
class CompanionTest {
companion object {
const val TAG = "companion string value"
fun foo() {
Log.d("CompanionTest", "call foo()")
}
}
}
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
Log.d("MainActivity", CompanionTest.TAG)
CompanionTest.foo()
}
}
출력결과
D/MainActivity: companion string value
D/CompanionTest: call foo()
Log를 출력했을 때 정상적으로 출력이된다.
이름을 붙였을경우
class CompanionTest {
companion object CompanionObject {
const val TAG = "companion string value"
fun foo() {
Log.d("CompanionTest", "call foo()")
}
}
}
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
Log.d("MainActivity", CompanionTest.TAG)
CompanionTest.foo()
Log.d("MainActivity", CompanionTest.CompanionObject.TAG)
CompanionTest.CompanionObject.foo()
}
}
출력결과
D/MainActivity: companion string value
D/CompanionTest: call foo()
D/MainActivity: companion string value
D/CompanionTest: call foo()
Companion객체의 이름을 붙였지만
출력결과를 보면 Companion객체의 이름을 붙여서도 붙이지 않고서도 호출이 가능하다.
3. anonymous inner class (무명 내부 클래스)
anonymous inner class는 Java에서도 주로 많이 사용해왔다. 이벤트 리스터, 콜백 등과 같은 형태로 말이다.
그렇기 때문에 설명대신 예제만 간단하게 포스팅 했다.
button에서 object를 사용해 click listener를 구현했다.
물론 lambda로 변경이 가능하지만 object로 구현을 했다.
button.setOnClickListener(object: View.OnClickListener {
override fun onClick(v: View?) {
}
})
callback을 object로 구현한 예시다.
interface CallbackTestCallback {
fun foo()
fun foo(strValue : String)
}
class CallbackTest {
var callback: CallbackTestCallback? = null
}
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val callbackTest = CallbackTest()
callbackTest.callback = object : CallbackTestCallback {
override fun foo() {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
override fun foo(strValue: String) {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
}
}
}
'Android > Kotlin' 카테고리의 다른 글
[Android] Compose State, Statefull, Stateless, State Hoisting (0) | 2022.03.26 |
---|---|
[Android] Compose 와 선언형 UI (0) | 2022.03.26 |
[Android] Kotlin Property (프로퍼티) (0) | 2019.08.23 |
[Android] Kotlin 지연 초기화(lazy initialization - lateinit, by lazy) (0) | 2019.08.15 |
[Android] Kotlin 시작하기 (0) | 2019.08.15 |
댓글