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를 통해 유효성을 검증할 수 있게 만들었다.
따라서 생성한 사람이 임의로 값을 지정하더라도 유효성 검사에 걸리게 되며, 변수의 값을 제한한 의도대로 생성해야만 한다.