Java에서 공개, 보호, 패키지 개인 및 개인의 차이점은 무엇입니까?


3171

자바에서, 즉 기본 (개인 패키지), 액세스 한정자의 각각의 사용시기에 대한 명확한 규칙이있다 public, protected그리고 private하는 동안, class그리고 interface상속을 처리?


161
private패키지 내의 다른 클래스에서 숨 깁니다. public패키지 외부의 클래스에 노출됩니다. 서브 클래스로만 제한된 protected버전입니다 public.
Museful

87
@Tennenrishin — 아니오; C ++과 달리 Java protected에서는 메소드를 전체 패키지에서 액세스 할 수도 있습니다. Java의 가시성 모델에서이 어리 석음은의 목표를 어 깁니다 protected.
Nicolas Barbulesco

35
@Nicolas 전체 패키지에서 또는없이 패키지에 액세스 할 수 있습니다 protected. 액세스로 수정 , 모든 protected수행은 패키지 외부 서브 클래스에 노출하는 것입니다.
Museful

15
@tennenrishin-음, 그것이 니콜라스가 말한 것입니다 ... 그리고 당신은 지금 그것을 반복하고 있습니다. 당신이 원래 말했다 것은이었다 protected- 그리고 나는 인용 - 보호 때문에 자신의 입장에서 사실이 아니다 에고, 그것은하지 않습니다 (또한 전체 패키지를 통해 액세스 할 수 있습니다 '서브 클래스에서만 제한 공개 버전은' 제한 서브 클래스에 대한 액세스를. )
luis.espinal

10
또한 Java의 보호 된 액세스 모드가 바보라는 점에서 Nicolas에 동의합니다. Java가 수평 (격자) 및 수직 액세스 제한 규정자를 평탄화했습니다. 기본 범위는 격자가 패키지 인 수평 / 격자 제한입니다. 격자는 온 세상이되는 또 다른 수평 적 제한입니다. 비공개 및 (C ++) 보호는 수직입니다. 예를 들어, protected-package실제로 필요한 경우가 드문 경우이지만 protectedC ++ 버전의 protected와 동일하게 유지하면서 크로스 컷 액세스 권한이 있으면 더 좋을 것 입니다.
luis.espinal

답변:


5636

공식 튜토리얼 이 유용 할 수 있습니다.

______________________________________________________________
| │ 클래스 │ 패키지 │ 서브 클래스 │ 서브 클래스 │ 월드 |
| │ │ │ (같은 pkg) │ (diff pkg) │ |
| ───────────┼┼───────┼─────────┼──────────┼────────── ──┼──────── |
| 공개 │ + │ + │ + │ + │ + | 
| ───────────┼┼───────┼─────────┼──────────┼────────── ──┼──────── |
| 보호 │ + │ + │ + │ + │ | 
| ───────────┼┼───────┼─────────┼──────────┼────────── ──┼──────── |
수정 자 없음 │ + │ + │ + │ │ | 
| ───────────┼┼───────┼─────────┼──────────┼────────── ──┼──────── |
| 비공개 │ + │ │ │ │ |
| ___________ | _______ | _________ | __________ | __________ | ________ |
 + : 접근 가능 공백 : 접근 불가능

5
private동일한 소스 파일에서 클래스 / 정적 메소드로 멤버를 보거나 사용할 수 있으므로 위의 테이블이 올바르지 않습니다 .
미야모토 우사기

5
보호 된 멤버는 동일한 패키지의 서브 클래스에서만 액세스 할 수 있지만 다른 패키지의 서브 클래스에서는 액세스 할 수 없습니다. 위의 표에 수정이 있어야합니다
niks

2
세계는 당신의 프로젝트 안에 있습니다 . 나는 더 설명해야한다. 라이브러리는 프로젝트 내에 있으며 라이브러리를 작성하는 경우 이러한 공용 클래스 및 메소드도 노출됩니다. 따라서 프로젝트 내에서 말하는 것은 약간 벗어납니다. "사용하는 모든 것"은 더 나은 설명입니다.
adprocas

3
예를 들어, 내가 가지고 MyClass있고하고 AnotherClass extends MyClass있는 중이면에서 모든 보호 및 공용 메소드와 속성에 액세스 할 수 있습니다 AnotherClass. 내가 할 경우 MyClass myClass = new MyClass();AnotherClass어딘가에 -하자의 생성자를 말한다 - 그것은 다른 패키지에있는 경우 난 단지 public 메소드에 액세스 할 수 있습니다. 그렇게하면 = new MyClass() { @Override protected void protectedMethod() { //some logic } };보호 된 메소드에 액세스 할 수 있지만 확장과 동일하지만 대신 인라인으로 액세스 할 수 있습니다.
adprocas

3
불행하게도,이 답변은 지나치게 단순화 된 것입니다. 현실은 좀 더 복잡합니다. 특히 고려할 때 protected(실제로 이해하기 어려운 어려운 수정 자입니다. 대부분의 사람들 protected은 실제로 의미하지 않는 것을 알고 있다고 생각하는 사람들 ). 또한 보헤미안은 지적했듯이 질문에 대답하지 않습니다 . 각 액세스 수정자를 언제 사용할 지에 대해서는 아무 것도 말하지 않습니다 . 제 생각에는,이 답변이없는 아주 나쁜 downvote에 충분하지만 가깝습니다. 그러나 4000 개가 넘는 공감 율? 어떻게 이런일이 일어 났습니까?
Dawood ibn Kareem

483

(주의 사항 : 저는 Java 프로그래머가 아니며 Perl 프로그래머입니다. Perl에는 공식적인 보호 기능이 없으므로 문제를 잘 이해하고 있습니다.)

은밀한

당신이 생각하는 것처럼, 그것이 선언 된 클래스 만이 그것을 볼 수 있습니다.

개인 패키지

선언 된 패키지 에서만보고 사용할 수 있습니다 . 이것은 Java의 기본값입니다 (일부는 실수로 간주 됨).

보호

패키지 프라이빗 +는 서브 클래스 또는 패키지 멤버가 볼 수 있습니다.

공공의

누구나 볼 수 있습니다.

출판

내가 통제하는 코드 밖에서 볼 수 있습니다. (Java 구문은 아니지만이 토론에서 중요합니다).

C ++은 "friend"라는 추가 레벨을 정의하며 이에 대해 더 잘 알지 못합니다.

언제 무엇을 사용해야합니까? 전체 아이디어는 정보를 숨기는 캡슐화입니다. 가능한 한 사용자가 수행 한 작업에 대한 세부 정보를 숨기려고합니다. 왜? 따라서 나중에 변경할 수 있으며 다른 사람의 코드를 어 기지 않아도됩니다. 이를 통해 방금 개조 한 코드를 누군가가 사용하고 있다는 걱정없이 버그를 최적화, 리팩토링, 재 설계 및 수정할 수 있습니다.

따라서 경험의 법칙은 필요한만큼만 보이게 만드는 것입니다. 비공개로 시작하고 필요에 따라 더 많은 가시성을 추가하십시오. 사용자가 알기 위해 꼭 필요한 것을 공개하십시오. 공개 경련을 만드는 모든 세부 사항은 시스템을 재 설계 할 수있는 능력입니다.

사용자가 내부를 공개하지 않고 비헤이비어를 커스터마이즈 할 수 있도록 사용자 정의 할 수 있도록하려면 이러한 내장을 객체로 밀어 넣고 해당 인터페이스를 공개하는 것이 좋습니다. 그렇게하면 새로운 객체를 간단히 연결할 수 있습니다. 예를 들어, CD 플레이어를 작성 중이고 "이 CD에 대한 정보 찾기"비트를 사용자 정의 할 수 있기를 원한다면, 이러한 메소드를 공개하지 않고 모든 기능을 자체 오브젝트에 넣고 오브젝트를 getter / setter로 공개하십시오. . 이런 식으로 장을 노출시키는 것에 신경 쓰지 않으면 좋은 구성과 우려의 분리가 촉진됩니다.

개인적으로 저는 "개인"과 "공개"만 고집합니다. 많은 OO 언어가 있습니다. "보호"는 편리 할 수 ​​있지만 실제로는 치트입니다. 인터페이스가 개인용이 아닌 경우 제어 범위를 벗어나면 다른 사람들의 코드를 살펴보고 용도를 ​​찾아야합니다.

여기에서 "게시 됨"이라는 아이디어가 나온다. 인터페이스를 변경 (리팩토링)하려면 인터페이스를 사용하는 모든 코드를 찾아서 변경해야한다. 인터페이스가 개인용이라면 아무 문제가 없습니다. 보호 된 경우 모든 하위 클래스를 찾아야합니다. 공개 된 경우 코드를 사용하는 모든 코드를 찾아야합니다. 예를 들어 내부 용으로 만 사용되는 회사 코드로 작업하는 경우 인터페이스가 공용인지 여부는 중요하지 않은 경우가 있습니다. 회사 리포지토리에서 모든 코드를 가져올 수 있습니다. 그러나 인터페이스가 "게시 된"경우 컨트롤 외부에서 인터페이스를 사용하는 코드가 있으면 문제가 발생합니다. 해당 인터페이스 또는 위험 코드를 지원해야합니다. 보호 된 인터페이스조차도 게시 된 것으로 간주 될 수 있습니다.

많은 언어들이 공공 / 보호 / 민간의 계층 적 성격이 너무 제한적이며 현실과 일치하지 않는 것으로 본다. 이를 위해 특성 클래스 라는 개념이 있지만 그것은 또 다른 쇼입니다.


26
friends-> "알지 못하는 사람이 많을수록 좋다"---> 선택적인 가시성을 제공하여 패키지 프라이버시보다 여전히 우수합니다. C ++에서는 모든 함수가 멤버 함수가 될 수 없으며 친구가 공개보다 낫기 때문에 용도가 있습니다. 물론 악한 마음으로 오용 할 위험이 있습니다.
세바스티안 마흐

30
또한 C ++에서 "protected"는 다른 의미를 지니고 있습니다. 보호 된 메소드는 실제로 개인용이지만 상속 클래스에서 호출 할 수 있습니다. (동일한 패키지 내의 모든 클래스에서 호출 할 수있는 Java와 반대)
Rhys van der Waerden

9
@RhysvanderWaerden C #은이 측면에서 C ++과 동일합니다. Java가 서브 클래스에 액세스 할 수 있지만 전체 패키지는 액세스 할 수없는 멤버를 선언 할 수 없다는 것이 꽤 이상합니다. 그것은 거꾸로되어 있습니다. 패키지는 자식 클래스보다 더 넓은 범위입니다!
Konrad Morawski

15
@KonradMorawski IMHO 패키지는 서브 클래스보다 범위가 작습니다. 클래스를 final로 선언하지 않은 경우 사용자는 클래스를 서브 클래 싱 할 수 있어야합니다. 따라서 java protected는 게시 된 인터페이스의 일부입니다. OTOH, 패키지는 단일 조직 (예 : com.mycompany.mypackage)에 의해 암시 적으로 개발됩니다. 코드가 내 패키지에 선언 된 경우 내 조직의 일부를 암시 적으로 선언하므로 통신해야합니다. 따라서 패키지는 하위 클래스 (객체를 확장하는 사람)보다 청중 (회사에있는 사람)에게 도달하기 위해 더 작거나 더 쉽게 게시 할 수 있으므로 가시성이 떨어집니다.
시조

2
friend클래스 간의 특별한 관계를 정의하는 데 좋습니다. 올바르게 사용하면 많은 경우에 우수한 캡슐화가 가능합니다. 예를 들어, 특권 팩토리 클래스에서 내부 종속성을 생성 된 유형으로 주입하는 데 사용할 수 있습니다. 잘 설계된 객체 모델을 올바르게 유지 관리하는 데 관심이없는 사람들은 작업 모델을 남용하여 작업을 쉽게 할 수 있기 때문에 이름이 잘못되었습니다.
Dennis

434

다음은 더 나은 버전의 테이블이며 여기에는 모듈 열도 포함됩니다.

자바 액세스 수정 자

설명

  • 개인 회원 ( i)입니다 이 선언과 같은 클래스 내 접근.

  • 와 회원 액세스 수정 자 ( j)가 없는 는 동일한 패키지의 클래스 내에서만 액세스 할 수 있습니다.

  • 보호 회원 (k ) 같은 패키지의 모든 클래스에서 접근 하고 다른 패키지의 서브 클래스 내에서.

  • 공공 회원은 ( l) 그것은에 상주하지 않는 (모든 클래스에 액세스 할 수 모듈 이 선언 된 패키지를 내 보내지 않습니다).


어떤 수정자를 선택해야합니까?

액세스 수정자는 실수로 캡슐화가 깨지는 것을 방지하는 데 도움이되는 도구입니다. (*) . 멤버가 클래스, 패키지, 클래스 계층 내부에 있거나 내부에없는 것을 원한다면 자신에게 물어보고 그에 따라 액세스 수준을 선택하십시오.

예 :

  • 필드 long internalCounter 는 변경 가능하고 구현 세부 사항이므로 비공개 일 것입니다.
  • 팩토리 클래스에서만 (동일한 패키지로) 인스턴스화해야하는 클래스는 패키지 외부에서 직접 호출 할 수 없으므로 패키지 제한 생성자가 있어야합니다.
  • void beforeRender()렌더링 직전에 호출되고 서브 클래스에서 후크로 사용되는 내부 메소드를 보호해야합니다.
  • void saveGame(File dst)GUI를 코드에서 호출 방법을 공개한다.

(*) 정확히 캡슐화 란 무엇입니까?


11
그냥 말하기 : 빨강 / 녹색 채색에 문제가있는 사람들이 많이 있습니다. 빨강 / 녹색 (또는 노랑 / 오렌지 / ...) 채색 방식을 사용하는 테이블은 거의 "더 나은";-)
GhostCat

1
@ 고스트 캣, 동의하지 않습니다. 나는 많은 사람들을위한 "작품"/ "하지 않는 일"로 직관적 적색 / 녹색 정렬합니다 생각, 즉 그것은 이다 더 많은 대안보다.
aioobe

8
colourblindawareness.org/colour-blindness/… ... 색맹 남성의 8 %는 대략 1 %의 중수소 증, 1 %의 프로 테 노프, 1 %의 프로 테 노말 로스 및 5 %의 중수소로 나눌 수 있습니다. 그리고 그 5 %의 50 % 중 하나 인 빨강 / 녹색이 안심입니다.
GhostCat

6
@GhostCat Ok .. 예상보다 인구의 큰 부분입니다. 이 색맹 시뮬레이터 에서 이미지를 업로드하고 모든 다른 모드를 테스트했습니다. 단색 / 아 크로마토 시아 모드에서도 색차가 합리적입니다. 차이점이 보입니까, 아니면 시뮬레이터가 꺼져 있습니까? (나는 아직도 빨강 / 녹색이 사람들을 보는 색채에 매우 직관적이라는 의견에 여전히 동의합니다.)
aioobe

3
차이점을 볼 수 있지만 독일에서 운전 면허증을 위해해야하는 색맹 테스트의 절반을 통과 할 수도 있습니다. ;-) ... 그러나 그러한 시뮬레이터는 "충분히"좋습니다.
GhostCat

206
____________________________________________________________________
                | highest precedence <---------> lowest precedence
*———————————————+———————————————+———————————+———————————————+———————
 \ xCanBeSeenBy | this          | any class | this subclass | any
  \__________   | class         | in same   | in another    | class
             \  | nonsubbed     | package   | package       |    
Modifier of x \ |               |           |               |       
————————————————*———————————————+———————————+———————————————+———————
public          |              |          |              |     
————————————————+———————————————+———————————+———————————————+———————
protected       |              |          |              |      
————————————————+———————————————+———————————+———————————————+———————
package-private |               |           |               |
(no modifier)   |              |          |              |      
————————————————+———————————————+———————————+———————————————+———————
private         |              |          |              |       
____________________________________________________________________

1
"Protected modifier는 다른 패키지에서 객체를 사용할 수있게하는 반면, default / no-modifier는 동일한 패키지에 대한 액세스를 제한합니다"
vanguard69

2
@ vanguard69의 protected수정이 표시된 만드는 것은 다른 패키지의 다른 클래스에 사용할 수 (클래스, 메소드, 또는 필드) 만 IFF는 다른 클래스는 그 클래스의 서브 클래스입니다 말했다 protected표시 - 일이 선언된다.
Abdull

"미등록"? "다른 패키지에있는이 서브 클래스"? 허. Java를 알고 있다고 생각했습니다.
sehe

@AlexanderFarber 특정 브라우저 구성에 맞게 최적화 했습니까? 이것은 지금 나의 크롬 이고 이것은 Firefox입니다
sehe

흠 다음 변경 사항을 되
Alexander Farber

165

쉬운 규칙. 모든 것을 비공개로 선언하는 것으로 시작하십시오. 그런 다음 요구가 발생하고 디자인이이를 보증 할 때 대중을 향해 나아가십시오.

멤버를 노출시킬 때 표현 선택이나 추상화 선택을 노출하는지 스스로에게 물어보십시오. 첫 번째는 관찰 할 수있는 행동보다는 실제 표현에 너무 많은 의존성을 유발하기 때문에 피하고 싶은 것입니다.

일반적으로 서브 클래 싱으로 메소드 구현을 대체하지 않도록 노력합니다. 논리를 망치기가 너무 쉽습니다. 재정의하려는 경우 추상 보호 방법을 선언하십시오.

또한 재정의 할 때 @Override 주석을 사용하여 리팩토링 할 때 문제가 발생하지 않도록하십시오.


3
@RuchirBaronia, "world"= 어디에 있든지 응용 프로그램의 모든 코드.
Andrejs

116

실제로는 간단한 그리드 쇼보다 조금 더 복잡합니다. 그리드는 액세스가 허용되는지 여부를 알려주지 만 액세스를 정확히 구성하는 것은 무엇입니까? 또한 액세스 수준은 중첩 된 클래스 및 상속과 복잡한 방식으로 상호 작용합니다.

"기본"액세스 (키워드 부재로 지정)를 package-private 라고도 합니다 . 예외 : 인터페이스에서 수정자는 공개 액세스를 의미하지 않습니다. public 이외의 수정자는 금지됩니다. 열거 형 상수는 항상 공개입니다.

요약

이 액세스 지정자가있는 멤버에 대한 액세스가 허용됩니까?

  • 멤버 private: 멤버가 호출 코드와 동일한 클래스 내에 정의 된 경우에만 해당됩니다.
  • 멤버가 패키지 비공개 : 호출 코드가 멤버의 즉시 둘러싸는 패키지 내에있는 경우에만 해당됩니다.
  • Member is protected: 동일한 패키지 또는 멤버가 호출 코드를 포함하는 클래스의 수퍼 클래스에 정의 된 경우.
  • 회원 public: 예.

액세스 지정자가 적용되는 대상

지역 변수와 형식 매개 변수는 액세스 지정자를 사용할 수 없습니다. 범위 지정 규칙에 따라 본질적으로 외부에 액세스 할 수 없으므로 사실상 비공개입니다.

최상위 범위의 클래스의 경우에만 public패키지 전용이 허용됩니다. 이 디자인 선택은 아마도 때문에 protectedprivate패키지 레벨에서 중복 될 것이다 (패키지의 상속 재산이 없다).

모든 액세스 지정자는 클래스 멤버 (생성자, 메소드 및 정적 멤버 함수, 중첩 클래스)에서 가능합니다.

관련 : Java 클래스 접근성

주문

액세스 지정자는 엄격하게 주문할 수 있습니다

공개> 보호> 패키지 개인> 개인

public가장 많이 액세스 할 수있는 것을 의미합니다 private. 개인 구성원에 대해 가능한 모든 참조는 패키지 개인 구성원에게도 유효합니다. 패키지 전용 멤버에 대한 모든 참조는 보호 된 멤버 등에서 유효합니다. (동일한 패키지의 보호 된 멤버에게 다른 클래스의 액세스 권한을 부여하는 것은 실수로 간주되었습니다.)

노트

  • 클래스의 메소드 같은 클래스의 다른 객체의 비공개 멤버에 액세스 할 수 있습니다. 보다 정확하게는 클래스 C의 메소드는 C의 모든 서브 클래스의 오브젝트에서 C의 개인 멤버에 액세스 할 수 있습니다. Java는 인스턴스에 의한 액세스 제한을 지원하지 않습니다. (를 사용하여 지원하는 스칼라와 비교하십시오 private[this].)
  • 객체를 생성하려면 생성자에 액세스해야합니다. 따라서 모든 생성자가 비공개 인 경우 클래스는 클래스 내에 존재하는 코드 (일반적으로 정적 팩토리 메소드 또는 정적 변수 이니셜 라이저)만으로 구성 할 수 있습니다. 패키지 개인 또는 보호 된 생성자의 경우와 유사합니다.
    • Java는 서브 클래스의 생성자가 내재적으로 또는 명시 적으로 수퍼 클래스 생성자를 호출해야하므로 개인 생성자 만 있다는 것은 클래스를 외부에서 서브 클래 싱 할 수 없다는 것을 의미합니다. 그러나 하위 클래스를 포함하는 중첩 클래스를 포함 할 수 있습니다.

내부 수업

내부 클래스와 같은 중첩 범위 도 고려해야 합니다. 복잡성의 한 예는 내부 클래스에 멤버가 있으며 자체적으로 액세스 수정자를 사용할 수 있다는 것입니다. 그래서 당신은 공개 멤버와 개인 내부 수업을 가질 수 있습니다; 회원에게 액세스 할 수 있습니까? (아래 참조) 일반적인 규칙은 범위를보고 재귀 적으로 생각하여 각 수준에 액세스 할 수 있는지 여부를 확인하는 것입니다.

그러나 이것은 매우 복잡하며 자세한 내용 은 Java 언어 사양을 참조하십시오 . (예, 과거에는 컴파일러 버그가있었습니다.)

이들이 어떻게 상호 작용하는지 맛 보려면이 예제를 고려하십시오. 개인 내부 클래스를 "누설"할 수 있습니다. 이것은 일반적으로 경고입니다.

class Test {
    public static void main(final String ... args) {
        System.out.println(Example.leakPrivateClass()); // OK
        Example.leakPrivateClass().secretMethod(); // error
    }
}

class Example {
    private static class NestedClass {
        public void secretMethod() {
            System.out.println("Hello");
        }
    }
    public static NestedClass leakPrivateClass() {
        return new NestedClass();
    }
}

컴파일러 출력 :

Test.java:4: secretMethod() in Example.NestedClass is defined in an inaccessible class or interface
        Example.leakPrivateClass().secretMethod(); // error
                                  ^
1 error

몇 가지 관련 질문 :


1
"공개 이외의 수정자는 금지되어 있습니다" — Java 9 부터는 더 이상 해당되지 않습니다. 인터페이스에는 개인용 메소드가있을 수도 있습니다.
MC 황제

96

경험적으로 볼 때 :

  • private: 클래스 범위.
  • default(또는 package-private) : 패키지 범위.
  • protected: package scope + child(패키지와 같지만 다른 패키지에서 서브 클래 싱 할 수 있습니다). 보호 된 수정자는 항상 "부모-자식"관계를 유지합니다.
  • public: 어디서나.

결과적으로 액세스 권한을 세 가지 권한으로 나누면 :

  • (D) 고침 (동일한 클래스 내의 메소드 또는 "this"구문을 통해 호출)
  • (R) 추론 (클래스에 대한 참조를 사용하거나 "도트"구문을 통해 메소드를 호출)
  • (I) 상속 (하위 분류를 통한).

이 간단한 테이블이 있습니다.

+—-———————————————+————————————+———————————+
|                 |    Same    | Different |
|                 |   Package  | Packages  |
+—————————————————+————————————+———————————+
| private         |   D        |           |
+—————————————————+————————————+———————————+
| package-private |            |           |
| (no modifier)   |   D R I    |           |
+—————————————————+————————————+———————————+
| protected       |   D R I    |       I   |
+—————————————————+————————————+———————————+
| public          |   D R I    |    R  I   |
+—————————————————+————————————+———————————+

54

아주 짧게

  • public: 어디서나 액세스 할 수 있습니다.
  • protected: 동일한 패키지의 클래스 및 모든 패키지에있는 서브 클래스에 의해 액세스 가능
  • 기본값 (수정자가 지정되지 않음) : 동일한 패키지의 클래스에서 액세스 할 수 있습니다.
  • private: 같은 클래스 내에서만 액세스 할 수 있습니다.

48

Java에서 가장 오해 된 액세스 수정자는입니다 protected. 우리는 그것이 서브 클래스가 볼 수 있다는 점을 제외하면 기본 수정 자와 유사하다는 것을 알고 있습니다. 그러나 어떻게? 다음은 혼동을 명확하게 설명하는 예입니다.

  • 우리가 2 개의 수업을 가지고 있다고 가정하자. FatherSon자체 패키지에 각각 포함되어 있습니다.

    package fatherpackage;
    
    public class Father
    {
    
    }
    
    -------------------------------------------
    
    package sonpackage;
    
    public class Son extends Father
    {
    
    }
  • 에 보호 된 메소드 foo()를 추가합시다 Father.

    package fatherpackage;
    
    public class Father
    {
        protected void foo(){}
    }
  • 이 메소드 foo()는 4 가지 컨텍스트에서 호출 될 수 있습니다.

    1. foo()정의 된 동일한 패키지에있는 클래스 내부 ( fatherpackage) :

      package fatherpackage;
      
      public class SomeClass
      {
          public void someMethod(Father f, Son s)
          {
              f.foo();
              s.foo();
          }
      }
    2. 서브 클래스 내부, 현재 인스턴스를 통해 this또는 super:

      package sonpackage;
      
      public class Son extends Father
      {
          public void sonMethod()
          {
              this.foo();
              super.foo();
          }
      }
    3. 유형이 동일한 클래스 인 참조에서 :

      package fatherpackage;
      
      public class Father
      {
          public void fatherMethod(Father f)
          {
              f.foo(); // valid even if foo() is private
          }
      }
      
      -------------------------------------------
      
      package sonpackage;
      
      public class Son extends Father
      {
          public void sonMethod(Son s)
          {
              s.foo();
          }
      }
    4. 유형이 부모 클래스이고 참조가 있는 패키지 내부에 있는 참조에서 foo()( fatherpackage) [이것은 컨텍스트 번호 안에 포함될 수 있습니다. 1]:

      package fatherpackage;
      
      public class Son extends Father
      {
          public void sonMethod(Father f)
          {
              f.foo();
          }
      }
  • 다음 상황은 유효하지 않습니다.

    1. 유형이 상위 클래스이고 정의 된 패키지 외부에 있는 참조에서 foo()( fatherpackage) :

      package sonpackage;
      
      public class Son extends Father
      {
          public void sonMethod(Father f)
          {
              f.foo(); // compilation error
          }
      }
    2. 서브 클래스 패키지 내부의 서브 클래스가 아닌 서브 클래스

      package sonpackage;
      
      public class SomeClass
      {
          public void someMethod(Son s) throws Exception
          {
              s.foo(); // compilation error
          }
      }

Object#clone()protected멤버 의 예입니다 .
Eng.Fouad

super.foo()첫 번째 무효 상황과 다른 점은 무엇입니까 f.foo()?
cst1992

1
@ cst1992 혼란 스럽지만 Java 언어 사양 6.6.2를 참조하십시오. "개체의 보호 된 멤버 또는 생성자는 해당 개체의 구현을 담당하는 코드에 의해서만 선언 된 패키지 외부에서 액세스 할 수 있습니다". super.foo ()를 사용하면 참조 "super"는 "직접 구현에 책임이 있지만"참조 "f"는 아닙니다. 왜? "super"가 Father 유형이지만 "f"에 대해서는 아니라고 100 % 확신 할 수 있기 때문입니다. 런타임에 그것은 다른 하위 유형의 아버지가 될 수 있습니다. docs.oracle.com/javase/specs/jls/se9/html/…을
skomisa

1
를 이해하는 사람의 답변을 읽는 것이 상쾌합니다 protected. 불행히도,이 페이지의 다른 모든 답변은 protected약간 잘못되었습니다.
Dawood ibn Kareem

30

은밀한

  • 방법, 변수 및 생성자

private으로 선언 된 메소드, 변수 및 생성자는 선언 된 클래스 자체 내에서만 액세스 할 수 있습니다.

  • 클래스와 인터페이스

개인 액세스 수정자는 가장 제한적인 액세스 수준입니다. 클래스와 인터페이스는 비공개 일 수 없습니다.

노트

public getter 메소드가 클래스에있는 경우 private으로 선언 된 변수는 클래스 외부에서 액세스 할 수 있습니다. 수퍼 클래스에서 보호 된 것으로 선언 된 변수, 메소드 및 생성자는 다른 패키지의 서브 클래스 또는 보호 된 멤버의 클래스 패키지 내의 클래스에 의해서만 액세스 할 수 있습니다.


보호

  • 클래스와 인터페이스

보호 된 액세스 수정자는 클래스 및 인터페이스에 적용 할 수 없습니다.

메소드, 필드는 보호 된 것으로 선언 될 수 있지만 인터페이스의 메소드 및 필드는 보호 된 것으로 선언 될 수 없습니다.

노트

보호 된 액세스는 서브 클래스가 헬퍼 메소드 또는 변수를 사용할 수있는 기회를 제공하면서 관련이없는 클래스가이를 사용하지 못하게합니다.


공공의

public으로 선언 된 클래스, 메소드, 생성자, 인터페이스 등은 다른 클래스에서 액세스 할 수 있습니다.

따라서 공개 클래스 내에 선언 된 필드, 메서드, 블록은 Java Universe에 속하는 모든 클래스에서 액세스 할 수 있습니다.

  • 다른 패키지

그러나 우리가 액세스하려는 공개 클래스가 다른 패키지에 있으면 공개 클래스를 여전히 가져와야합니다.

클래스 상속으로 인해 클래스의 모든 공용 메소드 및 변수는 서브 클래스에 의해 상속됩니다.


기본-키워드 없음 :

기본 액세스 수정자는 클래스, 필드, 메소드 등에 대한 액세스 수정자를 명시 적으로 선언하지 않음을 의미합니다.

  • 동일한 패키지 내

액세스 제어 수정 자없이 선언 된 변수 또는 메소드는 동일한 패키지의 다른 클래스에서 사용할 수 있습니다. 인터페이스의 필드는 암시 적으로 public static final이며 인터페이스의 메소드는 기본적으로 public입니다.

노트

정적 필드를 재정의 할 수 없습니다. 재정의하려고하면 오류가 표시되지 않지만 제외하고는 작동하지 않습니다.

관련 답변

참조 링크

http://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html http://www.tutorialspoint.com/java/java_access_modifiers.htm


21

차이점은 이미 제공된 링크에서 찾을 수 있지만 일반적으로 사용할 링크는 "최소한 지식의 원리"에 있습니다. 필요한 최소한의 가시성 만 허용하십시오.


20

개인 : 수업 만 이용 가능

기본값 (수정 자 없음) : 클래스 및 패키지에 대한 제한된 액세스

보호 : 클래스, 패키지 및 서브 클래스에 대한 제한된 액세스 (패키지 내부 및 외부)

공개 : 클래스, 패키지 (모두) 및 서브 클래스에 액세스 할 수 있습니다.


17

액세스 수정자는 여러 레벨에서 액세스를 제한하기 위해 존재합니다.

공공의: 기본적으로 동일한 패키지에 있는지 여부에 관계없이 모든 클래스에서 액세스 할 수있는만큼 간단합니다.

같은 패키지에 있으면 직접 액세스 할 수 있지만 다른 패키지에 있으면 클래스의 객체를 만들 수 있습니다.

기본값 : 모든 패키지 클래스에서 동일한 패키지로 액세스 할 수 있습니다.

액세스하려면 클래스의 객체를 만들 수 있습니다. 그러나 패키지 외부에서는이 변수에 액세스 할 수 없습니다.

보호 : 다른 패키지의 하위 클래스뿐만 아니라 동일한 패키지의 변수에 액세스 할 수 있습니다. 기본적으로 기본 + 상속 된 동작입니다.

기본 클래스에 정의 된 보호 필드에 액세스하기 위해 하위 클래스의 객체를 만들 수 있습니다.

비공개 : 동일한 클래스에서 액세스 할 수 있습니다.

비 정적 메소드에서는 참조 (생성자)로 인해 직접 액세스 할 수 있지만 정적 메소드에서 액세스하려면 클래스의 객체를 만들어야합니다.


16

Java의 수정 자에 액세스하십시오.

Java 액세스 수정자는 Java에서 액세스 제어를 제공하는 데 사용됩니다.

1. 기본 :

동일한 패키지의 클래스에만 액세스 할 수 있습니다.

예를 들어

// Saved in file A.java
package pack;

class A{
  void msg(){System.out.println("Hello");}
}

// Saved in file B.java
package mypack;
import pack.*;

class B{
  public static void main(String args[]){
   A obj = new A(); // Compile Time Error
   obj.msg(); // Compile Time Error
  }
}

이 액세스는 공개 및 보호보다 제한적이지만 개인보다는 제한적입니다.

2. 공개

어디서나 액세스 할 수 있습니다. (글로벌 액세스)

예를 들어

// Saved in file A.java

package pack;
public class A{
  public void msg(){System.out.println("Hello");}
}

// Saved in file B.java

package mypack;
import pack.*;

class B{
  public static void main(String args[]){
    A obj = new A();
    obj.msg();
  }
}

출력 : 안녕하세요

3. 개인

같은 클래스 내에서만 액세스 할 수 있습니다.

한 클래스에서 다른 멤버의 개인 멤버에 액세스하려고하면 컴파일 오류가 발생합니다. 예를 들어

class A{
  private int data = 40;
  private void msg(){System.out.println("Hello java");}
}

public class Simple{
  public static void main(String args[]){
    A obj = new A();
    System.out.println(obj.data); // Compile Time Error
    obj.msg(); // Compile Time Error
  }
}

4. 보호

동일한 패키지의 클래스 및 서브 클래스에만 액세스 가능

예를 들어

// Saved in file A.java
package pack;
public class A{
  protected void msg(){System.out.println("Hello");}
}

// Saved in file B.java
package mypack;
import pack.*;

class B extends A{
  public static void main(String args[]){
    B obj = new B();
    obj.msg();
  }
}

출력 : 안녕하세요

여기에 이미지 설명을 입력하십시오


14
  • 공개 -응용 프로그램의 어느 곳에서나 액세스 할 수 있습니다.

  • 기본값 -패키지에서 액세스 할 수 있습니다.

  • protected- 다른 패키지의 패키지 및 하위 클래스에서 액세스 할 수 있습니다. 게다가

  • 비공개 -클래스에서만 액세스 할 수 있습니다.


14

패키지에 표시됩니다. 기본값입니다. 수정자가 필요하지 않습니다.

수업 만 볼 수 있습니다 ( private ).

세계에 공개 ( 공개 ).

패키지 및 모든 하위 클래스에 표시됩니다 ( protected ).

변수와 메소드는 호출 된 수정 자없이 선언 될 수 있습니다. 기본 예 :

String name = "john";

public int age(){
    return age;
}

개인 액세스 수정 자-개인 :

private으로 선언 된 메서드, 변수 및 생성자는 선언 된 클래스 자체 내에서만 액세스 할 수 있습니다. 개인용 액세스 수정자는 가장 제한적인 액세스 수준입니다. 클래스 및 인터페이스는 개인용이 될 수 없습니다.

public getter 메소드가 클래스에있는 경우 private으로 선언 된 변수는 클래스 외부에서 액세스 할 수 있습니다.

전용 수정자를 사용하는 것이 객체가 자신을 캡슐화하고 외부 세계에서 데이터를 숨기는 주요 방법입니다.

예 :

Public class Details{

    private String name;

    public void setName(String n){
        this.name = n;
    }

    public String getName(){
        return this.name;
    }
}

공개 액세스 수정 자-공개 :

public으로 선언 된 클래스, 메소드, 생성자, 인터페이스 등은 다른 클래스에서 액세스 할 수 있습니다. 따라서 공개 클래스 내에 선언 된 필드, 메서드, 블록은 Java 유니버스에 속한 모든 클래스에서 액세스 할 수 있습니다.

그러나 액세스하려는 공개 클래스가 다른 패키지에 있으면 공개 클래스를 계속 가져와야합니다.

클래스 상속으로 인해 클래스의 모든 공용 메소드 및 변수는 서브 클래스에 의해 상속됩니다.

예:

public void cal(){

}

보호 된 액세스 수정 자-보호 :

수퍼 클래스에서 보호 된 것으로 선언 된 변수, 메소드 및 생성자는 다른 패키지의 서브 클래스 또는 보호 된 멤버의 클래스 패키지 내의 클래스에 의해서만 액세스 할 수 있습니다.

보호 된 액세스 수정자는 클래스 및 인터페이스에 적용 할 수 없습니다. 메소드, 필드는 보호 된 것으로 선언 될 수 있지만 인터페이스의 메소드 및 필드는 보호 된 것으로 선언 될 수 없습니다.

보호 된 액세스는 서브 클래스가 헬퍼 메소드 또는 변수를 사용할 수있는 기회를 제공하면서 관련이없는 클래스가이를 사용하지 못하게합니다.

class Van{

    protected boolean speed(){

    }
}

class Car{
    boolean speed(){
    }

}

12

이 페이지는 보호 및 기본 액세스 수정 자에 대해 잘 작성합니다.

.... 보호 : 보호 된 액세스 수정자는 약간 까다 롭고 기본 액세스 수정 자의 수퍼 세트라고 말할 수 있습니다. 보호 된 구성원은 동일한 패키지의 액세스에 관한 한 기본 구성원과 동일합니다. 차이점은 보호 된 멤버는 부모 클래스가있는 패키지 외부에있는 멤버가 선언 된 클래스의 서브 클래스에도 액세스 할 수 있다는 것입니다.

그러나 이러한 보호 된 멤버는 "상속을 통해서만 패키지 외부에서 액세스 할 수 있습니다". 즉, 멤버가 서브 클래스 자체에있는 것처럼 다른 패키지에있는 서브 클래스에있는 클래스의 보호 된 멤버에 직접 액세스 할 수 있습니다. 그러나 보호 된 멤버는 부모 클래스의 참조를 사용하여 패키지 외부의 서브 클래스에서 액세스 할 수 없습니다. ....


"아이가 부모 클래스의 보호 멤버에 액세스하면 서브 클래스의 private (또는 서브 클래스의 서브 클래스가 상속 할 수있는 특수한 private 멤버) 멤버가됩니다."
Anand

9

David의 대답은 각 액세스 수정 자의 의미를 제공합니다. 각각을 사용할 때에 관해서는 모든 클래스와 외부 사용을위한 각 클래스의 메소드 (API) 및 기타 모든 것을 공개하는 것이 좋습니다.

시간이 지남에 따라 일부 클래스를 패키지 전용으로 만들 때와 하위 클래스에서 사용하도록 보호 된 특정 메서드를 선언 할시기에 대한 이해가 높아질 것입니다.


6

참고 : 이것은 허용되는 답변을 보완 하는 것입니다.

이것은 Java Access Modifiers 와 관련이 있습니다.

에서 자바 액세스 수정 :

Java 액세스 수정자는 주어진 클래스와 해당 필드, 생성자 및 메소드에 액세스 할 수있는 클래스를 지정합니다. 액세스 수정자는 클래스, 생성자, 필드 및 메소드에 대해 별도로 지정할 수 있습니다. Java 액세스 수정자는 일상 연설에서 Java 액세스 지정자로 언급되기도하지만 올바른 이름은 Java 액세스 수정 자입니다. 클래스, 필드, 생성자 및 메소드는 다음 네 가지 Java 액세스 수정 자 중 하나를 가질 수 있습니다.

  • 아이템 목록
  • 은밀한
  • 기본 (패키지)
  • 보호
  • 공공의

에서 클래스의 멤버에 대한 액세스 제어 자습서 :

액세스 레벨 수정자는 다른 클래스가 특정 필드를 사용할 수 있는지 또는 특정 메소드를 호출 할 수 있는지 판별합니다. 액세스 제어에는 두 가지 레벨이 있습니다.

  • 최상위 또는 공용 또는 패키지 전용 (명시 적 수정 자 없음)
  • 구성원 수준 (공개, 개인, 보호 또는 패키지 개인) (명시 적 수정 자 없음)

클래스는 수정 자 public으로 선언 될 수 있으며,이 경우 클래스는 모든 클래스에서 볼 수 있습니다. 클래스에 수정자가없는 경우 (기본값, 패키지 전용이라고도 함) 자체 패키지 내에서만 볼 수 있습니다

다음 표는 각 수정자가 허용하는 멤버에 대한 액세스를 보여줍니다.

╔═════════════╦═══════╦═════════╦══════════╦═══════╗
 Modifier     Class  Package  Subclass  World 
╠═════════════╬═══════╬═════════╬══════════╬═══════╣
 public       Y      Y        Y         Y     
 protected    Y      Y        Y         N     
 no modifier  Y      Y        N         N     
 private      Y      N        N         N     
╚═════════════╩═══════╩═════════╩══════════╩═══════╝

첫 번째 데이터 열은 클래스 자체가 액세스 수준으로 정의 된 멤버에 액세스 할 수 있는지 여부를 나타냅니다. 보시다시피 클래스는 항상 자체 멤버에게 액세스 할 수 있습니다. 두 번째 열은 클래스와 동일한 패키지의 클래스 (상위에 관계없이)가 멤버에 액세스 할 수 있는지 여부를 나타냅니다. 세 번째 열은이 패키지 외부에서 선언 된 클래스의 하위 클래스가 멤버에 액세스 할 수 있는지 여부를 나타냅니다. 네 번째 열은 모든 클래스가 멤버에 액세스 할 수 있는지 여부를 나타냅니다.

액세스 수준은 두 가지 방식으로 영향을줍니다. 먼저, Java 플랫폼의 클래스와 같은 다른 소스에서 제공되는 클래스를 사용하는 경우 액세스 레벨에 따라 해당 클래스에서 자신의 클래스가 사용할 수있는 멤버가 결정됩니다. 둘째, 클래스를 작성할 때 모든 멤버 변수 및 클래스의 모든 메소드에 어떤 액세스 레벨이 있어야하는지 결정해야합니다.


1
보완 내용이 정확히 무엇이며 기존 게시물을 수정하지 않은 이유는 무엇입니까?
sehe

보충은 액세스 수정 자입니다. 왜 편집하지 않습니까? 역사적으로 받아 들여진 대답을 변경하지 않고 내 대답을 제공합니다.
ישו אוהב אותך

5

공개 보호 기본값 및 개인은 액세스 수정 자입니다.

그것들은 캡슐화, 또는 수업 내용을 숨기고 보여주기위한 것입니다.

  1. 수업은 공개 또는 기본이 될 수 있습니다
  2. 클래스 멤버는 공개, 보호, 기본 또는 비공개 일 수 있습니다.

클래스 외부에서 개인용으로 액세스 할 수 없습니다. 기본적으로 패키지에서만 액세스 할 수 있습니다. 패키지와 패키지를 확장하는 클래스로 보호됩니다. 모두에게 공개됩니다.

일반적으로 멤버 변수는 개인용으로 정의되지만 멤버 메소드는 공용입니다.


Default액세스 수정자가 아니며 다른 둘 중 하나가 잘못되었습니다.
user207421

5

종종 나는 어떤 언어의 기본 개념을 기억하는 것이 실제 세계의 비유를 통해 가능해질 수 있다는 것을 깨달았습니다. 다음은 Java의 액세스 수정자를 이해하는 비유입니다.

당신이 대학의 학생이고 주말에 당신을 방문 할 친구가 있다고 가정 해 봅시다. 캠퍼스 한가운데에 대학 설립자의 큰 조각상이 있다고 가정합니다.

  • 당신이 그를 캠퍼스로 데려 올 때, 당신과 당신의 친구가 가장 먼저 보는 것은이 조각상입니다. 즉, 캠퍼스 내에서 걷는 사람은 누구나 대학의 허가없이 동상을 볼 수 있습니다. 이것은 동상을 PUBLIC으로 만듭니다 .

  • 다음으로 친구를 기숙사로 데려가려고하지만 방문객으로 등록해야합니다. 이것은 그가 캠퍼스의 다양한 건물에 들어갈 수있는 액세스 패스 (귀하와 동일)를 얻음을 의미합니다. 이것은 그의 액세스 카드를 보호 형으로 만듭니다.

  • 친구가 캠퍼스 WiFi에 로그인하려고하지만 자격 증명이 없습니다. 그가 온라인에 접속할 수있는 유일한 방법은 로그인 정보를 공유하는 것입니다. (대학에 진학하는 모든 학생도이 로그인 자격 증명을 가지고 있음을 기억하십시오). 이것은 로그인 자격 증명을 NO MODIFIER로 만듭니다.

  • 마지막으로 친구가 웹 사이트에 게시 된 학기의 진행 상황 보고서를 읽으려고합니다. 그러나 모든 학생에게는 캠퍼스 웹 사이트의이 섹션에 액세스하기위한 자체 로그인이 있습니다. 이 자격 증명을 PRIVATE로 만듭니다.

도움이 되었기를 바랍니다!


4

액세스 수정자를 생각할 때 다음과 같이 생각하십시오 ( 변수메소드 모두에 적용 ).

public-> 모든 곳에서 액세스 가능
private-> 선언 된 동일한 클래스 내에서만 액세스 가능

이에 관해서 이제 혼란이 발생 default하고protected

default-> 액세스 수정 자 키워드가 없습니다. 이것은 클래스 패키지 내에서 엄격하게 사용할 수 있음을 의미합니다. 어디에도 해당 패키지 외부에서 액세스 할 수 없습니다.

protected-> default동일한 패키지 클래스 보다 약간 덜 엄격하며 선언 된 패키지 외부의 하위 클래스에서 액세스 할 수 있습니다 .


4

Java 액세스는 사용할 수있는 수정

여기에 이미지 설명을 입력하십시오

액세스 수정자는 class, field[정보] ,에 적용 할 수 있습니다 method. 이것에 접근, 서브 클래스 또는 오버라이드를 시도하십시오.

  • 액세스 field또는 method스루입니다 class.
  • 계승. 후속 class(하위 클래스) 액세스 수정자는 임의 일 수 있습니다. 후속 method(재정의) 액세스 수정자는 동일하거나 확장해야합니다.

최상위 클래스 (첫 번째 수준 범위)는 public및 일 수 있습니다 default. Nested class[소개] 그들 중 하나를 가질 수 있습니다

package 패키지 계층에는 적용되지 않습니다

신속한 액세스 수정 자


2

캡슐화 에 관한 모든 것입니다 (또는 Joe Phillips가 말했듯이 최소한의 지식 ).

가장 제한적인 (비공개)로 시작하여 나중에 덜 제한적인 수정자가 필요한지 확인하십시오.

우리는 모두 private, public과 같은 메소드와 멤버 수정자를 사용하지만 너무 적은 개발자는 패키지를 사용하여 코드를 논리적으로 구성 합니다.

예를 들어, 민감한 보안 방법을 '보안'패키지에 넣을 수 있습니다. 그런 다음이 패키지의 일부 보안 관련 코드에 액세스하는 공개 클래스를 배치하고 다른 보안 클래스 패키지는 비공개로 유지하십시오 . 따라서 다른 개발자는 수정자를 변경하지 않는 한이 패키지 외부에서 공개적으로 사용 가능한 클래스 만 사용할 수 있습니다. 이것은 보안 기능은 아니지만 사용법 을 안내 합니다.

Outside world -> Package (SecurityEntryClass ---> Package private classes)

또 다른 것은 서로 의존하는 클래스가 동일한 패키지로 끝나고 종속성이 너무 강한 경우 리팩토링되거나 병합 될 수 있다는 것입니다.

반대로 모든 것을 공개 로 설정하면 액세스해야하거나 액세스하지 않아야 할 내용이 명확하지 않아 많은 javadoc을 작성할 수 있습니다 (컴파일러를 통해 아무것도 시행하지 않습니다 ...).


2

개인 데이터 보호-공공-완벽-분석-가변 데이터 유형

다음 블록 다이어그램 은 파생 클래스 액세스 모드가 전용 일기본 클래스 의 데이터 멤버 가 상속 되는 방법을 설명합니다 .

여기에 이미지 설명을 입력하십시오

참고 : 개인용 액세스 지정자를 사용하여 데이터 멤버를 선언하는 것을 데이터 숨기기라고합니다.

출처 : 액세스 지정자 – 개인, 공개 및 보호


1
문제는 C ++이 아니라 Java에 관한 것이었다.
Benoit

1
@Benoit 그러나 내가 게시 한 것, 특별한 그림은 모두 동일하지 않습니다 : java와 c ++이 규칙은 Java에도 적용되지 않습니까? 감사합니다
leonidaa

2
C ++에는 수정자가 3 개 있지만 Java에는 4가 있습니다.
Benoit

1
비유는 좋지만 기본 액세스 지정자가 없습니다.
mss

1
OP는 "공개, 보호, 패키지 개인 및 개인 Java의 차이점은 무엇입니까?"라는 질문을 던졌습니다.
JL_SO

2

내 두 센트 :)

은밀한:

class-> 최상위 클래스는 비공개 일 수 없습니다. 내부 클래스는 개인이 될 수 있으며 동일한 클래스에서 액세스 할 수 있습니다.

인스턴스 변수-> 클래스에서만 액세스 가능 수업 외부에 액세스 할 수 없습니다.

패키지-개인 :

class-> 최상위 클래스는 패키지 전용이 될 수 있습니다. 동일한 패키지에서만 액세스 할 수 있습니다. 하위 패키지가 아닌 외부 패키지가 아닙니다.

인스턴스 변수-> 동일한 패키지에서 액세스 가능 하위 패키지가 아닌 외부 패키지가 아닙니다.

보호 :

수업-> 최상위 클래스는 보호 할 수 없습니다.

인스턴스 변수-> 동일한 패키지 또는 하위 패키지에서만 액세스 할 수 있습니다. 클래스를 확장하는 동안 패키지 외부에서만 액세스 할 수 있습니다.

공공의:

클래스-> 패키지 / 서브 패키지 / 다른 패키지에서 액세스 가능

인스턴스 변수-> 패키지 / 서브 패키지 / 다른 패키지에서 액세스 가능

자세한 답변은 다음과 같습니다

https://github.com/junto06/java-4-beginners/blob/master/basics/access-modifier.md


1
  • 공공의

    클래스 멤버가 public으로 선언되면 어디서나 액세스 할 수 있습니다.

  • 보호

    키워드 보호를 사용하여 클래스 멤버를 선언하면 동일한 패키지 내의 클래스 클래스 외부 및 상속 된 클래스 멤버와 동일한 클래스 멤버에서 액세스 할 수 있습니다. 클래스 멤버가 보호 된 경우 외부 패키지 클래스가 상속되지 않으면 다른 패키지 수퍼 클래스를 확장하지 않으면 외부 패키지 클래스에서 액세스 할 수 없습니다. 그러나 보호 된 클래스 멤버는 항상 동일한 패키지 클래스에서 사용할 수 있습니다. 동일한 패키지 클래스가 상속되거나 그렇지 않은 날씨와 상관 없습니다.

  • 기본

    Java에서 기본값은 액세스 수정 자 키워드가 아닙니다. 클래스 멤버가 액세스 수정 자 키워드없이 선언되면이 경우 기본 멤버로 간주됩니다. 기본 클래스 멤버는 항상 동일한 패키지 클래스 멤버가 사용할 수 있습니다. 그러나 외부 클래스가 보호 된 멤버와 달리 하위 클래스 인 경우에도 외부 패키지 클래스 멤버는 기본 클래스 멤버에 액세스 할 수 없습니다.

  • 은밀한

    키워드 보호로 클래스 멤버를 선언하면이 경우 동일한 클래스 멤버 만 사용할 수 있습니다.


-1

Java의 액세스 지정자 : Java에는 액세스 순서가 증가함에 따라 개인용, 패키지 전용 (기본값), 보호 및 공용의 4 가지 액세스 지정자가 있습니다.

비공개 : 일부 클래스를 개발 중이고이 클래스의 멤버가이 클래스 외부에 노출되지 않게하려면 비공개로 선언해야합니다. 비공개 멤버는 클래스가 정의되어있는 클래스에서만 액세스 할 수 있습니다. 비공개 멤버는 'this'참조와이 멤버를 둘러싸고있는 다른 클래스 인스턴스에서 액세스 할 수 있지만이 클래스의 정의 내에서만 가능합니다.

패키지-개인 (기본값) :이 액세스 지정자는 아래에 설명 된 액세스 외에 개인용 액세스 지정자가 지정한 액세스를 제공합니다.

패키지를 개발할 때 클래스 (예 : Class1)에 클래스 (예 : 명시 적으로 언급되지 않음) 액세스 지정자를 사용하여 클래스 내의 멤버를 (동일한) 패키지 내의 다른 클래스에 노출시킬 수 있습니다. 이러한 다른 클래스 (같은 패키지 내)에서 Class1 인스턴스의 기본 멤버에 액세스 할 수 있습니다. 또한 Class1의 하위 클래스 내에서 Class2와 같은 기본 멤버에 액세스 할 수 있습니다 (이 참조 또는 Class1 인스턴스 또는 Class2 인스턴스).

기본적으로 동일한 패키지 내에서 클래스 인스턴스의 기본 멤버에 직접 액세스하거나 서브 클래스의 'this'참조에 액세스 할 수 있습니다.

protected :이 액세스 지정자는 아래에 설명 된 액세스 외에 패키지 개인 액세스 지정자로 지정된 액세스를 제공합니다.

패키지와 클래스 내의 클래스 (예 : Class1)를 개발할 때 패키지 외부에서이 멤버에 액세스하지 않으려면 Class1 내의 데이터 멤버에 대해 보호 된 액세스 지정자를 사용해야합니다. 패키지 (예 : API를 사용하는 클라이언트)), 그러나 클라이언트가 Class1을 확장하는 Class2라고 말하는 클래스를 작성하는 경우에만 예외를 만들고이 멤버에 대한 액세스를 허용하려고합니다. 따라서 일반적으로 보호 된 멤버는 파생 클래스 (예 : Class2) 및 명시적인 Class2 인스턴스에서 'this'참조로 액세스 할 수 있습니다.

참고 :

  1. Class1의 명시 적 인스턴스에서 상속하려고하더라도 Class2의 상속 된 보호 된 멤버에 액세스 할 수 없습니다.
  2. Class2를 확장하는 동일한 / 다른 패키지 내에 다른 클래스 Class3을 작성할 때 Class1의 보호 된 멤버는이 참조 및 명시 적 Class3 인스턴스에 액세스 할 수 있습니다. 이것은 확장 된 모든 계층 구조에 적용됩니다. 즉, 보호 된 멤버는이 참조 또는 확장 클래스 인스턴스에서 계속 액세스 할 수 있습니다. Class3에서 Class2 인스턴스를 만들면 상속 된 클래스 1에서 보호 된 멤버에 액세스 할 수 없습니다.

따라서 결론은 보호 된 멤버는이 다른 패키지의 일부 클래스 가이 보호 된 멤버를 둘러싸는 클래스를 확장하고 확장 된 정의 내에서 확장 된 클래스의 'this'참조 또는 명시 적 인스턴스에서 액세스되는 경우에만 다른 패키지에서 액세스 할 수 있다는 것입니다 수업.

공공의 :이 액세스 지정자는 아래에 설명 된 액세스 외에 보호 된 액세스 지정자로 지정된 액세스를 제공합니다.

패키지를 개발할 때 클래스 (클래스 1과 같은 클래스)를 개발할 때 다른 클래스의 클래스에서 작성된 클래스 1 인스턴스의 다른 패키지에서이 멤버에 액세스하려면 클래스 1 내의 데이터 멤버에 대해 공개 액세스 지정자를 사용해야합니다. 꾸러미. 기본적으로이 액세스 지정자는 조건없이 데이터 멤버를 월드에 노출하려는 경우에 사용해야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.