[java] 정적 메소드가 메소드로 간주되는 이유는 무엇입니까?

코스에 대한 일부 코드에 대한 설명을 작성 중이며 실수로 단어 methodfunction상호 교환 적으로 사용 하고 있습니다. 나는 돌아가서 문구를 고치기로 결정했지만 내 이해에 구멍이났다.

내가 이해 한 바에 따르면, 서브 루틴은 function클래스의 인스턴스에 영향을 미치지 않는 경우 (효과는 명시적인 입력 / 출력으로 제한됨)이고 method클래스의 인스턴스에서 작동하는 경우입니다 ( 불완전한 인스턴스에 대한 부작용).

이 주제에 대한 좋은 토론이 있습니다 . 허용 된 답변의 정의에 따르면 method인스턴스는 암시 적으로 전달되지 않으며 인스턴스의 멤버에 액세스 할 수 없으므로 정적 은 실제로 함수 여야합니다.

그러나 이것을 염두에두고 methods실제로 정적이어야하지 않습니까?

그들의 정의에 따라 그들은 클래스의 특정 인스턴스에 대해 행동하지 않습니다. 그들은 관계 때문에 수업에 “연결”되어 있습니다. 정적 서브 루틴을 “메소드”( Oracle , Fredosaurus , ProgrammingSimplified ) 로 지칭하는 잘 보이는 사이트를 보았 으므로 모두 용어를 간과하거나 뭔가 빠졌습니다 (내 추측은 후자입니다) .

올바른 문구를 사용하고 싶습니다.
아무도 이것을 정리할 수 있습니까?



답변

8.4.3.2의 인용문 이 도움 이 될 수 있습니다.

선언 된 메소드를 클래스 메소드static 라고합니다 .

선언되지 않은 메소드를 인스턴스 메소드 […] static라고합니다 .

  • 클래스 메소드 : 클래스와 연관됩니다.
  • 인스턴스 메소드 : 인스턴스와 연관됩니다.

Java는 단지 “객체 지향”을 원합니다. 또한 정적 메소드는 상태를 포함 할 수있는 주변 범위에 액세스 할 수 있습니다. 어떤면에서 클래스는 객체 자체와 같습니다.


답변

간단한 대답은 Java가 모든 것을 “방법”이라고 부르기로 결정했을 때 이론적 컴퓨터 과학의 기능과 방법의 구별에 신경 쓰지 않았다는 것입니다.


답변

정적 메소드는 정확히 기능하지 않으며 차이는 미묘하지만 중요합니다.

주어진 입력 매개 변수 만 사용하는 정적 방법 본질적으로 함수입니다.

그러나 정적 메소드는 정적 변수 및 기타 정적 함수 (정적 변수를 사용하여)에 액세스 할 수 있으므로 정적 메소드 는 기본적으로 stateless 함수와 기본적으로 다른 상태 를 가질 수 있습니다 . (부록 : 프로그래머는 종종 “함수”를 정의로 사용하는 것이 그렇게 엄격하지는 않지만 컴퓨터 과학의 엄격한 기능은 입력 매개 변수에만 액세스 할 수 있습니다). 따라서 정적 필드에 액세스하는 경우를 정의하면 정적 메소드가 항상 함수라고 말하는 것이 유효하지 않습니다.

“정적 방법”의 사용을 정당화하는 또 다른 차이점은 C에서 정의 할 수있는 전역 함수와 전역 변수는 어디에서나 액세스 할 수 있다는 것입니다. 정적 메서드가 포함 된 클래스에 액세스 할 수 없으면 메서드도 액세스 할 수 없습니다. 따라서 “정적 방법”은 전역 기능과 달리 설계 상 범위가 제한됩니다.


답변

Java에서 사용자 정의 클래스는 실제로 java.lang.Class 서브 클래스의 인스턴스입니다.

이런 의미에서 정적 메소드 개념적 클래스의 인스턴스에 첨부됩니다. java.lang.Class 서브 클래스의 인스턴스에 첨부됩니다.

이를 염두에두고 “클래스 메소드”(Java의 정적 메소드의 대체 이름)라는 용어가 이해되기 시작합니다. “클래스 메소드”라는 용어는 Objective C, Smalltalk 및 JLS 등 여러 곳에서 찾을 수 있습니다.


답변

컴퓨터 과학 기능 에서 정적 방법으로 명확하게 매핑됩니다. 그러나 클래스의 “메소드”는 “멤버”(필드 멤버, 메소드 멤버)와 같은 약간 일반적입니다. 같은 문구가 있습니다

데이터 멤버와 메서드 멤버에는 .x와 .x ()가 공존 할 수있는 두 개의 별도 네임 스페이스가 있습니다.

그 이유는 철학자 루트비히 위트 겐슈 타인 (Ludwig Wittgenstein)이 말했듯이 언어는 상황이 다른 도구입니다. “방법”은 위의 인용에서 “회원”을 분류하는 좋은 이름입니다.


답변

당신의 생각은 옳고 말이됩니다. Java 커뮤니티에서 용어가 확립되지 않았습니다. 용어가 존재하는 이유를 이해하는 데 도움이되는 내부 내용을 설명하겠습니다.

Java는 클래스 기반 객체 지향 언어입니다. 메소드는 항상 클래스 또는 인스턴스의 멤버입니다 (이는 다른 프로그래밍 언어에도 유효한 일반 명령문입니다). 우리는 클래스와 인스턴스가 모두 객체라고 생각합니다.

인스턴스 방법 (동적)

클래스에서이 메소드를 직접 호출 할 수 없으므로 인스턴스를 작성해야합니다. 각 인스턴스는 해당 방법을 참조합니다. 서브 클래 싱 할 때와 정확히 동일한 메소드 서명으로 메소드 정의를 겹쳐 쓸 수 있습니다. 즉 참조는 다른 메소드 (서명은 동일하지만 메소드 본문이 다를 수 있음)를 가리 킵니다. 이 방법은 동적입니다.

수업 방법 (정적)

클래스에서 직접이 메소드를 호출 할 수 있습니다. 즉, 해당 클래스의 인스턴스를 작성할 필요가 없습니다. 전체 프로그램에서 해당 메소드의 글로벌 정의는 하나만 있습니다. 전체 프로그램에 대해 하나의 정의 만 유효하므로 메소드가 정적으로 선언 된 경우 정확히 동일한 메소드 서명을 겹쳐 쓸 수 없습니다. 이 메소드는 클래스 객체 자체의 멤버이며 인스턴스는 해당 메소드에 대한 모든 동일한 고유 (및 수정) 참조를 갖습니다.


답변

스칼라 를 니모닉으로 사용하는 또 다른 용어는 다음과 같습니다
. 스칼라 object에는 묵시적으로 정의 된 클래스의 싱글 톤 인스턴스가 있습니다.1 .

정의에 따라, object 메소드의 서브 루틴을 클래스의 단일 인스턴스에서 작동 할 때 호출 할 수 있습니다 .
또한 객체 는 클래스 A를 정의 하고 객체 A의 모든 메소드를 클래스 A의 정적 메소드 (Java와의 인터페이스 용)로 작성합니다 [2] .

따라서 Java 클래스 A의 정적 메소드는 스칼라 싱글 톤 인스턴스와 동일한 멤버에 액세스한다고 정의 할 수 있으며, 정의 에 따라 클래스 A의 (정적) 메소드 라고 할 수 있습니다 .