object
키워드는 기본적으로 2가지 방법으로 사용된다.object
expressionobject 키워드를 이용해서 익명 클래스 객체를 생성 할 수 있다.
- 익명 클래스의 타입을 명시하지 않으면 Any 클래스를 상속한다.
- 익명 클래스의 타입을 명시하면 해당 클래스를 상속한다.
open class Person(private val name: String, private val age: Int) {
open fun introduce(): String {
return "안녕하세요 $name 입니다, ${age}살입니다."
}
}
fun main() {
// Any 를 상속하는 익명 클래스 객체
val unknown = object {
val field = "unknown"
override fun toString(): String {
return "Any 를 상속하는 익명클래스 입니다."
}
}
// Person 을 상속하는 익명 클래스 객체
val person: Person = object: Person("jo", 22) {
override fun introduce(): String {
return "안녕하세요 저는 Person 의 익명 객체입니다."
}
}
}
obeject
declarationobject
키워드를 이용해서 싱글톤 객체를 정의할 수 있다.
- class
대신 object
키워드를 사용하여 클래스를 정의하면서 해당 클래스의 싱글톤 인스턴스를 생성한다.
- 클래스의 형태와 비슷하지만 싱글톤이기 때문에 생성자를 따로 정의할 필요가 없다.
- 싱글톤이기 때문에 따로 객체를 생성할 필요가 없고 선언한 객체 이름으로 바로 접근이 가능하다.
object Pikachu {
private val name: String = "피카츄"
fun introduce() {
println("I am $name, electric shock!!")
}
}
fun main() {
Pikachu.introduce() // I am 피카츄, electric shock!!
}
companion object
클래스 안에서 싱글톤인 object
클래스 객체를 정의하는 방법 중 하나, ‘동반자 객체’ 라고도 한다.
싱글톤 객체의 클래스 이름을 정의할 필요가 없다.
중첩 클래스이다. (inner class
가 아니니까)
- 싱글톤 객체의 클래스 이름이 없기 때문에 외부 클래스명을 통해서 companion object
의 멤버에 바로 접근하는 것처럼 사용할 수 있다.
class Person(val name: String, val age: Int) {
fun introduce() {
println("내 이름은 $name 입니다, $age 살 입니다.")
}
companion object {
val address: String = "서울"
fun showAddress() {
println("나는 $address 에 살고 있습니다.")
}
}
}
fun main() {
// 싱글톤 객체의 클래스 이름이 없기 때문에 companion object 의 멤버에 바로 접근할 수 있다.
Person.address // 서울
Person.showAddress() // 나는 서울에 살고 있습니다.
}
자바의 static
과 다른 점
companion object
의 멤버에 바로 접근하는 것처럼 사용할 수 있다.’ 는 특징 때문에 자바의 static
과 비슷하다고 생각할 수 있지만 다르다.static
은 클래스의 멤버를 정적으로 선언하는 것이다.companion object
는 클래스 내부에 싱글톤인 중첩 클래스 객체가 존재하는 것이다.companion object
자체가 하나의 싱글톤 객체라는 것이 단순히 클래스의 멤버를 정적으로 선언하는 자바의 static
과 본질적으로 다른 점이다.