정보은닉
= 인스턴스 변수를 숨긴다
필요성 : 인스턴스 변수를 클래스 내부에서만 접근 하도록 허용하기 위해
class Circle{
double rad = 0;
final double PI = 3.14;
public void setRad(double R) {
if(R < 0) {
rad = 0;
return;
}
rad = R;
}
public double getArea() {
return (rad*rad)*PI;
}
}
public class makePrivate {
public static void main(String[] arg) {
Circle CC = new Circle();
CC.setRad(10);
System.out.println(CC.getArea());
}
}
이 코드에서
setRed() 부분을 거치지 않고 rad에 rad = -1하면 음수가 삽입되기에 오류 발생이 되게 해야된다
private double rad = 0;
private을 삽입하면 makePrivate class에서 rad = -1 입력시 오류가 발생된다
접근 수준 시지자
= 접근의 허용 수준을 결정할 때 선언하는 키
public : 선언 시 어느 위치 상관없이 인스턴스 생성 할 수 있다
protected : 선언 시 default가 선언하는 부분은 모두 허용한다 (클래스 상속)
또한 default가 허용하지 않는 '한 영역'에서의 접근도 허용
package helloworld;
public class makePP{
int num;
}
class makeProtected은 helloworld package 에 있는 makePP class를 상속 받는다
class makeProtected extends helloworld.makePP {
public void init(int n) {
num = n;
}
}
makeProtected부분에 num이 접근 불가해 에러남
protected int num;
변경 시 상속 받은 num에 접근 가능해짐
private : 선언 시 클래스 내부에서만 접근 할 수 있다
default : 선언 시 동일 패키지로 묶인 한에서만 인스턴스 생성 할 수 있다
class hello { ... }
public class hello1 {
void hello2() { ... }
}
클래스 정의 대상 | 인스턴스 변수, 메소드 정의 대상 | |
public | O | O |
protected | X | O |
private | X | O |
default | O | O |
캡슐화
= 데이터와 데이터 처리 행위를 묶고 외부에 그 행위를 보여주지 않는다
캡슐화 하기 전
package helloworld;
class oneAccessBefore {
void take() {
System.out.println("first Access");
}
}
class twoAccessBefore {
void take() {
System.out.println("second Access");
}
}
class mergeBefore {
void oneAccessM(oneAccessBefore cap) {
cap.take();
}
void twoeAccessM(twoAccessBefore cap) {
cap.take();
}
}
public class makeCapsuleBefore {
public static void main(String[] arg) {
mergeBefore CC = new mergeBefore();
CC.oneAccessM(new oneAccessBefore());
CC.twoeAccessM(new twoAccessBefore());
}
}
oneAccessBefore, twoAccessBefore 모두 인스턴스 화 시켜야된다
캡슐화 한 후
package helloworld;
class Access {
void oneTake() {
System.out.println("first Access");
}
void twoTake() {
System.out.println("second Access");
}
void take() {
oneTake();
twoTake();
}
}
class merge {
void takeOrder(Access cap) {
cap.take();
}
}
public class makeCapsule {
public static void main(String[] arg) {
merge CC = new merge();
CC.takeOrder(new Access());
}
}
Access만 인스턴스 화 시키면 된다 (행위를 은닉시킴)
'언어 > Java' 카테고리의 다른 글
메소드 오버로딩, String 클래스 (0) | 2022.06.25 |
---|---|
static - 정적 변수, 정적 메소드 (0) | 2022.06.20 |
클래스 패스, 패키지 (0) | 2022.06.19 |
클래스, 인스턴스, 생성자 (0) | 2022.06.19 |
메소드 재귀 호출 (0) | 2022.06.18 |