코틀린 객체와 동반 객체

코틀린 객체(Object)와 동반 객체(Companion Object)

코틀린의 object싱글톤 객체를 쉽게 생성할 수 있게 해준다.
또한 companion object를 사용하면 자바의 static 멤버처럼 클래스 내부에서 공유 데이터를 다룰 수 있다.


object 기본 개념

object는 프로그램 전체에서 단 하나의 인스턴스만 존재하는 객체를 정의한다.
즉, 별도의 new 생성 없이 바로 사용할 수 있다.

object Logger {
fun log(message: String) {
println("로그: $message")
}
}

사용 예시

Logger.log("프로그램 시작") // 출력: 로그: 프로그램 시작

object는 싱글톤

object로 선언된 객체는 항상 단 하나의 인스턴스만 유지된다.

object Counter {
var count = 0
fun increment() = count++
}
Counter.increment()
Counter.increment()
println(Counter.count) // 출력: 2

object 표현식 (익명 객체)

object를 식(expression)으로 사용하면 익명 클래스(Anonymous Class) 를 간단히 만들 수 있다.

val listener = object {
val id = 1
fun onClick() {
println("버튼 클릭됨 (id=$id)")
}
}
listener.onClick()

object 표현식 + 인터페이스 구현

익명 객체는 인터페이스나 클래스를 상속해 임시 구현체를 만들 때 유용하다.

interface ClickListener {
fun onClick()
}
val buttonListener = object : ClickListener {
override fun onClick() {
println(“버튼 클릭 이벤트 발생”)
}
}buttonListener.onClick()

companion object (동반 객체)

클래스 내부에 companion object를 선언하면,
해당 클래스의 모든 인스턴스가 공유하는 정적 멤버처럼 동작한다.
자바의 static 키워드를 대체하는 기능이다.

class MathUtil {
companion object {
const val PI = 3.14159
fun square(num: Int): Int {
return num * num
}
}
}

사용 예시

println(MathUtil.PI) // 출력: 3.14159
println(MathUtil.square(4)) // 출력: 16

companion object 이름 지정

companion object는 이름을 지정할 수도 있고, 생략해도 된다.

class User {
companion object Factory {
fun create(name: String): User {
return User()
}
}
}
val user = User.create(“재은”)

companion object와 상수

상수를 정의할 때는 const val을 사용한다.
이는 런타임이 아닌 컴파일 시점에 값이 결정된다.

class Config {
companion object {
const val APP_VERSION = "1.0.0"
}
}

companion object 확장 함수

클래스 외부에서 companion object에도 확장 함수를 추가할 수 있다.

class Product {
companion object {}
}
fun Product.Companion.createDefault() = Product()val product = Product.createDefault()

object 선언과 companion object 비교

구분 키워드 인스턴스 수 사용 위치 특징
object 단독 1개 (싱글톤) 클래스 밖 전역 객체
companion object 클래스 내부 1개 (클래스 공유) 클래스 안 static 대체 기능

object + interface = 객체 선언 구현체

object 선언은 인터페이스를 즉시 구현한 싱글톤 형태로도 사용 가능하다.

interface Printable {
fun print()
}
object Printer : Printable {
override fun print() {
println(“프린터 작동 중…”)
}
}Printer.print()

object 상속

objectopen 클래스를 상속하거나 인터페이스를 구현할 수 있다.

open class Animal {
open fun sound() = println("동물 소리")
}
object Dog : Animal() {
override fun sound() = println(“멍멍!”)
}

object의 초기화

객체 선언 시 즉시 초기화 블록(init)을 사용할 수 있다.

object AppConfig {
init {
println("AppConfig 초기화됨")
}
}

활용 예시

  1. Logger / Config / DatabaseManager 같은 전역 단일 인스턴스 관리

  2. Factory 패턴 구현 (Companion Object 활용)

  3. Event Listener 임시 구현 (object 표현식)

  4. 정적 상수 관리 클래스 (const + companion object 조합)



게시됨

카테고리

작성자

댓글

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다