클래스 외부에서 클래스의 멤버 변수, 메서드, 생성자를 사용할 수 있는지 여부를 지정하는 키워드
private
: 같은 클래스(class) 내부에서만 접근 가능 (외부 클래스, 상속 관계의 클래스에서도 접근 불가)아무것도 없음 (default)
: 같은 패키지(package) 내부에서만 접근 가능 (상속 관계라도 패키지가 다르면 접근 불가)protected
: 같은 패키지나 상속관계의 클래스에서 접근 가능하고 그외 외부에서는 접근 할 수 없음public
: 클래스의 외부 어디에서나 접근 할 수 있음클래스에 멤버 변수를 선언할 때 다른 클래스에서 접근할 수 없도록 private 접근 제어자를 활용한다. 그럼에도 다른 클래스는 해당 클래스의 멤버 변수를 참조할 수 있다. getter와 setter를 통해서다.
✴︎ public으로 공개처리를 하는 것과 private으로 멤버 변수의 접근을 막고 get()과 set()을 해주는 방식이 어떤 차이가 있는가 ?
→ public 공개처리를 하면, date.month = 100; 처럼 값을 넣을 수 있다. month는 조건절로 1-12 월까지로 제한해야 하는데 그렇게 할 수 없다. 객체의 오용을 노출하게 되고 문제가 생기게 된다.
결론! 조건을 가진 멤버 변수들은 private으로 막아주고 메서드(set메서드에서)에서 제어를 해준다. 쓸데없는 데이터의 오용을 막아준다.
이렇게 멤버 변수에 접근 제한을 적용해줌으로써 객체를 사용할 때 오류를 막을 수 있고, 나중에 디버깅하기도 편하다. 어디서 잘못되었는지 메소드 쪽을 보면 된다. 사용하는 쪽에서 잘 못 사용하는 것을 방지해줄 수 있다.
private은 정보은닉이라기 보단 정보를 보호한다라는 개념이다.
접근 제어자를 private으로 선언하면 같은 클래스끼리만 접근이 가능하다. 캡슐화라고도 부르는데, 요는 다른 클래스에서 접근하지 못하게 하기 위해서다.
public void setMonth(int month) {
if(month < 1 || month > 12) {
isValid = false;
} else {
isValid = true;
this.month = month;
}
}