일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- nginx 한글 깨짐
- git
- 에뮬레이터 에러
- 안드로이드
- Android
- git 안드로이드 스튜디오 연동
- 안드로이드 스튜디오 에러
- 이클립스 코틀린
- E212: Can't open file for writing
- was server
- aws 리전 변경
- error while loading state for instance 0x0 of device 'goldfish_pipe
- doze mode
- aws 느림
- kotlin plugin
- toastmessage
- nextInt()
- utf8 인코딩
- git 저장소
- 도즈모드
- gitemoji
- ppk to pem
- BuildConfig
- AWS
- basic toast
- 코틀린 플러그인
- 탄력적 ip
- access modifier
- git commit 해쉬
- 자바
- Today
- Total
리얼라이져의 마케팅, 개발, 창업 블로그
Public, Protected,Private, default 차이점 본문
가끔 개발을 하다보면, 클래스, 변수 ,메소드 앞에 public, protected ,private 들이
붙어 있는 것을 볼때가 있습니다.
이들은 '접근제어자'(access modifier) 라고 불리는데요.
어떻게 사용하는지 알아보겠습니다.
우선 해당 자료를 검색해보면, 쉽게 접할수 있는 '접근제어자 별 접근범위'를 정리해둔 표입니다.
(접근 가능 o, 접근 불가 x)
default(없음) | private | protected | public | ||
동일 패키지 접근 |
같은 클래스 접근 | O | O | O | O |
상속 클래스 접근 | O | X | O | O | |
다른 클래스 접근 | O | X | O | O | |
다른 패키지 접근 |
일반 클래스 접근 | X | X | X | O |
상속 클래스 접근 | X | X | O | O |
솔직히, 저는 위표만 보고는 감이 오지 않았습니다. ㅠㅠ
그래서 직접 코드로 확인해보았습니다.
(모든 확인 방법은 변수를 가지고 확인하였습니다.)
먼저, 같은 패키지 같은 클래스에서 접근할때 입니다.
우선, 각 접근제한자를 이용하여 jjj package -> 접근제어자 class안에 변수들을 선언하고,
해당 class 안에 메인메소드를 두어 변수들을 출력해보겠습니다.
(변수명은 알아보기 쉽고 직관적이게 한글로....)
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
|
package jjj;
public class 접근제어자 {
private static String private접근="private 입니다.";
public static String public접근="public 입니다.";
protected static String protected접근="protected 입니다.";
static String default접근="default 입니다";
public static void main(String[] args) {
System.out.println(private접근);
System.out.println(public접근);
System.out.println(protected접근);
System.out.println(default접근);
}
}
|
cs |
결과는 아래와 같이 나옵니다.
모두 출력이 되는것을 보니까 같은 클래스안에서는
모든 접근 제한자가 접근이 허용 이 된다를 눈으로 볼수 있습니다.
다음은 같은 패키지 상속 클래스 에서 접근하려 할때입니다.
jjj패키지에서 접근제어자 class에 각 접근제어자를 이용한 변수 선언을 해놓고,
같은 jjj패키지 접근제어자하위클래스 class에서 접근제어자 class를 상속한뒤,
접근제저아 class 변수들을 사용해보겠습니다.
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
32
33
34
35
36
37
38
39
|
package jjj;
public class 접근제어자 {
private String private접근="private 입니다.";
public String public접근="public 입니다.";
protected String protected접근="protected 입니다.";
String default접근="default 입니다";
}
//아래는 위 접근제어자의 상속 클래스
package jjj;
public class 접근제어자하위클래스 extends 접근제어자 {
public static void main(String[] args) {
접근제어자하위클래스 상속클래스=new 접근제어자하위클래스();
System.out.println(상속클래스.public접근);
System.out.println(상속클래스.protected접근);
System.out.println(상속클래스.default접근);
}
}
|
cs |
위 코드를 보면, 부모 class에서
public,protected,default 변수들은 접근하여 받아왔지만, private는 보이지 않습니다.
위 사진과 같이 실제로 private 변수는 상속클래스에서 사용할수 있는 목록에 뜨지 않습니다.
이걸로 같은 패키지 상속 클래스에서는 부모 class의 private은 접근 불가능하고,
나머지 접근제어자는 접근이 가능하다는것을 알수 있었습니다.
다음은 같은 패키지 다른 클래스에서 접근 하려 할때입니다.
jjj 패키지 안에 접근제어자 class 그리고 접근제어자다른클래스 class를 만들어서
진행해보겠습니다.
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
32
33
34
35
36
|
package jjj;
public class 접근제어자 {
private String private접근="private 입니다.";
public String public접근="public 입니다.";
protected String protected접근="protected 입니다.";
String default접근="default 입니다";
}
//아래는 그냥 같은 패키지 안에 있는 다른
package jjj;
public class 접근제어자다른클래스 {
public static void main(String[] args) {
// TODO Auto-generated method stub
접근제어자 sd=new 접근제어자();
System.out.println(sd.default접근);
System.out.println(sd.protected접근);
System.out.println(sd.public접근);
}
}
|
cs |
위의 코드를 보면, 상속 클래스 처럼 private을 뺀 나머지 접근제어자들이 보입니다
이번 경우도 상속 클래스때와 마찬가지로,
private을 제외한 접근제한자들은 같은 패키지 내에서 다른 클래스에서의 접근이 가능했습니다.
다음은 다른 패키지에 있는 클래스에서 접근 하려 할때입니다.
kkk패키지 안에 '접근제어자다른패키지클래스 class' 를 만들고,
기존의 접근제한자 를 이용하여 변수를 선언한 'jjj 패키지의 접근제어자 class' 를 import 합니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
package kkk;//현재 패키지
import jjj.접근제어자;//jjj 패키지 가져옴.
public class 접근제어자다른패키지클래스 {
public static void main(String[] args) {
접근제어자 접근제어자=new 접근제어자();
System.out.println(접근제어자.public접근);
}
}
|
cs |
위의 코드와 사진을 보면 눈치채 시겠지만, public만 가지고 올수 있었습니다.
여기서 알수 있는 사실은 다른 패키지로 가져올수 있게 하는 접근제어자는 public 뿐이다 입니다.
이제 마지막으로, 다른패키지에서 접근제어자를 이용한 변수가 선언된 클래스를 상속한 클래스의 경우입니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
package kkk;//현재 패키지
import jjj.접근제어자;//jjj 패키지 가져옴.
public class 접근제어자다른패키지클래스 extends 접근제어자 {
public static void main(String[] args) {
접근제어자다른패키지클래스 접근제어자다른패키지클래스=new 접근제어자다른패키지클래스();
System.out.println(접근제어자다른패키지클래스.protected접근);
System.out.println(접근제어자다른패키지클래스.public접근);
}
}
|
cs |
이렇게 위 사진과 코드를 보면,
다른패키지에서 기존 클래스를 상속 한 클래스는 protected와 public을 사용한 변수들에는 접근 할수 있는 것을 볼수 있습니다.
이상 맨 위 표를 토대로 접근제어자('access modifier')별 접근 허용 범위를 코드로 확인해 보았습니다.
이상 끝~
개발자가 되기 위해 공부 중인 비전공자 학생입니다.
아직 부족하여, 부족하거나 틀린 내용이 있을수 있으니,
그부분에 대해서 생각을 댓글로 공유해주시면
감사하겠습니다.^^
'IT > 자바' 카테고리의 다른 글
자바 nextInt() 다음에 nextLine() 실행 안되는 현상 (0) | 2020.02.02 |
---|