Kotlin 의 object 키워드

JoJo Green·2023년 1월 12일
0
post-thumbnail

object


  • object 키워드는 기본적으로 2가지 방법으로 사용된다.
  • object expression
    • object 키워드를 이용해서 익명 클래스 객체를 생성 할 수 있다.
      - 익명 클래스의 타입을 명시하지 않으면 Any 클래스를 상속한다.
      - 익명 클래스의 타입을 명시하면 해당 클래스를 상속한다.

      open class Person(private val name: String, private val age: Int) {
      
          open fun introduce(): String {
              return "안녕하세요 $name 입니다, ${age}살입니다."
          }
      }
      
      fun main() {
          // Any 를 상속하는 익명 클래스 객체
          val unknown = object {
              val field = "unknown"
      
              override fun toString(): String {
                  return "Any 를 상속하는 익명클래스 입니다."
              }
          }
      
      		// Person 을 상속하는 익명 클래스 객체
          val person: Person = object: Person("jo", 22) {
              override fun introduce(): String {
                  return "안녕하세요 저는 Person 의 익명 객체입니다."
              }
          }
      }
  • obeject declaration
    • object 키워드를 이용해서 싱글톤 객체를 정의할 수 있다.
      - class 대신 object 키워드를 사용하여 클래스를 정의하면서 해당 클래스의 싱글톤 인스턴스를 생성한다.
      - 클래스의 형태와 비슷하지만 싱글톤이기 때문에 생성자를 따로 정의할 필요가 없다.
      - 싱글톤이기 때문에 따로 객체를 생성할 필요가 없고 선언한 객체 이름으로 바로 접근이 가능하다.

      object Pikachu {
          private val name: String = "피카츄"
      
          fun introduce() {
              println("I am $name, electric shock!!")
          }
      }
      
      fun main() {
          Pikachu.introduce() // I am 피카츄, electric shock!!
      }
  • companion object
    • 클래스 안에서 싱글톤인 object 클래스 객체를 정의하는 방법 중 하나, ‘동반자 객체’ 라고도 한다.

    • 싱글톤 객체의 클래스 이름을 정의할 필요가 없다.

      • 원한다면 이름을 정의할 수도 있다.
    • 중첩 클래스이다. (inner class 가 아니니까)
      - 싱글톤 객체의 클래스 이름이 없기 때문에 외부 클래스명을 통해서 companion object 의 멤버에 바로 접근하는 것처럼 사용할 수 있다.

      class Person(val name: String, val age: Int) {
      
          fun introduce() {
              println("내 이름은 $name 입니다, $age 살 입니다.")
          }
      
          companion object {
              val address: String = "서울"
      
              fun showAddress() {
                  println("나는 $address 에 살고 있습니다.")
              }
          }
      }
      
      fun main() {
      		// 싱글톤 객체의 클래스 이름이 없기 때문에 companion object 의 멤버에 바로 접근할 수 있다.
          Person.address // 서울
          Person.showAddress() // 나는 서울에 살고 있습니다.
      }
    • 자바의 static 과 다른 점

      • ‘외부 클래스명을 통해서 companion object 의 멤버에 바로 접근하는 것처럼 사용할 수 있다.’ 는 특징 때문에 자바의 static 과 비슷하다고 생각할 수 있지만 다르다.
      • 자바의 static 은 클래스의 멤버를 정적으로 선언하는 것이다.
      • companion object 는 클래스 내부에 싱글톤인 중첩 클래스 객체가 존재하는 것이다.
        • companion object 자체가 하나의 싱글톤 객체라는 것이 단순히 클래스의 멤버를 정적으로 선언하는 자바의 static 과 본질적으로 다른 점이다.

0개의 댓글