Java

[Java] 제어자(modifier) (2) - 접근 제어자, 그 외 제어자

토발자 2022. 8. 6. 15:18
반응형

이전 글에 이어서 이번 글에서는 접근 제어자에 대해 정리해보고자 한다.

 


 

접근제어자(access modifier)

  • 멤버변수 또는 클래스에 사용되며 해당하는 멤버변수 또는 클래스를 외부에서 접근하지 못하도록 제한하는 역할을 한다.
  • 클래스나 멤버변수, 메서드, 생성자에 접근 제어자가 지정되어 있지 않다면 default임을 의미한다.
  • 종류
접근 제어자 같은 클래스 같은 패키지 자손 클래스 전체
private O X X X
default O O X X
protected O O O X
public O O O O

 

그렇다면 접근 제어자를 사용하는 이유는 무엇일까?

이유에는 크게 2가지가 있다.

 

  • 외부로부터 데이터를 보호하기 위해
  • 외부에는 불필요하고, 내부적으로만 사용되는 부분을 감추기 위해

이것을 데이터 감추기(data hiding)라고 하며, 객체지향개념의 캡슐화(encapsulation)에 해당하는 개념이라고 할 수 있다.

 

위키백과에 따르면 캡슐화는 "객체의 속성과 행위를 하나로 묶고, 실제 구현 내용 일부를 내부에 감추어 은닉"하는 개념이다. 필요하다면 캡슐화에 대해서도 조금 더 자세하게 정리한 글을 포스팅하겠다.

 


 

이러한 캡슐화를 위해 접근 제어자를 사용하게 된다.

멤버변수를 private나 protected로 제한하고 멤버변수의 값을 읽고 변경할 수 있는 public 메서드를 제공해, 간접적으로 멤버변수의 값을 다룰 수 있도록 하는 것이 바람직하다.

아래 예시처럼 말이다.

 

public class Time {

	// 접근 제어자를 private로 해서 외부에서 직적접으로 접근하지 못하도록 한다.
	private int hour;
	private int minute;
	private int second;

	public int getHour(){
		return hour;
	}

	public void setHour(int hour){
		if(hour < 0 || hour > 23) return;
		this.hour = hour;
	}

	public int getMinute(){
		return minute;
	}

	public void setMinute(int minute){
		if(minute < 0 || minute > 59) return;
		this.minute = minute;
	}

	public int getSecond(){
		return second;
	}

	public void setSecond(int second){
		if(second < 0 || second > 59) return;
		this.second = second;
	}
}

모든 멤버변수의 접근 제어자를 private으로 하고 이 변수들을 다룰 수 있는 public 메서드를 추가했다.

만약 멤버변수의 접근 제어자를 public으로 했다면 hour, minute, second 변수가 0 미만인 경우 등에 대해 메서드를 변경했을 경우 테스트해야하는 범위가 아주 넓을 것이다.

 

그렇다면 아래처럼 메서드를 통한 접근만이 가능해진다.

public class TimeTest {
	public static void main(String[] args){
		Time time = new Time(10, 28, 17);
		// time.hour = 13; // 변수 hour에 직접 접근이 불가능하다.
		time.setHour(time.getHour() + 1); // 한 시간 뒤로 변경한다. 이렇게 메서드를 통해 간접적인 접근만 가능하다.
	}
}

 


2번의 포스팅에 걸쳐 제어자에 대해 정리해보았다.

어려운 내용은 없었지만 한 번 다시 정리하고 싶었는데 잘 정리가 된 것 같다.

 

출처 : Java의 정석(남궁성)

반응형