[java] Java에 “개인 보호”액세스 수정자가 있습니까?

일부 참조는 Java에서 private protected(둘 다 단어로) 액세스 수정자를 참조하는 것을 보았습니다 .

private protected someMethod() {

}

이것을 참조하여 찾은 페이지 중 하나가 여기 있습니다 . 저의 학교 수업은이 액세스 수정자를 언급했습니다 (존재한다고 말했습니다). 그러나이를 사용하면 Java 언어에 오류가 발생합니다.

변수와 메소드를 모두 사용해 보았지만 존재하지 않는다고 확신하지만 발생한 일에 대한 설명을 원합니다. 고려 된 후 거부 되었습니까? 아니면 최신 버전의 Java에서 제거 되었습니까?

편집 : protected키워드에 대한 정보를 찾지 못했습니다 .



답변

액세스 수정 자 제거

Java에는 원래 private protected수정자가 있었지만 JDK 1.0.2 (최초의 안정적인 버전, 현재 알려진 Java 1.0) 에서 제거되었습니다 . JDK 1.0.2 ( herehere ) 에 대한 몇 가지 자습서 는 다음을 말합니다.

참고 : Java 언어의 1.0 릴리스는 5 가지 액세스 레벨을 지원했습니다 private protected. 위에 나열된 4 가지 더하기 private protected액세스 레벨 1.0 이상의 자바 이상 버전에서 지원되지 않습니다; Java 프로그램에서 더 이상 사용하지 않아야합니다.

SoftwareEngineering.SE에 대한 또 다른 답변은 다음과 같습니다.

Java에는 원래 그러한 수정자가있었습니다. private protectedJava 1.0에서 작성 되었지만 제거되었습니다.

이제 Java Version History를 살펴보십시오 .

JDK 1.0

첫 번째 버전은 1996 년 1 월 23 일 에 릴리스되었으며 오크라고합니다. 첫 번째 안정 버전 인 JDK 1.0.2는 Java 1이라고합니다.

이것으로부터, 버전 1.0.2에 관한 튜토리얼은 언어가 오크 (Oak)라고 불리는 첫 번째 버전 인 JDK 1.0을 참조하지만 SoftwareEngineering.SE에있는 튜토리얼은 Java라는 JDK 1.0.2를 의미합니다. 1.0이 제거되었습니다.

이제 Java 1.0 documentation 에서 검색하려고하면 찾을 수 없습니다. 앞에서 언급 한 것처럼 JDK 1.0.2에서 제거 되었기 때문에 Java 1.0이라고합니다. 이것은 게시 한 링크의 “최종 수정”시간을 볼 때 다시 입증됩니다. 게시 한 링크는 1996 년 2 월에 마지막으로 수정되었습니다. Java 1.0 / JDK 1.0.2 는 1996 년 2 월 이후private protected 에 릴리스되었으며 1996 년 8 월 사양에 따라 릴리스 되었습니다 .

제거 사유

일부 소스는 이유를 설명하는 private protected등, 중 하나. 인용 :

개인 보호 란 무엇입니까?

초기에 Java 언어는 특정 조합의 수정자를 허용했습니다 private protected. 의미는 private protected가시성을 서브 클래스로 엄격하게 제한하고 패키지 액세스를 제거 하는 것이 었습니다. 이것은 나중에 다소 일관성이없고 지나치게 복잡하다고 간주되어 더 이상 지원되지 않습니다. [5]

[5] protectedJava의 Beta2 릴리스에서 수정 자의 의미가 변경되었으며 그 private protected조합이 동시에 나타났습니다. 그들은 잠재적 인 보안 허점을 패치했지만 많은 사람들을 혼란스럽게했습니다.

또한 SoftwareEngineering.SE는 불일치 및 추가 복잡성에 대한 가치가 없으므로 초기에 제거되었다고 말함으로써이를 지원합니다.

해석

이 모든 것에 대한 나의 해석은 아마도 오크 시절에 둘 다 공존 할 수 있었기 때문입니다 (따라서 조합). 이후 protected‘의 의미를 변경했다 1 , 수에 대한 필요성이 있을지도 모른다 privateprotected동시에. 소개가 너무 복잡 해져서 가치가 없었으므로 결국 삭제되었습니다. Java 1.0 / JDK 1.0.2가 롤백 될 때 삭제되었으며 문서에서 찾을 수 없습니다.


1 에서 오크 언어 사양 , 섹션 4.10, 변수와 메소드에 대한 액세스 ,이 기본 수정 이었다는 것을 알 수있다 protected:

기본적으로 클래스의 모든 변수와 메소드는 보호됩니다 .

이것은 오늘날의 기본 패키지 액세스와는 상당히 다릅니다. 이것은 너무 제한적이고 너무 관대 private protected했기 때문에 의 필요성에 대한 길을 닦았을 것입니다 .privateprotected


답변

혼란스럽고 불분명 한 이야기가 있습니다.

하나는 여러분이 넣은 프린스턴 출처와 MIT 자료실 에서 다음과 같이 말합니다.

참고 : Java 언어의 1.0 릴리스는 5 가지 액세스 레벨 (위에 나열된 4 가지 + 개인 보호)을 지원했습니다. 개인 보호 액세스 레벨은 1.0보다 높은 Java 버전에서는 지원되지 않습니다. Java 프로그램에서 더 이상 사용하지 않아야합니다.

그러나이 기능은 여기 또는 여기 에서 Java 1.0 공식 문서에 지정되어 있지 않습니다 .

공식 언어 사양이 1996 년 8 월이고 프린스턴 소스가 1996 년 2 월 에 마지막으로 수정 되었기 때문에이 기능이 공식 1.0 버전으로 바뀌지 않았다고 생각 합니다.

추신 : 이전 버전의 아카이브를 제거 한 것에 대한 오라클의 부끄러움.


답변

귀하의 질문에 제공 한 링크 가 클래스 중 하나 private protected에서 사용 되었다고 제안한 것처럼 요소에 액세스 할 수는 있지만의 다른 클래스에서는 숨길 수 있습니다 .element/membersubclasspackage

Java에 비해 C++요소를 캡슐화하는 추가 개념이 있으며 이는 패키지 입니다. 하나는 내에서 또는 다른 패키지 외부 액세스 이해한다 Java이 같은 이러한 접근 지정자에 올 때 private, public& protected.

왜 사용했는지 설명했습니다. 현재 버전이 아님


답변

아니, 당신은 둘 다 사용할 수 없습니다 함께. 당신의 튜토리얼은 이상합니다. 당신은 소위 패키지 개인 또는 ot6 참조 패키지 보호 액세스라고합니다. acc6 규정자가 명시 적으로 작성되지 않은 경우 사용 가능한 기본 액세스입니다.privateprotected


답변

개인 범위는 기존 클래스를 사용합니다. 여기서 보호는 다른 패키지의 클래스에 의해 확장 된 패키지 및 클래스 내에서 액세스 할 수 있습니다.

변수 / 메소드가 패키지 외부에서 액세스되기를 원한다면, protected / public 또는 private 또는 다른 액세스 지정자로 정의해야합니다.

보호 된 메소드는 일반적으로 외부 패키지와 하위 클래스 내에서 액세스 할 수 있습니다. 즉, 클래스는 각 클래스를 확장하여 보호 된 정의 된 메소드를 사용할 수 있어야합니다.

개인 메소드 / 변수는 클래스 내에서 범위를 가지므로 클래스 외부에서 액세스 할 수 없습니다.

따라서 동시에 개인 보호를 정의 할 수 없습니다!


답변