되자!백엔드개발자
Java(자바) - 접근지정자 본문
접근지정자
클래스나 멤버들이 다른 클래스에서 접근해도 되는지의 여부를 선언하는 지시어이다. 객체 지향 특성을 살리기 위해서는 캡슐화의 원칙이 지켜지도록 가능한 한 접근 범위를 작게 하여 접근 지정자를 선정하는 것이 좋다. 특히 멤버변수는 특별한 이유가 없는 한 public의 선언을 자제하고 private으로 설정한다. 대신 public 메소드를 만들어 private 필드를 조작하도록 하는 것을 권장한다.
자바에서는 4가지가 있다.
멤버에 접근하는 클래스 | 멤버의 접근 지정자 | |||
private | 설정 X (default) | protected | public | |
같은 패키지의 클래스 | X | O | O | O |
다른 패키지의 클래스 | X | X | △ | O |
접근 가능 영역 | 본인 클래스 내 | 1. 본인 클래스 내 2. 동일 패키지 내의 다른 클래스까지 |
1. 본인 클래스 내 2. 동일 패키지의 다른 클래스 3. 다른 패키지의 자식클래스 |
모든 클래스 |
접근 지정자를 해주는 이유를 예시로 살펴보자.
아래처럼 시간과 관련된 클래스가 있다.
class Time {
public int hour;
public int minute;
public int second;
}
이 클래스의 인스턴스를 생성한 다음 아래처럼 잘못된 값을 지정한다고 해도 이대로면 막을 방법이 없다.
Time t = new Time();
t.hour = 25;
이런 경우를 대비하여 되도록 멤버변수를 private이나 protected로 제한하고 멤버변수의 값을 읽고 변경할 수 있는 getter & setter 함수를 public으로 제공하여 간접적으로만 멤버변수를 다룰 수 있도록 해야한다.
class Time {
private int hour;
private int minute;
private int second;
public int getHour() {
return hour;
}
public void setHour(int hour) {
this.hour = hour;
}
public int getMinute() {
return minute;
}
public void setMinute(int minute) {
this.minute = minute;
}
public int getSecond() {
return second;
}
public void setSecond(int second) {
this.second = second;
}
}
+) 접근제어자를 이용하여 인스턴스의 개수를 제한하는 방법
생성자를 private으로 만들고 클래스 내부에서 static private 인스턴스를 만들어 사용하면 인스턴스 객체를 제한할 수 있다.
다만 이러면 다른 클래스의 조상이 될 수 없다. 왜냐하면 자손 클래스가 생성자를 호출할 때 조상 클래스의 생성자도 호출되기 때문이다. 그렇기에 클래스 앞에 final을 붙여주어 상속될 수 없음을 나타내주는 것이 좋다.
final class Single{
private static Single s = new Single();
private Single() {
///...///
}
// 인스턴스를 생성하지 않고 호출할 수 있어야하므로 static이어야한다.
public static Single getInstance() {
return s;
}
}
'개발공부 > JAVA' 카테고리의 다른 글
JAVA(자바) - static / final (0) | 2022.07.24 |
---|---|
JAVA(자바) - JVM 실행 순서와 메모리 구조 (0) | 2022.07.24 |
JAVA(자바) - Class와 객체/생성자/this.와 this()/객체배열 (0) | 2022.07.24 |
JAVA(자바) - 객체지향과 절차지향 (0) | 2022.07.24 |
JAVA(자바) - 배열과 for-each문 (0) | 2022.07.14 |