동적 초기화 없이 고정된 변수나 객체인 컴패니언 객체를 살펴보겠습니다.
1. 정적 변수와 컴패니언 객체
– 동적 초기화없이 사용할 수있는 개념으로 Java에서는 static 변수 또는 객체라고합니다.
코트린에서는 이것을 컴페니언 오브젝트라고 부른다.
– 프로그램 실행시 고정적으로 가지는 메모리로 오브젝트 생성 없이 사용이 가능.
(단, 자주 사용되지 않는 변수나 객체를 만들면 메모리가 낭비될 수 있다.
)
– 클래스 내부에서 컴패니언 객체를 작성하게 되면 고정 클래스를 가지게 되는 개념이라고 생각하면 간단하다.
class Person {
var id: Int = 0
var name: String = "Youngdeok"
companion object {
var language: String = "Korean"
fun work() {
println("working...")
}
}
}
– 고정 static 내부 클래스와 같이 정의되고 language 와 work() 메소드는 단일 (싱글톤) 액세스 요소로 객체 생성을 필요로 하지 않는다.
* 싱글 톤 : 전역 변수를 사용하지 않고 하나의 객체 만 생성하고 생성 된 객체를 어디에서나 참조 할 수 있습니다.
디자인 패턴의 일종입니다.
2. 개체와 싱글톤
– 상속할 수 없는 클래스에서 내용이 변경된 개체를 생성할 때 사용합니다.
– Java의 경우 익명 내부 클래스를 사용하여 새 클래스를 선언하고 처리하지만,
코트린은 객체 표현식과 객체 선언으로이 경우를보다 쉽게 처리합니다.
객체 선언 방법은 액세스 시 객체가 생성되는 개념입니다.
따라서, 생성자 호출을 별도로 하지 않고, 선언부에는 주/부 생성자를 사용할 수 없습니다.
open class Superman() {
fun work() = println("Taking photos")
fun talk() = println("Talking with people.")
open fun fly() = println("Flying in the air.")
}
fun main() {
val pretendedMan = object: Superman() { // (1) object 표현식으로 fly()구현의 재정의
override fun fly() = println("I'm not a real superman. I can't fly!
")
}
pretendedMan.work()
pretendedMan.talk()
pretendedMan.fly()
}
– 메인 함수 내에서 pretend d 변수는 superman() 을 상속하여 무언가를 정의하고 싶지만 위 클래스와 다른 내용으로
Superman 생성자를 통한 것이 아니라 객체 식으로 구성된 코드입니다.
– Superman() 클래스내 fly() 메소드는 open 로 오버라이드(override) 가능한 메소드가 된다.
– pretend dMan 액세스 시 인스턴스가 생성됩니다.
핵심점 – 부모 클래스를 상속하는 하위 클래스를 만들지 않고도 메서드를 새로 재정의하고 사용할 수 있습니다.
이번에 이번에는 정적 변수와 방법에 대해 조사했다.