되자!백엔드개발자

Java(자바) - 접근지정자 본문

개발공부/JAVA

Java(자바) - 접근지정자

HyunJng 2022. 7. 24. 16:21

접근지정자


클래스나 멤버들이 다른 클래스에서 접근해도 되는지의 여부를 선언하는 지시어이다. 객체 지향 특성을 살리기 위해서는 캡슐화의 원칙이 지켜지도록 가능한 한 접근 범위를 작게 하여 접근 지정자를 선정하는 것이 좋다. 특히 멤버변수는 특별한 이유가 없는 한 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;
	}
}