Kotlin
[Kotlin] 4.4 object 키워드: 클래스 선언과 인스턴스 생성을 한꺼번에 하기
mygomii
2025. 4. 8. 09:00
반응형
- 코틀린에서는 object 키워드가 몇 가지 상황에서 쓰임
- 객체 선언
- 싱글턴 을 정의하는 한 가지 방법
- 동반 객체
- 어떤 클래스와 관련이 있지만 호출하기 위해 그 클래스의 객체가 필요하지는 않은 메서드와 팩토리 메서드를 담을 때 쓰임
- 동반 객체의 멤버에 접근할 때는 동반 객체가 포함된 클래스의 이름을 사용
- 객체 식 : 자바의 익명 내부 클래스 대신 쓰임
4.4.1 객체 선언 : 싱글턴을 쉽게 만들기
- 객체지향 시스템을 설계하다 보면 인스턴스가 하나만 필요한 클래스가 유용한 경우가 많음
- 자바에서는 보통 클래스의 생성자를 private 으로 제한하고 정적인 필드에 . 그클래스의 유일한 객체를 저장하는 싱글턴 패턴 을 통해 이를 구현함
- 코틀린은 객체 선언 기능을 통해 싱글턴 을 언어에서 기본 지원함
- object Payroll { fun test() { // } }
- 객체 선언은 object 키워드로 시작
- 객체 선언에서는 생성자를 쓸 수 없음 → 이유는 일반 클래스 인스턴스와 달리 싱글턴 객체는 객체 선언문이 있는 위치에서 생성자 호출없이 즉시 만들어짐
4.4.2 동반 객체: 팩토리 메서드와 정적 멤버가 들어갈 장소
- 코틀린 클래스 안에는 정적인 멤버가 없음
- 코틀린 언어는 자바 static 키워드를 지원하지 않음, 그 대신 코틀린에서는 패키지 수준의 최상위 함수와 객체 선언을 활용함
- 대부분의 경우 최상위 함수를 활용하는 편을 더 권장함
4.4.3 동반 객체를 일반 객체처럼 사용
- 동반 객체는 클래스 안에 정의된 일반 객체
- 따라서 다른 객체 선언처럼 동반 객체에 이름을 붙이거나, 동반 객체가 인터페이스를 상속하거나, 동반객체 안에 확장 함수와 프로퍼티를 정의할 수 없음
// 1. 인터페이스 정의: 동반 객체가 구현할 인터페이스
interface Factory<T> {
fun create(): T
}
// 2. Person 클래스 정의와 동반 객체 구현
class Person(val name: String) {
// 동반 객체가 Factory<Person> 인터페이스를 구현함
companion object : Factory<Person> {
override fun create(): Person = Person("Default Name")
}
}
// 3. 동반 객체에 대한 확장 함수 정의
fun Person.Companion.greet() {
println("Hello from the Person companion object!")
}
// 4. 동반 객체를 일반 객체처럼 매개변수로 전달하는 함수
fun <T> build(factory: Factory<T>): T = factory.create()
fun main() {
// 동반 객체의 메서드를 직접 호출하여 객체 생성
val person1 = Person.create()
println("person1.name = ${person1.name}")
// 동반 객체에 정의된 확장 함수 호출
Person.greet()
// 동반 객체를 일반 객체처럼 함수의 인자로 전달하여 사용
val person2 = build(Person)
}
4.4.4 객체 식: 익명 내부 클래스를 다른 방식으로 작성
- object 키워드를 싱글턴과 같은 객체를 정의하고 그 객체에 이름을 붙일 때만 사용하지 않음
- 익명 객체를 정의할 때도 object 키워드를 씀
반응형