Kotlin은 'object' 키워드를 통해 전통적인 싱글톤 개념을 확장합니다. 이를 통해 다음 패턴을 구현합니다:
object Logger { ... }).싱글톤 객체의 예:
object DatabaseManager { fun connect() { /*...*/ } } DatabaseManager.connect()
객체 표현식:
val listener = object : MouseAdapter() { override fun mouseClicked(e: MouseEvent) { /*...*/ } }
동반 객체:
class User { companion object Factory { fun create(name: String) = User() } } val user = User.create("Ivan")
주요 사항:
동반 객체와 객체 선언의 차이점은 무엇입니까? 그들의 모든 멤버가 정적으로 접근 가능합니까?
답변:
object declaration — 전역 싱글톤으로, 클래스, 인터페이스 또는 외부 수준의 멤버입니다.companion object — 클래스 내의 객체 선언의 특별한 형태로, 그 멤버를 클래스 이름을 통해 정적처럼 호출할 수 있습니다. 그러나 Java와는 달리, 실제로는 싱글톤 객체의 필드입니다.차이점 예:
class A { companion object { fun foo() {} } object NestedObj { fun bar() {} } } A.foo() // OK A.NestedObj.bar() // OK, 하지만 이는 정적 메서드가 아닙니다.
이야기
개발자는 객체 선언 내에 변경 가능한 상태를 정의하고 여러 스레드에서 동기화 없이 사용하기 시작했습니다. 싱글톤 객체가 애플리케이션 전역에서 공유되며 경쟁 조건을 초래할 수 있다는 것을 고려하지 않았습니다.
이야기
클래스 내에서 동반 객체 대신 객체를 선언할 때 정적 메서드 사용이 필요했으나 이를 인스턴스를 통해 호출해야 했고, 이로 인해 가독성이 저하되고 Java에서의 마이그레이션 시 오류가 발생했습니다.
이야기
UI 코드에서 프로그래머는 이벤트 핸들러를 위해 매번 새로운 객체를 객체 표현식을 통해 생성했습니다. 그는 그것이 싱글톤이며 상태가 유지될 것이라고 잘못 생각했고, 결과적으로 라이프사이클 관리 부주의로 인해 메모리 누수가 발생했습니다.