728x90
Object
object 키워드를 써서 특별한 단일 인스턴스를 만들 수 있다. 싱글톤(singleton) 패턴 인스턴스를 의미한다.
- 싱글톤을 쉽게 만들 수 있는 키워드
- 여러 스레드에서 동시에 사용하려고 하더라도 딱 하나의 인스턴스만 생성된다.
- 생성자 사용불가
- 프로퍼티, 메서드, 초기화 블록은 사용 가능
- 클래스를 정의함과 동시에 객체를 생성한다.
Object 식
object 식을 활용해서 속성들을 담고 있는 오브젝트를 쉽게 만들 수 있으며, 이렇게 간단히 할 때는 클래스를 선언할 필요 없이 오브젝트를 하나 만들어서 그 안에 멤버들을 선언해 두고 접근해 쓸 수 있다.
fun main() {
rentPrice(10, 2, 1)
}
fun rentPrice(standardDays: Int, festivityDays: Int, specialDays: Int){
val dayRates = object {
var standard: Int = 30 * standardDays
var festivity: Int = 50 * festivityDays
var special: Int = 100 * specialDays
}
val total = dayRates.standard + dayRates.festivity + dayRates.special
print("Total price: $$total") //Total price: $500 //함수호출 해당오브젝트 생성
}
Object 단일 인스턴스
object 선언을 할 수도 있다. 식의 형태가 아니라면, 변수에 값을 대입하는 용도로 쓸 수 없다. 별도의 인스턴스를 만들지 않고, 해당 오브젝트의 멤버에 곧바로 접근할 수 있다.
fun main() {
println(Counter.count) /*최초 초기화 생성 시점에 최초 초기화
0*/
Counter.countUp()
Counter.countUp()
println(Counter.count) //2
}
object Counter{
init {
println("최초 초기화")
}
var count = 0
fun countUp(){
count++
}
}
싱글톤으로 생성하면 객체를 한 번만 생성해서 계속 사용하기 때문에 초기화는 한번만 진행 됨 (값 공유)
(만약 class로 만들었다면 각각 다른 객체가 생성됨)
다른 클래스나 인터페이스도 상속가능하다.
Object는 안드로이드에서 에러코드를 정의할 때 많이 사용
Companion Objects (동반 객체)
클래스 정의 안쪽에 선언하는 동반 오브젝트(객체)를 만들 수 있다. 문법적으로 자바의 정적(static) 메서드와 비슷하게 클래스 이름을 통해서 해당 오브젝트 멤버에 접근할 수 있다.
- Java의 static 과 동일한 역할
- 클래스 내에 하나만 생성할 수 있음
fun main() {
Book.NAME //인스턴스를 만들지 않아도 변수나 상수에 접근가능
Book.create() //인스턴스를 아직 만들지 않아도 클래스 메소드처럼 사용가능
}
class Book{
companion object{
const val NAME = "name"
fun create() = Book()
}
}
자바의 static 과 동일하기 때문에 인스턴스를 만들지 않아도 메소드나 프로퍼티에 바로 접근이 가능하다.