[Java] 08. 접근 제한자 (public, default, protected, private)
클래스를 만들 때에는 public <클래스명>
으로 시작합니다
그리고 새로운 클래스를 만들어서 변수를 사용할 때에는 private <변수명>
을 권장합니다
public, default, protected, private
자바에 있는 접근 제한자 4가지에 대해 알아보도록 합시다빠른 요약
접근자 클래스 내부 패키지 상속받은 클래스 그 외 private O O O O protected O O O X default O O X X private O X X X
이 글에서는 패키지를 ‘디렉토리(경로)’로 설명했지만 다음부터는 그대로 패키지라 부르도록 하겠습니다
1. 접근 제한자 / public, default, protected, private
1-1. public
앞서 언급한 접근 제한자는 4가지 접근 권한에 따라 나뉘어집니다
- 클래스 내부
- 패키지
- 상속받은 클래스
- 그 외
‘public’은 어디에서든 사용할 수 있습니다
마치 이전 예제처럼 Person p = new Person();
라는 인스턴스를 만들고 p.age = 20;
을 주는 것 처럼요
또는 외부 패키지 (여기서 패키지는 다른 디렉토리에 있는 클래스로 이해하시면 됩니다)로 불러와도 사용할 수 있구요
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
// OtherPackage 디렉토리에 만든 Person 클래스
package OtherPackage;
public class Person {
public String name;
public int age;
public void print() {
System.out.println("name : " + name + ", age : " + age);
}
}
// MainPackage 디렉토리에 만든 Person 클래스
package MainPackage;
import OtherPackage.Person;
public class Main {
public static void main(String[] args) {
Person p = new Person();
p.name = "홍길동";
p.age = 87;
p.print(); // 출력 : [ name : 홍길동, age : 87 ]
}
}
1-2. default
보통 default를 작성하지는 않고 생략하며 작성합니다
클래스 내에서 default int a;
라고 쓸 필요 없이 그냥 int a;
를 쓰면 default가 되는 것이죠
만약 int a
라고 작성할 경우, 다른 패키지에 있는 클래스에서는 접근할 수 없습니다
따라서 위의 public
예시를 default
로 바꾸면 정상적으로 작동하지 않습니다
1-3. protected
여기서 ‘자식 클래스’는 ‘상속’과 관련된 내용입니다
조만간 포스트로 작성할 예정이니 그 때 확인하고 다시 돌아보면 될 것 같습니다
default
와 마찬가지로 다른 패키지에 있는 클래스에서는 접근할 수 없습니다..만 자식 클래스에는 접근할 수 있습니다
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
40
41
42
43
// OtherPackage 디렉토리에 만든 Parent 클래스
package OtherPackage;
import NewOtherPackage.Child;
public class Parent {
protected String name = "홍길동";
protected int age = 63;
public void setChildAge(Child c,int age) {
c.age = age; // Child는 Parent로 상속받기 때문에 접근 가능
}
public void print() {
System.out.println("name : " + name + ", age : " + age);
}
}
// NewOtherPackage 디렉토리에 만든 Child 클래스, Parent 클래스를 상속
package NewOtherPackage;
import OtherPackage.Parent;
public class Child extends Parent {
}
// MainPackage 디렉토리에 만든 Main 클래스
package MainPackage;
import NewOtherPackage.Child;
import OtherPackage.Parent;
public class Main {
public static void main(String[] args) {
Parent p = new Parent();
Child c = new Child();
// c.age = 20; <-- 컴파일 에러 발생
p.setChildAge(c, 24);
p.print(); // 출력 : [ name : 홍길동, age : 24 ]
}
}
1-4. private
자기 자신의 클래스를 제외하고는 접근할 수 없습니다
private로 구성된 변수를 포함하는 객체로 새로운 인스턴스를 만들면 그 변수에는 접근할 수가 없습니다
- Q. 그러면 어떻게 값을 바꾸고 읽어오는건지?
- A. 메소드는 public으로 지을 수 있습니다, 그리고 해당 메소드를 호출하면 그 메소드에서는 값을 바꿀 수 있겠죠
즉, 값을 바꾸거나 불러오는 과정을 ‘메서드’로 진행하게 되는 것입니다
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
// OtherPackage 경로에 만든 Person 클래스
package OtherPackage;
public class Person {
private int age;
private String name;
public Person(int age, String name) {
this.age = age;
this.name = name;
}
/* Setter */
public void setAge(int age) {
this.age = age;
}
public void setName(String name) {
this.name = name;
}
/* Getter */
public int getAge() {
return age;
}
public String getName() {
return name;
}
public void print() {
System.out.println("name : " + name + ", age : " + age);
}
}
// MainPackage에 만든 Main 클래스
package MainPackage;
import OtherPackage.Person;
public class Main {
public static void main(String[] args) {
Person p = new Person(34, "홍길동"); // 생성자는 아직 배우지 않았습니다
// 이것도 마찬가지로 자기 자신의 메소드를 불러와 값을 지정해줍니다
// Getter로 값을 불러와서 출력
System.out.println("이 사람의 이름과 나이 : " + p.getName() + ", " + p.getAge());
// 출력 : [ 이 사람의 이름과 나이 : 홍길동, 34 ]
// Setter로 값을 변경한 뒤 출력
p.setAge(50);
p.print();
// 출력 : [ name : 홍길동, age : 50 ]
}
}
2. 자바에서 접근 제한자를 사용하는 목적
간단하게 말하자면 데이터를 보호할 수 있습니다
조금 어렵게 설명하자면 데이터의 무결성과 안정성을 보호할 수 있다고 볼 수 있습니다
외부에서 함부로 데이터에 접근하여 수정하는 것을 방지할 수 있고 메서드로만 데이터에 접근할 수 있도록 하는 것이죠