안드로이드 앱(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