[JAVA] 접근제어지시자
접근 제어 지시자(access modifier)
클래스 외부에서 클래스이 멤버 변수, 메서드, 생성자를 사용할 수 있는지 여부를 지정하는 키워드
- private : 같은 클래스 내부에서만 접근가능 (외부 클래스, 상속관계의 클래스에서도 접근 불가)
- default(아무것도 없음) : 같은 패키지 내부에서만 접근 가능 (상속 관계라도 패키지가 다르면 접근 불가)
- protected : 같은 패키지나 상속관계의 클래스에서 접근 가능하고 그 외 외부에서는 접근할 수 없음
- public : 클래스의 외부 어디서나 접근 할 수 있음
getter/setter 메서드
객체의 필드(데이터)를 외부에서 마음대로 읽고 변경할 경우 객체의 무결성(결점이 없는 성질)이 깨질 수 있다.
예를 들어 게임에서 공격력이 음수가 될 수 없는데 외부에서 음수로 변경할 경우 객체의 무결성이 깨진다.
이러한 문제점 때문에 객체 지향 프로그래밍에서는 직접적인 외부에서 필드 접근을 막고 대신 메소드를 통해 필드에 접근 하는 것을 선호한다. 이러한 역할을 하는 메소드가 Setter이다.
public void setPower(int power) {
// 방어적 코드를 작성한다.
if (power <= 0) {
System.out.println("잘못입력하였습니다.");
} else {
this.power = power;
}
}
power 매개값이 음수인 경우 잘못입력하였습니다 라는 메시지를 출력한다. 양수 입력인 경우 power에 값을 저장한다.
외부에서 객체의 필드를 읽을 때에도 메소드가 필요한 경우가 있다. 필드값이 객체 외부에서 사용하기에 부적절한 경우, 메소드로 적절한 값으로 변환해서 리턴할 수 있기 때문이다. 이러한 역할을 하는 메소드가 Getter이다.
private String name;
private int hp;
private int power;
private int level;
private double defense;
public int getPower() {
return power;
}
power 필드는 private 접근 제한을 가지므로 외부에서 읽지 못한다. power 필드를 읽기 위해서는 Getter 인 getPower() 메소드를 사용해야 한다.
정보은닉
private으로 제어한 멤버 변수도 public 메서드가 제공되면 접근 가능하지만 변수가 public으로 공개되었을 때보다
private일 때 각 변수에 대한 제한을 public 메서드에서 제어 할 수 있다.
객체지향프로그램에서 정보 은닉은 필요한 외부에서 접근 가능한 최소한의 정보를 오픈함으로써 객체의 오류를 방지하여 클라이언트 객체가 더 효율적으로 객체를 활용할 수 있도록 해준다.