접근 제어자 - Access Modifier

ymk·2023년 6월 7일
0
post-thumbnail

⛔ 접근 제어자란?

접근 제어자는 멤버 또는 클래스에 사용되고 해당하는 멤버나 클래스를 외부에서 접근하는 것을 제한하는 역할을 한다. 접근 제어자는 기본적으로 default이며 default일때는 생략되어 있다.

접근 제어자가 사용될 수 있는 곳:

  • 클래스
  • 멤버변수
  • 메서드
  • 생성자

접근 제어자 종류:

  • private - 같은 클래스 내에서만 접근 가능
  • default - 같은 패키지 내에서만 접근 가능
  • protected - 같은 패키지 내에서, 그리고 다른 패키지의 자손 클래스에서 접근 가능
  • public - 접근 제한이 전혀 없음

각 접근 제어자는 사용할 수 있는 대상이 정해져 있다.


💡 접근 제어자를 사용하는 이유

접근 제어자를 주로 멤버에 사용하는데 그 이유는 클래스의 내부에 선언된 데이터를 보호하기 위해서이다. 비밀번호와 같은 데이터나 유효한 값을 유지해야하는 경우 외부에서 함부로 변경하지 못하도록 하기 위해서는 접근을 제한하여야 한다. 이것을 데이터 감추기(data hiding)라고 하며, 객체지향 개념의 캡슐화(encapsulation) 에 해당하는 내용이다.
또한, 어느 클래스 내에서만 사용되는, 내부 작업을 위해 임시로 사용되는 멤버변수나 부분작업을 처리하기 위한 메서드 등의 멤버들을 클래스 내부에 감추기 위해서이다. 이것도 캡슐화에 해당한다.


적용 예시

public class Time {
    private int hour;
    private int minute;

    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;
    }

보통 멤버변수의 값을 읽는 메서드의 이름을 get멤머변수이름으로 하며 멤버변수의 값을 변경 또는 설정하는 메서드의 이름을 set멤머변수이름으로 한다. 필수는 아니지만 암묵적인 룰 이므로 따르는 것이 좋다. 이렇게 get으로 시작하는 메서드를 getter, set으로 시작하는 메서드를 setter라고 부른다.


🛠️ 생성자의 접근 제어자

생성자에 접근 제어자를 사용하면 인스턴스의 생성을 제한할 수 있다. 보통은 생성자의 접근 제어자와 클래스의 접근 제어자가 같지만 다르게 지정할 수도 있다.
생성자의 접근 제어자를 private으로 지정하면, 외부에서 생성자에 접근할 수 없으므로 인스턴스를 생성할 수 없게 된다. 하지만 클래스 내부에서는 인스턴스를 생성할 수 있다.

class Singleton {
	private static Singleton s = new Singleton();
    
	private Singleton() {
    	...
    }
    
    public static Singleton getInstance() {
    	return s;
    }
    
}

생성자에 대한 접근을 막고 대신 인스턴스를 생성하고 반환해주는 public 메서드를 제공함으로써 외부에서 이 클래스의 인스턴스를 사용할 수 있다. 이때 메서드는 public static 이어야 한다.
이렇게 함으로써 사용할 수 있는 인스턴스의 개수를 제한할 수 있다.

또한 자연스럽게 생성자가 private인 클래스는 다른 클래스의 조상이 될 수 없다. 자손 클래스의 인스턴스를 생성할 때 조상클래스의 생성자를 호출해야하는데, private이므로 호출하는 것이 불가능하기 때문이다.

그래서 클래스 앞에 final을 추가해서 상속할 수 없는 클래스라는 것을 알리는 방법이 있다.

public final class Singleton

Reference

Java의 정석 - 3rd Edition by. 남궁 성

profile
개발 공부 일지

0개의 댓글