[Kotlin] Object 키워드

YounDitt·2020년 9월 27일
0

[Kotlin] 기본

목록 보기
1/3

Object 키워드를 사용하면 클래스를 정의하는 동시에 인스턴스를 생성한다.

Object 사용

1. 객체 선언 (Object declaration)

object MyClass{}

  • 싱글턴 패턴으로 작동한다.
  • 클래스를 정의하고 + 그 클래스의 인스턴스를 만들어 변수에 저장
  • lazy하게 초기화 된다.
  • 생성자를 가질 수 없다.
  • const를 정의할 수 있다.(const는 Top level 또는 object에서만 정의 가능)
  • 내부 메소드는 인스턴스 메소드로 정의된다.
  • 중첩 object선언이 가능하다. (static inner class)
  • 클래스나 인터페이스를 상속할 수 있다.

    👀 싱글턴 패턴
    생성자를 private으로 제한하고, 정적인 필드에 그 클래스의 유일한 객체를 저장하는 패턴

2. 동반 객체 (Companion object)

  • 클래스 인스턴스 없이 어떤 클래스 내부에 접근하고 싶을 때 선언한다. (static)
  • 클래스 당 1개만 생성할 수 있다.
  • 생성자를 가질 수 없다.
  • top level에 선언할 수 없다.
  • 인스턴스 메소드로 정의된다.
  • static으로 선언되는 것이 아닌, 런타임시 실제 객체의 인스턴스로 실행된다.
  • 상속받을 수 있다. (부모와 자식이 같은이름일 경우 자식만 참조할 수 있다)
  • 명명해서 사용할 수 있다.
  • 외부 클래스의 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)를 이용해서만 객체를 생성할 수 있도록 제한할 수 있다.
    • 이미 존재하는 인스턴스에 해당하는 데이터를 전달받으면 새 인스턴스를 만들지 안혹, 캐시에 있는 기존 인스턴스를 반환한다.

3. Object 표현식(무명객체, 익명클래스)

var name = object : Person(){}

  • singleton이 아니다.
  • 메소드 내부에 로컬로 정의하거나 클래스 멤버로 정의할 수 있다.
  • java의 무명클래스, 익명클래스
  • 한번만 사용되고 재사용 되지 않을때
  • 외부클래스의 변수에 접근하여 값을 수정할 수 있다.(java는 final이어야 만 접근 가능)
  • 여러 인스턴스를 구현할 수 있다.

🙋‍♀️ Object class의 property들은 thread-safe한가?

아니요 (Synchronize랑 관련이 없다.)

참고 1
참고 2
참고 3
참고 4

profile
Hello, Android

0개의 댓글