반응형
이전 글에 이어서 이번 글에서는 접근 제어자에 대해 정리해보고자 한다.
접근제어자(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의 정석(남궁성)
반응형
'Java' 카테고리의 다른 글
[Java] 코드 특정 구간의 실행 시간 구하기 (0) | 2023.06.14 |
---|---|
[Java] HashMap에 특정 key가 존재하는지 확인하기 (0) | 2023.04.17 |
[Java] new ArrayList<>() 와 Arrays.asList() 차이점 및 비교 (0) | 2022.12.26 |
[Java] HashMap과 HashSet의 차이 (0) | 2022.12.23 |
[Java] 제어자(modifier) (1) - 접근 제어자, 그 외 제어자( + 추상클래스와 인터페이스) (0) | 2022.08.06 |