안드로이드 앱(Kotlin|Java)/[2025~] 안드로이드 앱

Part0_Ch02_06 object, companion object

heylo 2025. 1. 24. 18:58

 

1) Object

Object : 클래스를 정의함과 동시에 객체를 생성

  • 싱글톤을 쉽게 만들 수 있는 키워드
  • 생성자 사용 불가
  • 프로퍼티, 메서드, 초기화 블록은 사용 가능
  • 다른 클래스나 인터페이스를 상속받을 수 있음

 

1-1) 생성자 사용 불가

오브젝트에는 생성자 사용 불가

 

 

1-2) 싱글톤 / 생성과 동시에 초기화 / 프로퍼티, 메서드, 초기화 블록 가능

fun main() {
    // 클래스였다면 : Counter()
    // 오브젝트이면 생성과 동시에 초기화됨
    println(Counter.count)

    Counter.countUp()
    Counter.countUp()

    println(Counter.count) // 2 ( 싱글톤 )

}

object Counter {
    init {
        println("카운터 초기화")
    }

    var count = 0 // 초기화
    fun countUp() {
        count++
    }
    fun countDown() {
        count--
    }

}

 

 

1-3) 클래스 / 인터페이스 상속 가능

fun main() {
    Counter.hello()

}

object Counter : Hello() {
    init {
        println("카운터 초기화")
    }

    var count = 0 // 초기화
    fun countUp() {
        count++
    }
    fun countDown() {
        count--
    }

}

open class Hello() {
    fun hello() = println("Hello")

}

 

 

1-4) 사용

에러 코드 정의할 때

해당 인스턴스를 매번 새로 만들 필요가 없으므로


2) Companion Object

Companion Object: 동반객체

  • 클래스 내에 하나만 생성할 수 있음
  • Java 의 static 과 동일한 역할

 

 

2-1) Java 의 static 과 동일한 역할

// Companion 을 통해 import
// Companion 을 통해서 가져왔다.
import com.example.partzero.Book.Companion.NAME

fun main() {
    Book.create() // 인스턴스를 만들지 않아도
                  // 클래스 메소드처럼 사용 가능
    NAME // Companion 을 통해 import
}

class Book {
    companion object { // 실제로는 object Companion 임
        // 코틀린은 자바와 다르게
        // static final (constant value 로 선언)이 없는 대신
        // companion object 사용
        
        const val NAME = "hello" // constant value 는
        // 카멜 규칙이 아닌, capital letter 및 snake rule

        // factory pattern
        fun create() = Book()
    }
}

 

 

2-2) companion object 의 이름 ( Novel )

import com.example.partzero.Book.Novel.NAME

fun main() {
    NAME
}

class Book {
    companion object Novel{ 
        const val NAME = "hello"
        fun create() = Book()
    }
}

import com.example.partzero.Book.Novel.NAME

Novel 이라는 Object 를 통해서 NAME 에 접근함

static 과 완전히 동일하지는 않고 Object 의 개념을 가져옴.

해당 Companion object를 포함한 클래스를 선언할 때 Object 도 함께 선언이 된다.

 

 

2-3) 클래스 내에 하나만 생성할 수 있음

한 클래스 내에 이름이 같은 Object 를 여러 개 만들 수 없는 것과 동일

Only one companion object is allowed per class