Kotlin에 정적 ​​키워드가없는 이유는 무엇입니까? 개체에서 제공합니다. 컴패니언 객체가 더 나은 대안을

Kotlin은 주로 Java의 드롭 인 대체품으로 알려져 있지만 잘 알려진 Java 구문 인 static키워드를 제거 합니다. 대신 클래스 수준의 기능은 주로 컴패니언 개체에서 제공합니다.

컴패니언 객체가 더 나은 대안을 제공하는 정적 메소드 및 필드의 문제점은 무엇입니까? 나는 이론적 근거에 대해 혼란스러워서 문서에서 설명을 찾을 수 없었습니다.



답변

스칼라는 클래스 레벨 선언을 ‘Singleton’객체로 대체합니다. 이것의 주요 장점은 모든 것이 객체라는 것입니다. Java에서 정적 멤버는 오브젝트 멤버와 매우 다르게 취급됩니다. 즉, 인터페이스 구현 또는 클래스 ‘인스턴스’를 맵에 넣거나 Object를 사용하는 메소드에 매개 변수로 전달하는 등의 작업을 수행 할 수 없습니다. 동반자 객체는 이러한 것들을 허용합니다. 그것이 장점입니다.


답변

Kotlin 참조 문서 에서 인용 :

컴패니언 객체의 멤버는 다른 언어의 정적 멤버처럼 보이지만 런타임시 여전히 실제 객체의 인스턴스 멤버이며 예를 들어 인터페이스를 구현할 수 있습니다.

Kotlin 디자이너가 이것을 Java의 정적 멤버보다 이점으로 보는 것처럼 매우 들립니다.

또한 Java 상호 운용성 및 정적 멤버 에 대한 부분에서는 주석이있을 때 컴패니언 객체를 사용하여 정적 멤버처럼 효과적으로 동작하는 멤버를 만드는 방법에 대해 설명합니다 @JvmStatic.


답변

코 틀린은 객체 지향 언어입니다. 객체 지향 언어에서, 무언가가 없는 객체 인 것은이다 매우 마비 제한. 클래스는 객체가 아니지만 객체는 객체 (duh!)이므로 질문은 오히려 언어 동반 객체를 사용 하지 않는 이유는 무엇입니까?

또 다른 측면은 간단합니다. 인스턴스 멤버가있는 객체를 가질 수 있는데 왜 인스턴스 멤버가있는 객체와 정적 멤버가있는 클래스가 있습니까?

많은 스몰 토크 파생 언어에서 사용되는 대안은 클래스 자체를 객체로 만드는 것입니다. 예를 들어 스몰 토크 클래스는 메타 클래스 의 병렬 계층 구조의 인스턴스입니다 . 루비에서 클래스는 클래스의 인스턴스입니다 Class(그렇습니다. 그것은 Class그 자체의 인스턴스 임을 의미 합니다). 이 경우, “클래스 메소드”는 실제로 클래스 메타 클래스의 일반적인 인스턴스 메소드입니다. 왜이 디자인이 Java에서 선택되지 않았는지 (Smalltalk와의 관련성으로 인해) 선택되지는 않았지만 유형 시스템을 단순화하는 것과 관련이있을 수 있습니다 (개체로 클래스가있는 대부분의 언어는 동적 언어).


답변