public > protected > default > private 왼쪽부터 오른쪽으로 가면서 접근 범위가 좁혀진다.
- Public: 접근에 제한이 없음
- Protected: 동일한 패키지 내에 존재하거나 상속된 클래스에서 접근 가능
- default: 아무런 접근 제한자를 명시하지 않으면 default 값이 되며, 동일한 패키지 내에서만 접근이 가능
- private: 자기 자신의 클래스 내에서만 접근 가능
이중 public과 private를 가장 많이 사용한다.
접근 제어자는 변수나 함수, 클래스에 대한 접근을 제한하여 객체가 가진 고유의 멤버 변수 값이 외부의 접근으로 인해 잘못 변경되는 것을 막을 수 있다.(캡슐화)
각 제어자의 접근 비교표를 보면,
제어자 | 같은 클래스 | 같은 패키지 | 같은 패키지 내의 상속 클래스 | 다른 패키지 내의 상속 클래스 | 전체 클래스 |
public | O | O | O | O | O |
protected | O | O | O | O | X |
default | O | O | O | X | X |
private | O | X | X | X | X |
각 제어자의 사용 범위를 보면,
제어자 | 클래스 | 클래스 내부(필드, 메소드) |
public | O | O |
protected | X | O |
default | O | O |
private | X | O |
예시 코드를 보면,
public과 private
package example;
class Test {
private int one;
public int setOne() {
one = 1;
return one;
}
}
public class Main {
public static void main(String[] args) {
Test test = new Test();
System.out.println("private 필드 접근 : " + test.one);
System.out.println("public 메소드 접근 : " + test.setOne());
}
}
이렇게 코드를 입력하고 실행하게 되면, 다음과 같은 출력이 나온다.
java: one has private access in example.Test
즉, test.one에서 private 필드에 접근을 한 것
default
아래와 같이 one과 setOne()에 아무런 접근 제한자를 설정하지 않으면.
package example;
class Test {
int one;
int setOne() {
one = 1;
return one;
}
}
public class Main {
public static void main(String[] args) {
Test test = new Test();
System.out.println("private 필드 접근 : " + test.one);
System.out.println("public 메소드 접근 : " + test.setOne());
}
}
private 필드 접근 : 0
public 메소드 접근 : 1
이렇게 아까는 private로 선언했던 변수 one에 직접 접근해도 에러가 나지 않는다.
protected
package example2;
public class Test {
protected int one;
protected int setOne() {
one = 1;
return one;
}
}
위와 같이 다른 패키지에서 Test 클래스의 내부 변수와 메소드가 protected로 선언된 경우에는 default와 마찬가지로 다른 패키지에 있을 때 선언한 변수와 메소드에 접근할 수 없다.
package example;
import example2.Test;
public class Main {
public static void main(String[] args) {
Test test = new Test();
System.out.println("protected 필드 접근 : " + test.one);
System.out.println("protected 메소드 접근 : " + test.setOne());
}
}
다음과 같은 에러가 난다. 즉, protected에 접근을 한 것이다.
java: one has protected access in example2.Test
그러나 이때, example 패키지의 Main 클래스가 다른 패키지 example2의 Test 클래스를 상속받으면, 다른 패키지에 있어도 에러가 발생하지 않는다.
package example;
import example2.Test;
public class Main extends Test{
public static void main(String[] args) {
// Test test = new Test();
Main main = new Main();
System.out.println("protected 필드 접근 : " + main.one);
System.out.println("protected 메소드 접근 : " + main.setOne());
}
}
아래와 같은 결과를 얻을 수 있다.
protected 필드 접근 : 0
protected 메소드 접근 : 1
모든 클래스와 필드나 메소드를 public으로 설정 시 코드의 유지보수가 어려울 수 있어, 하나의 클래스에서 내부 동작을 수정하는 행위가 시스템 전체에 영향을 주지 않도록 하되, 최소한의 접근 제어자를 사용하도록 해야한다.
'Programming > Java' 카테고리의 다른 글
[Java] 가비지 컬렉션(Garbage Collection) (0) | 2022.01.14 |
---|---|
[Online Study 2주차] 자바 데이터 타입, 변수, 그리고 배열 (0) | 2022.01.13 |
[Java] 변수 종류 - 클래스 변수 / 인스턴스 변수 / 지역 변수 (1) | 2022.01.13 |
[Online Study 1주차] JVM은 무엇이며 자바 코드는 어떻게 실행하는 것인가. (0) | 2022.01.11 |
[Java] static (0) | 2021.10.01 |