IT/Kotlin
[Kotlin] object 키워드
forest-33
2024. 4. 12. 22:44
- 코틀린에서 object 키워드는 여러 가지 의미로 사용됨
싱글톤 객체 생성
- object 키워드는 클래스를 정의하면서 동시에 해당 클래스의 단일 인스턴스를 생성하는 데 사용
- 이를 통해 해당 클래스의 단일 인스턴스가 어디서든 접근 가능하고, 여러 스레드에서 안전하게 사용
object Singleton {
fun doSomething() {
println("Doing something...")
}
}
fun main() {
Singleton.doSomething()
}
익명 객체 생성
- object 키워드는 클래스나 인터페이스를 선언할 때도 사용
- 이 경우 익명 클래스나 익명 객체를 생성하여 해당 클래스나 인터페이스를 구현할 수 있음
interface OnClickListener {
fun onClick()
}
fun setOnClickListener(listener: OnClickListener) {
// Listener 처리
}
fun main() {
// 익명 객체를 사용하여 OnClickListener 인터페이스를 구현
setOnClickListener(object : OnClickListener {
override fun onClick() {
println("Button clicked!")
}
})
}
동반객체 (Companion object)
- 클래스 내부에 정의되며, 그 클래스의 인스턴스와 무관하게 해당 클래스와 관련된 메서드와 프로퍼티를 가질 수 있음.
- 이는 Java의 정적 메서드와 유사한 개념이지만, 더 많은 기능을 제공함.
동반 객체의 선언
- 동반 객체는 클래스의 인스턴스와 관련된 멤버가 아니라 클래스 자체에 속하는 멤버를 정의
class MyClass {
companion object {
// 동반 객체의 멤버 정의
fun companionFunction() {
println("Companion function called")
}
}
}
동반 객체의 사용
MyClass.companionFunction() // 출력: Companion function called
동반객체 - 팩토리 메서드 제공
- 팩토리 메서드 제공
- 팩토리 패턴 구현
- 정적 메서드의 개념을 대체
- 인스턴스 생성 및 관련 로직의 그룹화
class Car(val color: String) {
companion object {
fun createCar(color: String): Car { // 팩토리 메서드 제공
return Car(color) // 인스턴스 생성 로직이 클래스 내부에 캡슐화
}
}
}
fun main() {
val redCar = Car.createCar("red") // 외부에서는 팩토리 메서드를 통해서만 인스턴스 생성
println(redCar.color) // 출력: red
}
동반객체 vs 패키지 수준 함수
동반 객체
- 캡슐화: 동반 객체는 클래스 내부에 존재하기 때문에 해당 클래스의 내부 상태에 접근할 수 있음. 이는 동반 객체가 클래스의 인스턴스를 조작하는 데 유용한 메서드를 제공할 때 유용
- namespace 구분: 동반 객체는 클래스의 일부로 취급되기 때문에 클래스 이름으로 접근할 수 있음. 이는 동반 객체의 이름 공간을 클래스의 이름 아래로 분리하여 관련 기능을 그룹화하는 데 유용
패키지 수준 함수
- 간결성: 패키지 수준 함수는 클래스에 바운드되지 않으므로 클래스 이름을 통한 접근 없이 직접 호출할 수 있음. 이는 코드를 더 간결하게 만들 수 있음.
- 유연성: 패키지 수준 함수는 특정 클래스에 종속되지 않으므로 다른 클래스에서도 자유롭게 사용할 수 있음. 이는 함수를 재사용하거나 다른 클래스에 쉽게 적용할 수 있도록 함.
- 패키지 수준 함수 예제
// Util.kt 파일
package com.example.util
fun greet() {
println("Hello, World!")
}
fun calculateSum(a: Int, b: Int): Int {
return a + b
}
// Main.kt 파일
package com.example
import com.example.util.greet
import com.example.util.calculateSum
fun main() {
greet() // 출력: Hello, World!
val result = calculateSum(3, 5)
println("Sum: $result") // 출력: Sum: 8
}