* 은닉(Encapsulation)
- 은닉은 사용자에게 상세한 내부 구현을 숨기고 필요한 부분만 보이게 하는 것이다.
- 은닉을 사용하기 위해서는 클래스의 멤버변수의 접근제한자를 private으로 설정한다.
- 은닉된 멤버변수에 접근하기 위해서는 공개된(public) 메서드를 통해서 접근할 수 있는데, 변수의 값을 변경시키는 데, 변수의 값을 변경시키는데 사용되는 메서드는 setter메서드라고 부르며, 변수의 값을 얻어오는 데 사용하는 메서드를 getter메서드라고 부른다.
- 이처럼 공개 메서드를 이용하여 데이터를 변경시킬 경우 메서드 내에 데이터 유효성을 검증할 수 있는 루틴을 넣을 수 있다.
- 뿐만 아니라 경우에 따라 접근 권란을 체크할 수 있는 로직을 포함시키면 인가되지 않은 사용자에게 중요한 데이터나 로직을 숨길 수도 있고, 이를 제어할 수도 있다.
- 멤버변수만 private 제한자를 가지는 것은 아니다. 외부에 공개하고 싶은 않은 메서드들도 private으로 선언할 수 있다.
우선 은닉을 사용하지 않으면 생기는 문제점을 확인해보자.
package: encap.badcase
Name : MyBirth
package encap.badcase;
public class MyBirth {
int year;
int month;
int day;
void dateInfo() {
System.out.printf("내 생일은 %d년 %d월 %d일이다.",
year, month, day);
}
}
package: encap.badcase
Name : MainClass
package encap.badcase;
public class MainClass {
public static void main(String[] args) {
MyBirth b = new MyBirth();
b.year = 2018;
b.month = 10;
b.day = 41;
b.dateInfo();
/*
* 여기서의 문제점.
* day는 30일, 31일등 까지 밖에 없는데 41을 넣으면 문제가 생긴다.
* 이렇게 바로 b.으로 넣지 못하도록 하는게 은닉이다.
*/
}
}
실습. 은닉
package : encap.goodcase
Name: MyBirth
package encap.goodcase;
public class MyBirth {
/*
*은닉(캡슐화)을 사용하려면 데이터 참조를 제한할 멤버변수의 앞에
*private제한자를 붇입니다.
*/
private int year;
private int month;
private int day;
/*
* - 은닉된 멤버변수에 접근하기 위해서는
* 클래스 설계자가 미리 만들어 놓은 setter/getter메서드를
* 사용하여 데이터에 접근해야 한다.
*
* - setter메서드 선언
* 1. setter메서드는 은닉변수에 값을 저장시키기 위한 메서드이다.
* 2. 메서드의 접근제한자를 public으로 설정하여 이름은 일반적으로
* set + 멤버변수이름으로 지정한다.
*
*/
public void setDay(int day) {
if(day < 1 || day > 31) {
System.out.println("자못된 일수 입력입니다.");
}else {
this.day = day;
}
}
/*
* - getter메서드 선언.
* 1.getter메서드는 은닉변수의 값을 얻어낼 때 사용하는 메서드다.
* 2.setter와 마찬가지로 public제한으로 외부에 메서드를 공개하고 이름은
* 일반적으로 get + 멤버변수 이름으로 지정한다.
*/
public int getDay() {
return this.day;
}
// 이클립스 꿀팁! 마우스 우클릭 > Source > Generate Getters and Setters..
// 을 눌러보면 자동으로 메서드를 선언해준다. 여기서 이제 if문을 추가로 적어주면 된다.
package: encap.goodcase
Name: MainClass
package encap.goodcase;
public class MainClass {
public static void main(String[] args) {
MyBirth b = new MyBirth();
/* 은닉을 할경우 이렇게 하면안됨. (블록처리 : ctrl + shift + 원하는 부분드래그)
* b.year = 2018; b.month = 15; b.day = -31; System.out.println(b.year);
*/
//값을 유효성을 검사하고 값을 출력하는 은닉.
b.setDay(28);
System.out.println(b.getDay());
}
}
'IT' 카테고리의 다른 글
15-1. 자바 - 사용제한자 final (1) | 2022.09.26 |
---|---|
15. 자바 - 사용제한자 static (1) | 2022.09.26 |
13. 자바 - 접근제한자 (0) | 2022.09.25 |
10-1. SQL - DDL/DML/DCL (1) | 2022.09.22 |
10. 데이터베이스란? / MYSQL 설치 및 설정 (0) | 2022.09.22 |