코틀린에서 클래스를 정의하는 키워드는 class
이다.
object
키워드는 코틀린에서 클래스 정의하는 방법중 하나로 클래스를 정의하면서 객체를 생성한다.
하지만 object
로 클래스를 정의하면 Singleton 패턴이 적용되어 객체가 한번만 생성되도록 한다.
자바에서는 싱글턴 패턴을 적용하기 위해 꽤 많은 코드를 작성해야 하지만 코틀린에서는 object
를 사용하면 이런 boilerplate를 작성하지 않아도 된다.
Singleton으로 사용하는 방법 외에도, object
는 익명객체를 생성할 때도 사용되기도 한다.
코틀린에서는 다음과 같이 object를 정의할 수 있다.
object CustomClassByObject {
var customValue: Int = 20
fun printCustomValue() {
println("customValue is : $customValue")
}
}
위 코드를 자바로 디컴파일하면 다음과 같다.
public final class CustomClassByObject {
private static int customValue;
@NotNull
public static final CustomClassByObject INSTANCE;
public final int getCustomValue() {
return customValue;
}
public final void setCustomValue(int var1) {
customValue = var1;
}
public final void printCustomValue() {
System.out.println("customValue is : " + customValue);
}
private CustomClassByObject() {
}
static {
CustomClassByObject var0 = new CustomClassByObject();
INSTANCE = var0;
customValue = 20;
}
}
여기서 싱글턴 패턴임을 확인할 수 있다.
1. 클래스의 생성자를 private로 선언하여 외부에서 호출할 수 없도록 제한하고 있다.
2. 클래스의 인스턴스를 담은 변수를 static final로 선언
3. 인스턴스의 생성과 변수의 초기화는 static 초기화 블록에서 수행한다.
인스턴스 생성 없이 클래스의 멤버에 접근 가능
--> 인스턴스에선 접근 불가
class Person(val name: String){
companion object {
var age: Int = 20
var city: String = "Seoul"
}
}
fun main(){
val p = Person("kim")
val age = p.age // ERROR
//인스턴스를 생성하지 않고 프로퍼티에 접근
val _age = Person.age
val city = Person.city
}