Java에 '서브 클래스 전용'액세스 수정자가없는 이유는 무엇입니까?


17

Java에는 메소드에 사용할 수있는 네 가지 액세스 수정자가 있습니다.

public -모든 클래스에서이 방법을 사용할 수 있습니다.

protected -동일한 패키지의 클래스와 모든 패키지의 서브 클래스가이 메소드를 사용할 수 있습니다.

private -이 클래스 만이 메소드를 사용할 수 있습니다.

no modifier ( "package private")-동일한 패키지의 클래스 만이 메소드를 사용할 수 있습니다.

자주 일어나는 일은 모든 서브 클래스가 사용할 수있는 수퍼 클래스에 유용한 메소드를 원한다는 것입니다. 그러나 다른 클래스 가이 메소드에 액세스하는 것은 의미가 없으며 어떤 의미에서는 캡슐화를 깨뜨릴 수 있습니다.

따라서이 유용한 메소드를 수퍼 클래스 public또는 에서 선언해야합니다 protected.이 패키지는 적어도 패키지의 다른 모든 클래스에 노출됩니다. 서브 클래스에서만 사용하기위한 것이지만.

subclasses-onlyJava에 액세스 수정자가 없는 이유가 있습니까? 나에게는 매우 이상해 보인다. 뭔가 빠졌습니까?

또한 subclasses-only액세스 수정자는 변수를 서브 클래스에만 노출하려는 경우에도 유용합니다. 나에게 많은 일이 일어난다.

답변:


10

protected 수정자를 사용 하고 상위 클래스와 해당 서브 클래스 만 동일한 패키지에 있도록함으로써 서브 클래스 전용 수정자를 에뮬레이트 할 수 있기 때문 입니다.

패키지는 응집력 측면에서 큰 프로젝트를 구성하는 데 도움이 될뿐만 아니라 동일한 패키지의 클래스에 일부 수준의 커플 링이있을 수 있음을 보여주기 때문에 실제로 모범 사례입니다.


15
"부모 클래스와 그 서브 클래스 만 동일한 패키지에 포함 시키도록 강요"-이제 어떻게해야할까요?!
— JimmyB

1
그리고 패키지 전용 액세스 수정자를 사용할 수 없습니다. 그리고 어리석은 양의 패키지가 필요합니다. 이것은 실용적인 해결책이 아닙니다.
— user253751

13

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

추가 복잡성은 비용이 들지 않는다는 판단이 필요하다고 생각합니다.

모든 언어 기능에는 비용이 있습니다 : 새로운 프로그래머에게 가르치기 위해; 문서에서; 컴파일러, JVM 및 개발 도구에서 구현할 때 프로그램 정확성에 대한 추론; 미래 언어 진화를 제한하는 것; 그리고 더. 언어 기능은 서로 상호 작용하며 잠재적으로 N 2 상호 작용 과 상호 작용합니다.

Java 프로그래머와 Java 스펙을 읽은 비율은 몇 퍼센트입니까? 나는 그것이 적은 비율이라고 확신합니다. 이것은 우리가 신뢰할 수있는 이해와 엔지니어링 제품을 위해 더 간단한 언어를 주장합니다.

private protected패키지가 모듈화의 주요 단위이기 때문에이 기능 의 이점 은 적습니다.


1
1.0 이전의 Java 버전이 있었습니까?
— 마크 이스리

1
@MarkYisri Java는 1995 년 퍼블릭 알파 및 베타 버전을 공개했으며 이에 대해 약간의 코드가 작성되었습니다.
— David Moles

4

액세스 제어는 클래스 방법 및 특성에 대해 클래스와 함께 작업하는 가상 개발자의 커버리지의 결과로 생각할 수 있습니다 ...

당신 : 당신이 x를하고 싶다고 말하면, doX 메소드를 호출합니다. DEV : 더 말해주세요 .. 인수가 무엇입니까?

이것은 공개입니다 ...

당신 : doX 안에서 나는 전화를합니다. DEV : 너무 많은 정보, 저는 그것에 관심이 없습니다. 사용 방법을 알고 싶습니다. 다른 걸 말해줘

이것은 비공개입니다 ...

당신 : 서브 클래 싱 할 때 doX와 doY는 doIt을 호출합니다.

이것은 보호됩니다 ...

당신 : 나는 한 시간 안에 휴가를 떠날 예정입니다. 앞으로 6 개월 동안 갈 것입니다. 보스는이 강아지가 당신의 것이라고 말합니다! 안녕. DEV : 기다리지 말고 다 말해줘 ...

패키지입니다.

YOU : doItWhen 메소드는이 클래스에서만 호출되며 10 년 동안 변경되지 않았습니다. 그것은 ... DEV : 우와, 우리는 50 분까지입니다. 다음 속성으로 더 빨리 이야기하십시오.

이것은 비공개로 보호됩니다 ...


3

이것은 이미 존재합니다. 보호되어 있습니다.

패키지 내에 존재하는 클래스를 제어 할 수 있습니다. 패키지에 다른 클래스가없고 주어진 변수 또는 메소드가 보호 된 경우 '하위 클래스 만'입니다.

즉, 패키지 내에 어떤 클래스가 있는지 제어 할 수 있습니다. 보호 된 메소드 또는 변수 만 사용하도록 선택할 수 있습니다.


3
예약 된 특정 시스템 패키지 외에도 클래스를 추가하지 않으려는 패키지 중 하나라도 패키지에 클래스를 추가 할 수 없습니까?
— David Moles

@David IIRC 예, 그러나 다른 JAR에서 패키지 필드에 액세스 할 수 없으므로 동일한 패키지에 넣더라도 다른 JAR에 있으면 액세스 할 수 없습니다. 그러나 동일한 JAR 내에서 언급하는 경우 예, 액세스 할 수 있지만 문제의 JAR을 수정할 수 있으면 액세스 수정자를 쉽게 변경할 수 있습니다.
— Pokechu22

1
@ Pokechu22 보호를 받으려면 JAR을 확실하게 봉인 해야한다고 생각 하지만 좋은 지적입니다.
— David Moles
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.