Object 키워드를 사용하면 클래스를 정의하는 동시에 인스턴스를 생성한다.
object MyClass{}
static inner class
)👀 싱글턴 패턴
생성자를 private으로 제한하고, 정적인 필드에 그 클래스의 유일한 객체를 저장하는 패턴
👀 팩토리 메소드 패턴
객체를 생성하기 위해 인터페이스/추상클래스를 정의하지만 실제로 어떤 클래스의 인스턴스를 생성할지 결정하는 것은 서브 클래스에 맡기는 패턴.class Car private constructor(val oil: String) { companion object { fun createCar(oil:String) = Car(oil) } } fun main() { val myCar = Car.createCar("diesel") println(myCar.oil) }
- Car는 private constructor를 가지기 때문에 외부에서 생성할 수 없다.
- companion object는 외부 클래스(Car)의 private property(oil)에 접근이 가능하다.
- 따라서 외부에서는 companion으로 제공되는 팩토리 메소드(createCar)를 이용해서만 객체를 생성할 수 있도록 제한할 수 있다.
- 이미 존재하는 인스턴스에 해당하는 데이터를 전달받으면 새 인스턴스를 만들지 안혹, 캐시에 있는 기존 인스턴스를 반환한다.
var name = object : Person(){}
🙋♀️ Object class의 property들은 thread-safe한가?
아니요 (Synchronize랑 관련이 없다.)