JAVA

221011 은닉-getter와 setter

주영재 2022. 10. 11. 15:05

은닉
캡슐화-비슷한 것끼리 묶어서 만든다.
은닉-상세한 내부 구현을 숨기고 필요한 부분만 보이게 한다
은닉을 사용하기 위해서 클래스의 멤버변수의 접근제한자를 private으로 설정한다.-변수 값을 바꾸지 못함
변수의 값을 저장시키는 setter메서드, 변수의 값을 얻어오는 getter메서드.-얘네의 접근제한자는 public.
->유효성을 검증할 수 있는 루틴을 넣을 수 있다.
꼭 멤버변수만 private 제한자인 것은 아니다. 외부에 공개하고 싶지 않은 메서드들도 private으로 선언 가능

 

badcase

package day07.encap.bad;

public class MyBirth {
	//좋지 못한 예제
	public int year;
	public int month;
	public int day;
	public String ssn;//주민번호
	
	public void info() {
		System.out.println(year + "년 "+month+"월 "+day+"일");
		System.out.println("주민번호: "+ssn);
	}

}
package day07.encap.bad;

public class MainClass {
	public static void main(String[] args) {
	
		//변수를 public으로 만들어두면, 잘못된 값이 저장될 수 있습니다.
		MyBirth me = new MyBirth();
		me.year=2023;
		me.month=13;
		me.day=32;
		me.ssn="아무값";
		
		me.info();
		
		
	}
}


2023년 13월 32일
주민번호: 아무값

월, 일과 주민번호가 잘못된 값이 저장되었다. 이는 은닉이 되지 않아 생성한 사람이 임의로 값을 지정할 수 있기 때문이다.

 

goodcase

package day07.encap.good;

public class MyBirth {
	private int year;
	private int month;
	private int day;
	private String ssn;//주민번호

	/*
	 * 은닉된 변수에 접근할 때 클래스설계자가 만들어 놓은 
	 * getter/settre메서드를 사용합니다.
	 * 
	 * 국룰-get시작(값을 얻는다), set시작(값을 저장한다).
	 * 
	 * set메서드
	 * 1.값을 저장하는 메서드
	 * 2.public으로 선언하고 set+멤버변수명으로 저장
	 * 
	 */


	public void setYear(int year) {//이름정할땐 카멜표기법을 따른다. 안그럴 시 오류날 수도 있음
		//유효값 검증
		if(year>2022||year<1900) {
			System.out.println("년도는 1900~2022까지 입니다");
		}else {
			System.out.println("저장완료");
			this.year = year;
		}
	}
	/*
	 * get메서드
	 * 1.값을 조회하는 메서드
	 * 2.public으로 선언하고 get+멤버변수명으로 저장
	 */
	public int getYear() {
		return year;
	}

	/*
	 * month, day, ssn에 대한 getter, setter 생성
	 * month - 1~12월까지만 저장가능
	 * day - 1~31일 까지만 저장가능
	 * ssn - 하이픈을 제거하고 13자리까지만 저장
	 */

	public void setMonth(int month) {
		if(month>12||month<1) {
			System.out.println("월은 1~12까지 입니다");
		}else {
			System.out.println("저장완료");
			this.month=month;
			
		}
	}
	
	public int getMonth() {
		return month;
	}
	
	public void setDay(int day) {
		if(day>31||day<1) {
			System.out.println("일은 1~31까지 입니다");
		}else {
			System.out.println("저장완료");
			this.day=day;
		}
	}

	public int getDay() {
		return day;
	}
	
	public void setSsn(String ssn) {
		ssn=ssn.replace("-", "");
		if(ssn.length()!=13) {
			System.out.println("주민번호는 13자리입니다");
		}else {
			System.out.println("저장완료");
			this.ssn=ssn;
		}
	}
	
	public String getSsn() {
		return ssn;
	}

	public void info() {
		System.out.println(year + "년 "+month+"월 "+day+"일");
		System.out.println("주민번호: "+ssn);
	}
}
package day07.encap.good;

public class MainClass {
	public static void main(String[] args) {
		
		MyBirth me = new MyBirth();
		me.setYear(2022);//set
		int year=me.getYear();//get
		System.out.println("년도:"+year);
		
		me.setMonth(8);
		int month = me.getMonth();
		
		me.setDay(13);
		int day = me.getDay();
		
		me.setSsn("578130-1057809");
		String ssn = me.getSsn();
		
		me.info();
		
		
		
		
		
	}

}
저장완료
년도:2022
저장완료
저장완료
저장완료
2022년 8월 13일
주민번호: 5781301057809

은닉과 getter setter를 통해 유효성을 검증할 수 있게 만들었다.

따라서 생성한 사람이 임의로 값을 지정하더라도 유효성 검사에 걸리게 되며, 변수의 값을 제한한 의도대로 생성해야만 한다.