정적이 문맥에 따라 다른 의미를 갖는 이유는 무엇입니까?
이 질문에 이미 답변이 있습니다.
내가 이해하는대로 :
정적 클래스는 중첩 된 클래스에만 적용되며 중첩 된 클래스에는 외부 클래스에 대한 참조가 없습니다.
정적 필드는 인스턴스가 하나 뿐이고 동일한 클래스의 다른 멤버가 공유한다는 점에서 전역 변수와 비슷합니다.
정적 메서드는 개체가 아직 인스턴스화되지 않은 경우에도 호출 할 수 있음을 의미합니다.
저는 Java 과정에 대한 소개를 듣고 제 지식을 쌓으려고 노력하고 있으며 다른 의미를 나타내는 데 다른 키워드가 사용되지 않은 이유를 파악하려고 노력하고 있습니다.
귀하의 예는 모두 정확하지만 모두 공통된 기능을 공유합니다. 정적이라는 단어는 둘러싸는 인스턴스 가 필요하지 않음을 의미합니다.
둘러싸는 인스턴스없이 정적 내부 클래스 만 존재할 수 있습니다. 예를 들어 클래스
Foo
와 비 정적 내부 클래스가Bar
있는 경우의 인스턴스Bar
외부에의 인스턴스를 만들 수 없습니다Foo
.정적 메서드는 메서드를 호출하는 데 클래스의 인스턴스가 필요하지 않음을 의미합니다. 예를 들어
String.format
실제String
인스턴스 없이 호출 할 수 있습니다 .정적 필드는 클래스의 인스턴스 없이도 존재합니다.
Foo
클래스counter
에 정적 필드 가있는 경우 클래스 의 인스턴스를 인스턴스화하지 않고도 액세스 할 수 있습니다Foo
.
인터페이스에 정적 클래스, 정적 필드 및 정적 메서드가있을 수 있다는 점을 명확하게 고려하십시오. 그러나 이러한 것의 비 정적 버전은 가질 수 없습니다 (개념에 임시로 적용되는 기본 메서드 무시). 이는 인터페이스의 인스턴스를 만들 수 없으므로 둘러싸는 인스턴스가있을 수 없기 때문입니다.
내부 인터페이스, 주석 및 열거 형을 정적으로 선언 할 수도 있습니다.이 경우 키워드는 완전히 중복되지만 (예 : 인터페이스 메서드 추상을 선언하는 것과 유사합니다). 인터페이스, 주석 및 열거 형은 처음부터 둘러싸는 클래스와 관계가 없으므로 정적은 실제로 그것을 제거 할 수 없습니다.
마지막 비잔틴 지점. 정적 가져 오기 ( import static pack.age.Foo.*
)를 수행하면 클래스의 모든 정적 항목 (중복으로 정적 표시 여부에 관계없이 인터페이스, 주석 및 열거 형 포함)에 대한 정규화되지 않은 참조를 만들 수 있습니다.
정적이 문맥에 따라 다른 의미를 갖는 이유는 무엇입니까? 다른 키워드를 사용하지 않은 이유는 무엇입니까?
정말 다른 의미가 없습니다.
당신이 취할 수 static
가 발생할 수있는 곳은 다음을 나타 내기 위해 키워드 :
"특정 사례에 대한 관계 또는 관계없이"
정적 필드는 특정 인스턴스가 아닌 클래스에 속하는 필드입니다.
정적 메서드는 클래스에 정의되어 있으며
this
. 이러한 메서드는 인스턴스가 전달되는 경우를 제외하고는 특정 인스턴스의 인스턴스 필드에 액세스 할 수 없습니다.정적 멤버 클래스는 둘러싸는 클래스에 대한 개념이없고 해당 인스턴스가 생성자에 대한 인수와 같이 전달되지 않는 한 둘러싸는 클래스의 특정 인스턴스와 관계가없는 중첩 클래스입니다.
Cay Horstmann의 Core Java 에서 :
"정적"이라는 용어는 흥미로운 역사를 가지고 있습니다. 처음에는 키워드 static이 C에서 도입되어 블록이 종료 될 때 사라지지 않는 지역 변수를 나타냅니다. 이러한 맥락에서 "정적"이라는 용어는 의미가 있습니다. 변수는 주변에 머물러 있고 블록이 다시 입력 될 때도 그대로 있습니다. 그런 다음 static은 C에서 다른 파일에서 액세스 할 수없는 전역 변수와 함수를 나타내는 두 번째 의미를 얻었습니다. static 키워드는 새 키워드를 도입하지 않기 위해 단순히 재사용되었습니다. 마지막으로 C ++는 관련없는 세 번째 해석에 키워드를 재사용하여 클래스의 특정 개체가 아닌 클래스에 속하는 변수와 함수를 나타냅니다. 이는 Java에서 키워드가 갖는 것과 동일한 의미입니다.
Java는 C ++ 및 C에서 상속됩니다. 이러한 언어 static
에는 두 가지 추가 의미가 있습니다. 로 한정된 지역 변수 (함수 범위) static
는 클래스의 정적 필드와 다소 유사한 의미를 갖습니다. 그러나 Java는 이러한 "정적"컨텍스트를 지원하지 않습니다. static
파일 범위에서 C 또는 C ++에서 와 같이 변수 또는 함수를 한정하는 것은 "Ssh! 링커에게 말하지 마십시오!"를 의미합니다. Java는 이러한 의미도 지원하지 않습니다 static
.
영어에서는 문맥에 따라 같은 단어가 여러 의미를 가질 수 있습니다. 사전에서 일반적으로 사용되는 단어를 찾아 보면 해당 단어의 여러 정의를 찾을 수 있습니다. 일부 단어는 여러 의미를 가질뿐만 아니라 여러 품사를 가지고 있습니다. 예를 들어 "카운터"는 문맥에 따라 명사, 동사, 형용사 또는 부사가 될 수 있습니다. 다른 단어는 문맥에 따라 모순 된 의미를 가질 수 있습니다. "사과"는 "정말 죄송합니다!"를 의미 할 수 있습니다. 또는 "전혀 미안하지 않습니다!"라는 뜻일 수 있습니다. 후자의 대표적인 예는 GH Hardy의 "수학자의 사과"입니다. 이 점에서 영어는 전혀 고유하지 않습니다. 인간이 서로 의사 소통하기 위해 사용하는 모든 언어에도 동일하게 적용됩니다. 인간으로서 우리는 문맥에 따라 의미가 다른 단어에 상당히 익숙합니다.
컴퓨터 언어에 너무 적은 키워드와 너무 많은 키워드 사이에는 본질적인 충돌이 있습니다. Lisp, forward 및 smalltalk는 키워드가 거의없는 매우 아름다운 언어입니다. 여기에는 몇 가지 특수 문자가 있습니다 (예 : lisp의 여는 괄호 및 닫는 괄호). (전체 공개 : 저는이 세 가지 언어 모두로 프로그래밍했고, 정말 좋았습니다.) 여기에 문제가 있습니다. 사실 이후 6 개월 후에 직접 작성한 코드를 읽어보세요. 그 코드를 다른 사람에게 넘겨 주면 더 좋은 행운이 있습니다. 결과적으로 이러한 언어는 지지자의 수가 다소 제한되어 있습니다. 다른 언어는 "키워드"로 엄청나게 많은 단어를 예약합니다. (전체 공개 : 저도 그 언어로 프로그래밍을해야했고, 싫었습니다.)
컴퓨터 언어의 키워드가 너무 적거나 너무 많으면인지 부조화가 발생합니다. 동일한 키워드가 다른 맥락에서 다른 맥락을 갖는 것은 아닙니다. 왜냐하면 인간으로서 우리는 그것에 상당히 익숙하기 때문입니다.
클래스 메서드 및 변수와 마찬가지로 정적 중첩 클래스는 외부 클래스와 연결됩니다. 정적 클래스 메서드와 마찬가지로 정적 중첩 클래스는 둘러싸는 클래스에 정의 된 인스턴스 변수 나 메서드를 직접 참조 할 수 없습니다. 객체 참조를 통해서만 사용할 수 있습니다.
기본적으로 "정적"은 표시된 엔티티가 클래스의 인스턴스에서 분리되었음을 의미합니다. 정적 메서드에는 연결된 인스턴스가 없습니다. 정적 필드는 모든 인스턴스간에 공유됩니다 (본질적으로 인스턴스가 아닌 클래스에 존재).
정적 중첩 클래스는 엔 클로징 인스턴스에서 분리됩니다. 비 정적 메서드와 그 내부에 필드가있는 정적 중첩 클래스의 인스턴스를 가질 수 있기 때문에 약간 혼란 스럽습니다.
정적이라는 단어를 "내가 엔터티, 필드, 메서드 또는 내부 클래스를 선언합니다. 이는 엔 클로징 인스턴스 와 관계가 없습니다. "라고 생각하십시오.
언급 된 모든 정적 사용은 내가보기에 공통점이 있습니다. 모든 경우에 클래스 / 필드 / 메서드가 정적이없는 경우보다 클래스 인스턴스에 덜 묶여 있음을 의미합니다. 특히 정적 필드와 정적 메서드 간의 동등성은 명확해야합니다. 이는 다른 언어의 전역 개체와 유사한 방식으로 해당 필드에서 작동하는 싱글 톤 (클래스 로더 별) 필드 및 메서드를 선언하는 방법입니다.
아마도 중첩 클래스에 정적을 사용하는 것은 분명히 같은 정신이 아니지만 이 구문을 사용하기 위해 포함하는 클래스의 인스턴스가 필요하지 않다는 측면을 공유합니다 .
그래서 저는 이것들이 특히 일관성이 없다고 생각하지 않습니다.
프로그래밍 언어에서 명백하게 다른 목적으로 키워드가 재사용되는 이유에 대한보다 일반적인 질문에 대한 한 가지 대답은 언어가 발전함에 따라 기능이 종종 도입된다는 것입니다. 그러나 사용되었을 수있는 기존 프로그램을 종종 중단하므로 새 키워드를 추가하기가 어렵습니다. 식별자로. 예를 들어, Java const
는 언어에서 사용되지 않더라도 실제로 키워드를 예약하여 향후 확장을 허용합니다!
새 키워드를 추가하는 것을 꺼리면 종종 오래된 키워드가 과부하됩니다.
'programing' 카테고리의 다른 글
Play2 스칼라 템플릿에서 변수 선언 (0) | 2020.12.29 |
---|---|
번들 설치가 공급 업체 / 번들에 gem을 설치하는 이유는 무엇입니까? (0) | 2020.12.29 |
Angular 2 Material Design Components에서 Layout Directive를 지원합니까? (0) | 2020.12.29 |
'Unchecked runtime.lastError : The message port closed before a response was received'크롬 문제를 해결하는 방법? (0) | 2020.12.29 |
"완료 / 돌아 가기"버튼을 눌렀을 때 텍스트 상자 키보드를 숨기는 방법 Xcode 4.2 (0) | 2020.12.28 |