일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- Literal
- 제어구조
- 코드업100제자바
- 개발입문
- 코드업자바
- 알고리즘
- 변수
- C#변수
- 코드업100제
- 코딩테스트
- 리터럴
- Algorithm
- 사용자입력
- 자바
- 백준파이썬
- 백준
- C#프로그래밍
- 자바연산자
- 코드업
- c#
- 수학연산
- Java
- 기초프로그래밍
- Codeup
- 디자인패턴
- 프로그래머스파이썬
- SWEA
- SWEA파이썬
- 자바클래스
- VARIABLE
- Today
- Total
제니노트
접근제어자(acess modifier) [자바] 본문
접근 제어자 (acess modifierr)
접근 제어자는 딱 4개가 있다.
private | 같은 클래스 내에서만 접근이 가능하다. |
(default) | 같은 패키지 내에서만 접근이 가능하다. |
protected | 같은 패키지 내에서, 그리고 다른 패키지의 자손클래스에서 접근이 가능하다. |
public | 접근 제한이 전혀 없다. |
하나의 대상에 위의 한개만 적용가능하다.
예를 들어 private 이면서 public일 수는 없는 것(같은 패키지 내에서만 접근 가능하지만 접근제한이 없는 모순이 되어버린다..)
접근제어자를 아무것도 안 붙힐 경우 default라고 한다. 그래서 표에 괄호를 쳐놨다
procteted의 경우 같은 패키지 내에서도 가능하고 이에 추가적으로 다른 패키지의 자손클래스에서도 접근이 가능한 것이다.
아래 표를 보자
제어자 | 같은 클래스 | 같은 패키지 | 자손클래스 | 전체 |
public | O | O | O | O |
protected | O | O | O | |
(default) | O | O | ||
private | O |
오른쪽일 수록 접근 범위가 넓은 것이다. 예를 들어 default의 경우 같은 패키지에서 접근이 허용되므로 당연히 같은 클래스에서도 접근이 허용되는 것이다.
protected 표의 자손클래스는 다른패키지의 자손클래스를 뜻한다.
정리하자면 아래와 같다.
접근제한없음 같은 패키지+(다른pkg)자손 같은 패키지 같은 클래스
public > protected > (default) > private
접근범위를 본다면, public이 제일 넓고 private이 제일 좁다.
사용예시 1
클래스 앞에 붙일 수 있는 것은 public,default 두개뿐이다. default는 클래스 앞에 생략해도 사용가능하다.
iv,cv,method() 등 멤버에게는 public,protected,default,private 4개 다 사용가능하다.
실습
package cs;
public class MyParent{ //접근제어자가 (public )
private int prv; //같은 클래스
int dft; //default //같은 패키지
protected int prt; //같은패키지 + 자손(다른패키지)
public int pub; //접근제한 없음.
public void printMembers() {
System.out.println(prv); //OK
System.out.println(dft); //OK
System.out.println(prt); //OK
System.out.println(pub); //OK
}
}
class MyParentTest { //접근 제어자가 (default)
public static void main(String[] args) {
MyParent p = new MyParent();
System.out.println(p.prv); //에러
System.out.println(p.dft); //OK
System.out.println(p.prt); //OK
System.out.println(p.pub); //OK
}
}
이 MyParentTest.java 파일은 cs 패키지 내에 존재한다.
printMembers() 메서드는 같은 클래스 내에서 메서드가 위의 멤버들을 호출한다.
같은 클래스내의 변수라서 prv,dft,prt,pub 4개 모두 사용가능하다.
밑의 또 다른 클래스인 MyParentTest를 만들어 주고 Myparent 객체를 생성 후에 변수를 호출해 보았다.
그러면 p.prv가 호출이 안되는 것을 볼 수 있는데 이는 접근범위가 안맞는 것이다. 나머진 다 잘 호출이 된다.
private 멤버인 prv는 같은 클래스내에서만 사용가능하므로 MyParent 클래스 내에서만 사용가능한 것이다. 그래서 다른 클래스인 MyParentTest에서는 사용이 불가한 것이다.
dft 멤버는 default 접근제어자를 가지고 있다. 이는 생략가능하므로 생략하였다. default 멤버는 같은 패키지내에서 사용가능 한 것이다. default 멤버는 같은 패키지 cs에 들어가있으므로 다른 클래스라도 접근이 된 것이다.접근제한이 더 넓은 prt,pub는 MyParentTest에서 당연히 접근이 되는 것을 볼 수 있다.
아래 사진을 보자
패키지는 즉, 폴더이다. 클래스는 폴더 내에 파일로 저장 될 것이다. 예로, default는 cs폴더에 있는 클래스 파일들에 다 접근 가능한 것이다 .
다른 패키지에 새로운 자바 파일을 만들어 보았다.
오른쪽이 새로운 자바 파일이다. 이는 cs2 패키지에 있다
먼저 MyChild 클래스는 MyParent를 상속한다.
결과는 아래와 같다.
private 멤버변수인 prv의 경우 MyParent 클래스 변수를 벗어나니 당연히 다른 패키지에 있는 MyChild 클래스에서는 prv가 접근이 안된다.
dafault 멤버변수인 dft의 경우 cs2는 다른 패키지이므로 MyChild 클래스에서 접근이 되지 않는다.
나머지는 접근이 된다.
protected 멤버변수인 prt의 경우 같은 패키지 + 다른 패키지의 자손 까지 접근이 가능하기 때문이다. MyChild는 MyParent의 자손이므로 접근이 된다.
MyParentTest2 클래스를 보자. 이 때 public 멤버변수인 pub만 접근이 된다.
MyParent의 입장에서 MyChild는 자손이지만, MyParentTest2는 완전히 다른 패키지의 다른 클래스이다.
따라서 public 멤버변수인 pub만 되는 것이다. 왜냐하면 public 은 접근제한이 없으니까 ~~ !
실습 예제를 아래와 같이 접근범위를 정리해보았다.
이번엔 Package Explorer로 확인해보자.
패키지가 cs, cs2가 있고 클래스들이 2개씩 패키지에 들어가 있다.
MyParent 클래스에는 멤버 변수 4개가 있다. 접근이 다되는 public은 초록색원, 접근 제한이 제일 큰 private은 빨간 네모로 중간 정도의 접근 제한을 가진 protected는 노란색 마름코꼴 같은 패키지 내에서 사용할 수 있는 default는 파란색 세모로 표현되었다.
이는
이렇게 될텐데, prv 변수는 MyParaent 클래스내에서의 메서드인 printMembers()에서는 접근이 되겠지만 MyParentTest클래스의 main 메서드에서는 접근이 안된다. 물론 다른 패키지인 cs2에서는 모든 클래스에서 접근이 안된다.
defaut 접근을 가지는 dft 변수는 같은 cs 패키지인 MyParent 클래스의 printMembers() 와 MyParentTest 의 메인 메서드에서는 접근이 되지만, 다른 패키지인 cs2에서는 접근이 안된다.
protected 접근을 가지는 prt 변수는 Myparent 클래스와 MyparentTest 클래스에서는 당연히 접근이 되고 cs2 패키지의 MyChild 클래스는 MyParent 클래스의 자식이다. 따라서 MyChild 클래스의 printMembers()에서 prt 변수는 접근이 되지만 MyParentTest2의 main문에서는 접근이 되지 않는다.
public은 cs1의 클래스 모두, cs2의 클래스 모두에서 접근이 된다.
직접 폴더를 보면서 확인해보자
이렇게 내가 만든 패키지 cs와 cs2가 있다.
폴더 내부는 각각 이렇다.
클래스 "파일" 들이 있다. eclipse에서는 MyParent 클래스와 MyParentTest 클래스가 같은 소스파일에 있었지만 컴파일 하고 나면 별도의 클래스 파일로 존재한다.
private는 하나의 클래스 즉, MyParent.class 파일내에서만 접근가능한 것이다.
default 는 하나의 폴더 즉, cs 폴더내의 파일에 모두 접근 가능 한 것이다.
그냥 일반적인 컴퓨터에서 파일 보다 더 큰 범위는 당연히 파일이다. 자바의 접근범위도 이와 같다.
그리고 protected는 다른 패키지지만 자손 클래스인 cs2의 MyChild.class에서 접근이 가능한 것이다.
출처: [자바의 정석 - 기초편] ch7-21 접근제어자
'Java > etc' 카테고리의 다른 글
커맨드창에서 argument 전달하기 [자바] (0) | 2023.02.27 |
---|---|
라이브러리와 패키지 [자바] (0) | 2023.02.23 |
함수(Function)과 메서드(Method)의 차이 (0) | 2023.01.17 |
Scanner, InputStream, BufferedReader (0) | 2023.01.17 |
상속과 구현의 차이 (0) | 2023.01.17 |