Kotlin에 정적 ​​키워드가없는 이유는 무엇입니까?


29

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

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


4
스칼라에서 프로그래밍하는 사람으로서 관객을 관찰하는 것 : 컴패니언 객체는 정적 및 비 정적 메소드에 대한 코드를 분리하고 정적 컨텍스트에서 다른 클래스 또는 인터페이스를 확장 할 수 있으며 컴패니언 객체를 변수에서 참조 할 수 있습니다. 그래도 kotlin에 어떻게 매핑되는지 확실하지 않음
Phoenix

정적 메서드와 컴패니언 개체에 비해 큰 이점이없는 것은 무엇입니까?
Tanner Swett 1

이것은 이유가 아니고 더 많은 관찰이지만, 초보자 프로그래머 static가 Java 에서 키워드를 발견 하자마자 객체 지향 프로그래밍을 배우지 않았기 때문에 프로그램의 모든 구석으로 즉시 전파되는 것을 보았습니다. .
Score_Under

답변:


30

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


2
그건 좋은 지적이야. 그리고 나는 항상 비슷한 행동을하는 싱글 톤과 스태틱이 있지만 이상하지 않은 객체 만 있으면 그 개념의 이상 함을 없애는 것이 이상하다고 생각했습니다.
user1446

1
그리고 이것이 바로 Java에서 정적 메소드를 정의하는 대신 정적으로 구성된 상태 비 저장 객체에 메소드를 정의하는 것을 선호하는 이유입니다.
candied_orange

13

Kotlin 참조 문서 에서 인용 :

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

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

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


6

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

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

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


1
"또 다른 측면은 단순하다. 왜 인스턴스 멤버가있는 오브젝트를 가질 수 있는데 인스턴스 멤버가있는 오브젝트와 정적 멤버가있는 클래스가 있는가?" 어떤 사람들은 특별한 경우 나 관용구를위한 임시 구성을 갖는 것이 장점이라고 생각합니다.
Giorgio

1
Java 그 패턴을 구현한다고 주장하는 것은 적어도 논쟁의 여지가 있다고 생각합니다 . 예를 들어, MyStaticClass일부 static멤버 MyStaticClass.class가있는 Class경우 해당 클래스 의 인스턴스 를 가져 오기 위해 참조 할 수 있습니다 . 그런 다음 리플렉션을 사용하여 static멤버 에 액세스하거나 호출 할 수 있습니다 . 그것은 것을 여전히 사실 static회원이 실제로 개체 인스턴스에 연결되지 않는다 (적어도 개념적으로,하지 않도록 자바가 실제로 내부적으로 무엇을). 그러나 수락 된 답변에서 제기 된 한도 중 일부가 엄격하게 적용 되지는 않습니다 .
aroth
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.