접근 제어자란?
접근 제어자는 클래스 내부 또는 외부에서 메소드 그리고 필드(변수)에 접근을 제어하는 역할을 하는 키워드이다. 클래스, 메소드에 접근한다는 것은 호출한다는 뜻이고 변수에 접근한다는 것은 변수의 값을 읽어 들인다는 뜻이다.
접근 제어자 종류
public : 외부에서 모든 접근이 허용된 접근 제어자이다.
protected : 같은 패키지에 속해있을 때 접근이 허용되고, 예외적으로 상속 관계에 있으면 접근이 허용되는 접근 제어자이다.
default : 앞에 접근 제어자를 붙이지 않았으면 자동으로 default 접근 제어자가 할당 된다. 같은 패키지에 속해있을 때 접근이 허용된다.
private : 같은 클래스 내에서만 접근이 허용되는 접근제어자이다.
따라서 public > protected > default > private 순으로 접근 허용 범위가 나뉘어진다.
클래스 접근 제어자
public 과 default 만 사용가능하다.
범위는 위의 접근 제어자와 동일하다.
하나의 자바 파일에 public 클래스는 하나만 등장할 수 있다.
하나의 자바 파일에 default 접근 제어자를 사용하는 클래스는 무한정 만들 수 있다.
위에서 접근 제어자 그리고 클래스 접근 제어자에 대해 알아봤다. 그럼 왜 접근 제어자가 필요할까? 그냥 public으로 설정 후 사용해도 상관없지 않을까? 라고 생각할 수 있다. 아래에서 예시를 통해 변수에 접근 제어자와 메서드에 접근 제어자가 필요한 이유를 설명하겠다.
위의 클래스는 Car 클래스에서 필드(변수)와 메서드를 모두 public으로 외부에서 모든 접근을 허용하였다. 이를 CarMain 클래스에서 보면
와 같이 모든 메서드와 변수가 접근 가능하다. 이러한 상황에서 무슨 일이 일어날 수 있을까? 실무에서는 각 파트별로 업무가 나누어져 있어서 클래스를 만든 사람과 클래스를 이용하는 사람이 다를 수 있어 클래스를 이용하는 사람은 속도를 설정하는데 있어서 변수를 바로 이용할 것인지 어떤 메서드를 이용할 것인지 혼란이 올 수 있다. 또한, 보안 측면에서도 위험할 수 있다. 따라서 Car 클래스를 아래와 같이 수정해 보자.
이 후 CarMain 클래스에서 Car 클래스의 인스턴스를 이용할려고 보면
와 같이 클래스 만든 사람의 의도에 맞게 변수와 메서드에 허용을 막음으로써 이용하는 사람도 혼란이 오지 않고 클래스를 쉽게 사용할 수 있다.
객체 지향 프로그래밍은 뒤에서 자세하게 설명을 할 예정이다. Java는 객체지향 프로그래밍언어 라는 것만 기억하자. 따라서 접근제어자는 객체지향 프로그래밍언어에서 다음과 같은 기능을 한다.
데이터와 메서드를 감춤으로써 외부에서는 꼭 필요한 기능만 노출하고 나머지는 모두 내부로 감추는 것이다