본문 바로가기
Java/[패스트캠퍼스] Java & SpringBoot로 시작하는 웹 프로그래밍

Ch 02. 객체 지향 입문 - 10. 접근 제어 지시자(access modifier)와 정보은닉(infomation hiding)

by hinote 2022. 12. 30.

 

접근 제어 지시자 (accesss modifier)

  • 클래스 외부에서 클래스의 멤버 변수, 메서드, 생성자를 사용할 수 있는지 여부를 지정하는 키워드
    (부모자식클래스, 탑클래스, 슈퍼클래스 라고도 함) 굉장히 밀접한 관계가 있는 클래스 -상속되는 클래스

  • private : 같은 클래스 내부에서만 접근 가능 ( 외부 클래스, 상속 관계의 클래스에서도 접근 불가)


  • 아무것도 없음 (default) : 같은 패키지 내부에서만 접근 가능 ( 상속 관계라도 패키지가 다르면 접근 불가)
    -패키지의 역할 : 소스들의 묶음 (A패키지에는 이런 소스들만 묶어놨다, B패키지에는 이런 소스들을 묶어놨다)
    객체를 가지고 올때 어느 패키지에 속해있느냐 (나랑 같은 패키지에 있는 경우는 상관없음) , 다른 경우 임포트 해서 가지고 옴
    따라서 같은 패키지에 있을 떄는 아무것도 쓰지 않으면 사용 가능하지만 다른 패키지에 있을 때는 접근 불가

  • protected : 같은 패키지나 상속관계의 클래스(상위클래스에서 하위클래스로)에서 접근 가능하고
    그 외 외부에서는 접근 할 수 없음

  • public : 클래스의 외부 어디서나 접근 할 수 있음(공용으로 어디서나 접근 가능)

 

get()/ set() 메서드

(우클릭 > source > Generate Getters and Setters... > Select All)

 

  • private 으로 선언된 멤버 변수 (필드)에 대해 접근, 수정할 수 있는 메서드를 public으로 제공

  • get() 메서드만 제공 되는 경우 read-only 필드

  • 이클립스에서 자동으로 생성됨

 

 

BirthDay.java

 

public class BirthDay {

	private int day; //만약 private 없이 열어서 int만 사용한다면, 
    //멤버변수의 오용과 오류를 객체가 잘못 사용되는 것을 노출하게 되고 객체의 역할에 대해 문제가 생길 수 있음.
	private int month;	
    //그래서 private로 막아주고 메서드에서 제어를 해주는 것이 좋음
	private int year;	//get은 값을 가져가니까 상관없지만 
    //set에서 이런것들을 제어해주게 되면 쓸데없는 데이터의 오용을 막을 수 있다.
	//객체의 맴버변수에 접근제한을 가함으로서 객체를 사용할 때 오류를 막을 수 있고,
    //나중에 디버깅 할 때 편함

	private boolean isValid;	//boolean 의 기본값은 false이다.
	
	
	public int getDay() {
		return day;
	}
	
	public void setDay(int day) {
		this.day = day;
	}

	public int getMonth() {
		return month;
	}

	public void setMonth(int month) {
		if (month < 1 || month > 12) {
			isValid = false;
		}else {
			isValid = true;
			this.month = month;
		}

	}

	public int getYear() {
		return year;
	}

	public void setYear(int year) {
		this.year = year;
	}
	
	public void showDate() {
		if(isValid) {
			System.out.println(year + "년 " + month + "월 " + day + "일 입니다.");
		} else {
			System.out.println("유효하지 않은 날짜입니다.");
		}
	}
	
	public boolean getIsValid() {
		return isValid;
	}	//특히 isValid는 값이 유효한지만 체크할 때 많이 쓰기때문에 밖으로 내보낼 일 이 없어서 
	//밖으로 내보내고 싶을때 이렇게 제공하면 됨
	//대신 set은 제공하지 않음 - 이 날짜가 유효한지만 나타내는 것이기 때문에 Set이 필요하지 않음
	

}

 

 

BirthDayTest.java

 

public class BirthDayTest {

	public static void main(String[] args) {
		
		BirthDay date = new BirthDay();
		date.setYear(2019);
		date.setMonth(13);
		date.setDay(30);
		
		date.showDate();	//유효하지 않은 날짜입니다. 라는 결과가 나옴
	}

}

 

 

 

정보 은닉

  • private으로 제어한 멤버 변수도 public 메서드가 제공되면 접근 가능하지만
    변수가 public으로 공개되었을 때보다 private 일때 각 변수에 대한 제한을 public 메서드에서 제어 할 수 있다.

 

-- BirthDay.java 25째줄 참고

public void setMonth(int month) {
		
		if ( month < 1 || month > 12) {
			isValid = false;
		}
		else {
			this.month = month;
		}
	}
  • 객체 지향 프로그램에서 정보 은닉은 필요한 외부에서 접근 가능한 최소한의 정보를 오픈함으로써 객체의 오류를 방지하 클라이언트 객체가 더 효율적으로 객체를 활용할 수 있도록 해준다.

 

 

 

댓글