- 정보은닉: private으로 정보은닉하면 외부에서 읽을 수 없다
- 정보은닉의 단계: private → default → protected → public
- 캡슐화: 정보은닉된 클래스를 set, get메서드를 통하여 외부에서 읽고 쓸 수 있게 된다.
- 마우스 오른쪽 클릭 → source → Generate getter and setter... 를 통해 자동으로 소스를 생성할 수 있다.
package vo;
public class Data {
public int x;
private int y;
}
package vo;
public class Data2 {
public int x;
private int y;
}
// 필드가 정보은닉이 안된 Data클래스 (x,y는 public이므로 외부에서 읽기, 쓰기 가능)
Data d = new Data();
d.x = 7;
d.y = 10;
System.out.println(d.x);
System.out.println(d.y);
Data2 d2 = new Data2();
d2.x = 7;
// d2.y = 10; // Data2클래스의 y 필드는 private으로 정보은닉 되어있다 (즉, d2.y는 읽기, 쓰기 불가능)
System.out.println(d2.x);
// System.out.println(d2.y);
package vo;
// 필드(속성)정보은닉 + 필드캡슐화
public class Data3 {
private int x; // 정보은닉
private int y; // 정보은닉
public int getX() { // getX를 호출하면 읽기 가능 -> 읽기 캡슐화 메서드
return this.x;
}
public int getY() { // getY를 호출하면 읽기 가능 -> 읽기 캡슐화 메서드
return this.y;
}
public void setX(int x) { // getX를 호출하면 쓰기 가능 -> 쓰기 캡슐화 메서드
/*
if(x<0) { // 입력값은 양수만 가능하게 함
return;
}
*/
this.x = x;
} // int값 x를 입력받아서 this.x에 저장하고, 반환값은 없으므로 void
public void setY(int y) { // getX를 호출하면 쓰기 가능 -> 쓰기 캡슐화 메서드
this.y = y;
} // int값 y를 입력받아서 this.y에 저장하고, 반환값은 없으므로 void
// static메서드는 클래스이름.메서드로 쓰기 때문에 this를 쓸수 없다
}
Data3 d1 = new Data3();
Data3 d2 = new Data3();
d1.setX(777);
d2.setX(444);
System.out.println(d1.getX()); // getX의 this -> d1 -> 반환값 777
System.out.println(d2.getX()); // getX의 this -> d2 -> 반환값 444
package vo;
// 메서드 캡슐화
public class A {
private String getFirstName() { // 메서드 정보은닉
return "구디";
}
private String getSecondName() {
return "아카데미";
}
public String getFullName() {
return this.getFirstName()+this.getSecondName();
}
/*
public static void main(String[] args) {
A a = new A();
String name = a.getFullName();
System.out.println(name);
}
*/
}
A a = new A();
String name = a.getFullName();
System.out.println(name);
// 메서드가 private으로 정보은닉되어 있어 읽고 쓸 수 없다.
// String fname = a.getFirstName();
// System.out.println(fname);
캡슐화를 하면 메서드에서 데이터값의 범위를 정할 수 있다.
package vo;
import java.util.Calendar;
public class Person {
private int birth; //필드 은닉
/*
private int getBirth() { //getter(메서드) 은닉 -> 사용하지 않으므로 삭제해도 무방
return birth;
}
*/
public void setBirth(int birth) {
if(birth>0) { // birth는 0보다 큰 값만 저장 가능
this.birth = birth;
}
}
public int getAge() {
if(this.birth > 0) { //birth가 0보다 클 때에만 age출력
Calendar c = Calendar.getInstance();
int y = c.get(Calendar.YEAR);
return y-this.birth;
}
return 0; // 아닌 경우는 0 출력
}
}
Person 루피 = new Person();
루피.setBirth(1995);
// System.out.println(루피.getBirth()); // getBirth은닉되어 있어 출력할 수 없다
System.out.println(루피.getAge());
구글링을 통해 직접 방법을 찾아 이전, 현재, 다음이 아닌 페이지 블럭을 설정하여 페이징을 구현하였다.
(출처: https://beaniejoy.tistory.com/26?category=981157)
처음에는 정말 직접 찾아서 할 수 있을까 걱정했는데 여러 방법들을 읽고 찾아보면서 지금까지 배우고 연습한 내용으로도 충분히 이해가 가능했다. 앞으로도 시간이 있을 때마다 원하는 기능들을 찾아서 적용해봐야겠다.