Kotlin – 정적 변수와 메서드

동적 초기화 없이 고정된 변수나 객체인 컴패니언 객체를 살펴보겠습니다.


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 액세스 시 인스턴스가 생성됩니다.

핵심점 – 부모 클래스를 상속하는 하위 클래스를 만들지 않고도 메서드를 새로 재정의하고 사용할 수 있습니다.

이번에 이번에는 정적 변수와 방법에 대해 조사했다.