제어자(modifier)
클래스와 클래스의 멤버(멤버 변수, 메서드) 에 부가적인 의미 부여
▶ 접근제어자 : public, protected, (default), private
▶ 그 외 : static, final, abstract, native, transient, synchronized
main() 메서드를 가지지 않는 대부분의 클래스는 외부 클래스에서 이용할 목적으로 설계된 라이브러리 클래스이다.
라이브러리 클래스를 설계할 때에는 외부 클래스에서 접근할 수 있는 멤버와 접근할 수 없는 멤버로 구분해서 필드, 생성자, 메서드를 설계한다.
객체 생성을 막기 위해 생성자를 호출하지 못하게 하거나 객체의 특정 데이터를 보호하기 위해 해당 필드에 접근하지 못하도록 막아야 한다. 또한 특정 메서드를 호출할 수 없도록 제한 할 수도 있다.
자바는 이러한 기능을 구현하지 위해 접근 제한자( Access Modifier)를 제공하고 있다.
접근제한 | 적용대상 | 접근할 수 없는 클래스 |
public | 클래스,필드, 생성자, 메서드 | 없음 |
protected | 필드, 생성자, 메서드 | 자식 클래스가 아닌 다른 패키지에 소속된 클래스 |
default | 클래스, 필드, 생성자, 메서드 | 다른 패키지에 소속된 클래스 |
private | 필드, 생성자, 메서드 | 모든 외부 클래스 |
접근범위
- public > protected > (default) > private
클래스의 접근 제한
클래스를 선언할 때 고려해야 할 사항은 같은 패키지내에서만 사용할 것인지, 아니면 다른 패키지에서도 사용할 수 있도록 할 것인지를 결정해야한다. 클래스에 적용할 수 있는 접근제한은 public, default 두가지 이다.
1. default 접근제한
클래스를 선언할 때 public을 생략했다면 클래스는 default 접근 제한을 가진다. 클래스가 default 접근제한을 가지게 된다면 같은 패키지에서는 아무런 제한 없이 사용할 수 있지만 다른 패키지에서는 사용할 수 없도록 제한된다.
2. public 접근제한
클래스를 선언할 때 public 접근제한자를 붙였다면 클래스는 public 접근제한을 가진다. 클래스가 public 접근제한을 가지게 되면 같은 패키지뿐만 아니라 다른 패키지에서도 아무런 제한없이 사용할 수 있다.
생성자의 접근 제한
접근제어자를 사용하는 이유
- 외부로부터 데이터를 보호하기 위함
public class Time {
public int hour;
public int minute;
public int second;
}
Time t = new Time();
t.hour = 25; //멤버변수에 직접 접근
Time 클래스의 인스턴스변수들을 보면 public 타입으로 선언되어 있다. t.hour = 25; 대입연산자를 사용하여 멤버변수에 직접 접근할 수 있다. 외부접근 막기 위해 코드를 변경해보면 아래와 같다.
public class Time {
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;
}
접근제어자를 private으로 하여 외부에서 직접 접근하지 못하도록 한다. 메서드는 public을 사용하여 외부에서 메서드를 통해서 인스턴스변수에 접근하도록 한다. 즉 메서드를 통해 간접접근을 허용시킨다.
static
final
https://float.tistory.com/111?category=1008448
'객체지향' 카테고리의 다른 글
참조변수의 형변환 (0) | 2021.11.08 |
---|---|
다형성 (0) | 2021.11.08 |
[상속] 참조변수 super, 생성자 super() (0) | 2021.11.05 |
[상속] 오버라이딩 (0) | 2021.11.05 |
[상속] 단일상속 , Object클래스 (0) | 2021.11.05 |