접근 제어 지시자(access modifier)와 정보은닉(information hiding)

kangsun·2023년 3월 15일
0

Java

목록 보기
38/44

접근 제어 지시자 (access modifier)


  • 클래스 외부에서 클래스의 멤버 변수, 메서드, 생성자를 사용할 수 있는지 여부를 지정하는 키워드

    • private : 같은 클래스(class) 내부에서만 접근 가능 (외부 클래스, 상속 관계의 클래스에서도 접근 불가)
    • 아무것도 없음 (default) : 같은 패키지(package) 내부에서만 접근 가능 (상속 관계라도 패키지가 다르면 접근 불가)
    • protected : 같은 패키지나 상속관계의 클래스에서 접근 가능하고 그외 외부에서는 접근 할 수 없음
    • public : 클래스의 외부 어디에서나 접근 할 수 있음



get() / set() 메서드


클래스에 멤버 변수를 선언할 때 다른 클래스에서 접근할 수 없도록 private 접근 제어자를 활용한다. 그럼에도 다른 클래스는 해당 클래스의 멤버 변수를 참조할 수 있다. getter와 setter를 통해서다.

  • private으로 선언된 멤버 변수 (필드)에 대해 접근, 수정할 수 있는 메서드를 public으로 제공
  • get() 메서드만 제공되는 경우 read-only 필드
  • 이클립스에서 자동으로 생성됨


✴︎ public으로 공개처리를 하는 것과 private으로 멤버 변수의 접근을 막고 get()과 set()을 해주는 방식이 어떤 차이가 있는가 ?
→ public 공개처리를 하면, date.month = 100; 처럼 값을 넣을 수 있다. month는 조건절로 1-12 월까지로 제한해야 하는데 그렇게 할 수 없다. 객체의 오용을 노출하게 되고 문제가 생기게 된다.

결론! 조건을 가진 멤버 변수들은 private으로 막아주고 메서드(set메서드에서)에서 제어를 해준다. 쓸데없는 데이터의 오용을 막아준다.

이렇게 멤버 변수에 접근 제한을 적용해줌으로써 객체를 사용할 때 오류를 막을 수 있고, 나중에 디버깅하기도 편하다. 어디서 잘못되었는지 메소드 쪽을 보면 된다. 사용하는 쪽에서 잘 못 사용하는 것을 방지해줄 수 있다.



private을 통한 정보 은닉


private은 정보은닉이라기 보단 정보를 보호한다라는 개념이다.

접근 제어자를 private으로 선언하면 같은 클래스끼리만 접근이 가능하다. 캡슐화라고도 부르는데, 요는 다른 클래스에서 접근하지 못하게 하기 위해서다.

  • private으로 제어한 멤버 변수도 public 메서드가 제공되면 (get,set) 접근 가능하지만 변수가 public으로 공개되었을 때보다 private일때 각 변수에 대한 제한을 public 메서드에서 제어 할 수 있다.
	public void setMonth(int month) {
		
		if(month < 1 || month > 12) {
			isValid = false;
		} else {
			isValid = true;
			this.month = month;
		}
	}
  • 객체 지향 프로그램에서 정보 은닉은 필요한 외부에서 접근 가능한 최소한의 정보를 오픈함으로써 객체의 오류를 방지하여 클라이언트 객체가 더 효율적으로 객체를 활용할 수 있도록 해준다.
profile
코딩 공부 💻

0개의 댓글