반응형
companion object
자바의 클래스를 코틀린으로 변경해 보자.
public class JavaPerson {
private static final int MIN_AGE = 1;
public static JavaPerson of(String name) {
return new JavaPerson(name, MIN_AGE);
}
private String name;
private int age;
private JavaPerson(String name, int age) {
this.name = name;
this.age = age;
}
}
class Person private constructor(
var name: String,
var age : Int,
) {
}
코틀린에는 static 키워드가 존재하지 않는다. 대신 companion object라는 블록으로 감싸 static 한 변수와 함수를 선언한다.
companion object {
private const val MIN_AGE = 1
fun of(name: String): Person {
return Person(name, MIN_AGE)
}
}
companion object는 클래스와 동행하는 유일한 오브젝트라고 생각하자.
그렇다면 const라는 키워드는 무엇일까?
보통 val이라는 키워드를 사용하면 런타임에 값이 할당된다. 하지만 const라는 키워드를 사용하게 되면 컴파일 시 값이 할당된다.
또한 companion object는 하나의 객체이다. 그렇기 때문에 이름을 부여할 수도 있고, interface를 구현할 수도 있다.
companion object Factory : Log{
private const val MIN_AGE = 1
fun of(name: String): Person {
return Person(name, MIN_AGE)
}
override fun log() {
TODO("Not yet implemented")
}
}
이름이 없다면 다음과 같이 companion 오브젝트에 접근할 수 있다.
Person.Companion.of()
즉 이름을 사용하지 않는다면 Companion이라는 이름이 생략된 것이다. 자바처럼 사용하기 위해선 @JvmStatic이라는 어노테이션을 붙여줘야 한다.
이 경우는 Factory라는 이름을 부여했기 때문에 다음과 같이 코드를 작성할 수 있다.
Person.Factory.of("name");
싱글톤.
public class JavaSingleton {
private static final JavaSingleton INSTANCE = new JavaSingleton();
private JavaSingleton() { }
public static JavaSingleton getInstance() {
return INSTANCE;
}
}
코틀린에서는 다음과 같이 구현한다.
object Singleton{
var a: Int = 0;
}
익명 클래스
익명 클래스라는 건 클래스를 상속받은 구현체나 인터페이스를 일회성으로 사용할 때 쓰는 클래스이다.
fun main() {
moveSomething(object : Movable{
override fun move() {
TODO("Not yet implemented")
}
override fun fly() {
TODO("Not yet implemented")
}
})
}
private fun moveSomething(movable: Movable) {
movable.move()
movable.fly()
}
익명클래스라는 개념은 동일하지만 new Movable로 익명클래스를 만들던 자바와 달리 object : Movable {}을 통해
익명 클래스를 구현한다.
반응형
댓글