Java에 "개인 보호"액세스 수정자가 있습니까?


160

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

private protected someMethod() {

}

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

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

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


60
발견 한 페이지는 "최종 수정"HTTP 헤더를 설정합니다 : Mon, 1996 년 2 월 26 일 18:14:04 GMT!
G. Sylvie Davies

6
@ 조 가능하면 질문을 속임수로 끝내는 것이지만 결합 된 수정 자에 대해서는 아무것도 보지 못합니다 private protected.
jpmc26

2
@ jpmc26 "Java 1.0에는 개인 보호 된 추가 액세스 수정자가있었습니다."를 참조하십시오. 그러나 여기에 대한 대답은 역사를 훨씬 더 잘 요약 한 것입니다.
Joe

2
@Joe이 private protected답변 에는 실제로 언급 된 내용이 있지만 그 이유와 그 원인,이 질문에 대한 설명은 없습니다.
m0skit0

3
학교에서 OP가 이것을 배우고 있다고 무서워하는 사람이 있습니까? ... 문서에서 삭제 된지 20 년이 넘었습니까? 흥미로운 역사 수업이지만, 자바 1이 명명되기 전에 사람들이 제거 된 것을 배우는 것이 조금 무섭다.
XaolingBao

답변:


191

액세스 수정 자 제거

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


그다지 가치가 없다고 확신합니다.하지만 언제 일어 났는지 기억합니다 (어렸을 때 프로그래밍하고 어떤 이유로이 새로운 Java에 매우 빠져있었습니다). 원본을 찾을 수없는 동안-일을 기억합니다. 내가 따라 갔을 때 정확히 이렇게
Benjamin Gruenbaum

Early on, the Java language allowed for certain combinations of modifiers, 그것은 "개인 보호"이상의 것을 의미합니까?
XaolingBao

@XaolingBao 물론, 하나의 접근자는 accesor가 아닙니다 :) 제공된 링크는 귀하의 질문을 명확히해야합니다.
m0skit0

52

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

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

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

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

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

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


내 링크가 동일한 콘텐츠의 이전 버전입니까? : D

누락 된 정보는 입력 한 메모와 관련이있을 수 있습니다.

@AndrewLi 어디에도 주어진 참고 문헌에서 안정적인 것으로 언급되지 않았습니다 . 그리고 실제 1.0이있을 때 1.0.2를 1.0으로 지칭하는 것은 혼란 스럽습니다.
m0skit0

10

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

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

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


내 링크는 메소드 액세스입니다. 회원 액세스가 아닙니다.

1
@MarkYisri는 멤버 변수에도 동일하게 사용할 수 있습니다. 액세스 지정자는 메소드뿐만 아니라 멤버 변수에서도 작동합니다. 즉, 액세스 지정자는 캡슐화 개념이며 멤버 메소드에 적용하는지 또는 멤버 변수에 적용하는지에 관계없이 캡슐화 개념입니다. C ++ 및 java를 포함한 거의 모든 객체 지향 언어에 적용됩니다.
programmer_of_the_galaxies

자, 그러나 튜토리얼은 (흥미롭게) 변수에 대한 개인 보호를 언급하지 않습니다. 잡고 변수 페이지가 있는지 보자 ...


0

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


3
나는 당신이 그것을 사용할 수 없다는 것을 알고있었습니다. 나는 그것이 일어난 일을 알고 싶습니다. 다른 대답은 더 잘 설명합니다.

4
자바 개발이 약 1 년 전에 시작되었다는 점을 감안할 때, 1996 년부터의 링크입니다. 링크의 내용은 그렇게 이상하지 않습니다 : D
Keiwan

6
Theach 문서의 날짜에 대한 좋은 지적. 나는 myou 기차가 도착하는 동안 질문에 대답하고 전화를 사용하여 그것을 썼다. 그래서 대답이 충분히 탈선하지 않으면 미안하다. 그냥 도와주고 싶었다
AlexR

6
맞춤법 실수가 @AlexR 탈선하는 것은 실제로 말장난 (기차)입니다. 방금 알았습니다. : D

1
@ MarkYisri, 자세한. 전화를 사용하여 글을 쓰는 것이 SO에 대한 답변을 게시하는 가장 좋은 방법은 아닙니다.
AlexR

-2

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

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

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

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

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


이것은 질문에 대답하지 않았습니다. 왜 작동하지 않는지 물었습니다. 다른 답변은 질문에 대한 답변을 훨씬 잘 수행합니다.

더 명확히하기 위해 더 이상 작동하지 않는다는 것을 알고 있지만 다른 답변은 과거와 과거에 발생한 이유와 결과를 설명합니다. 당신은하지 않습니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.