private
넣어주기.
을 통해 접근 불가class Circle {
double rad = 0;
final double PI = 3.14;
public Circle(double r) {
setRad(r);
}
public void setRad(double r) {
if(r < 0) {
rad = 0;
return;
}
rad = r;
}
public double getArea() {
return (rad * rad) * PI;
}
}
// 외부에서 인스턴스 활용!
Circle c = new Circle(1.5);
System.out.println(c.getArea());
c.setRad(2.5);
System.out.println(c.getArea());
c.setRad(-3.3);
System.out.println(c.getArea());
c.rad = -4.5; // 컴파일 오류 발생 하지 않음 => 문제 발생 => 정보 은닉을 사용해서 직접 접근 막기
System.out.println(c.getArea());
class Circle {
// 외부에서 직접 접근시 컴파일 오류 발생
private double rad = 0;
final double PI = 3.14;
public Circle(double r) {
setRad(r);
}
public void setRad(double r) { // Setter
if(r < 0) {
rad = 0;
return;
}
rad = r;
}
public double getRad() { // Getter
return rad;
}
public double getArea() {...}
}
public > protected > default > private
클래스 정의 대상 : public, default
인스턴스 변수와 메소드 대상 : public , protected , default , private
클래스 정의 대상
// public
public class A{}
// default
class B{}
.
찍고 접근 가능.
찍고 접근 불가능.
찍고 접근 가능class AAA {
public int num1;
protected int num2;
private int num3;
int num4; // default 선언
public void md1() {..}
protected void md2() {..}
private void md3() {..}
void md4() {..} // default 선언
}
package alpha;
public class AAA {
protected int num;
}
public class ZZZ extends alpha.AAA {
public void init(int n) {
num = n; // 상속된 변수 num의 접근!
}
}
// 클래스를 분리해서 작성
class SinivelCap { // 콧물 처치용 캡슐
void take() {
System.out.println("콧물이 싹~ 납니다.");
}
}
class SneezeCap { // 재채기 처치용 캡슐
void take() {
System.out.println("재채기가 멎습니다.");
}
}
class SnuffleCap { // 코 막힘 처치용 캡슐
void take() {
System.out.println("코가 뻥 뚫립니다.");
}
}
class ColdPatient {
void takeSinivelCap(SinivelCap cap) {
cap.take();
}
void takeSneezeCap(SneezeCap cap) {
cap.take();
}
void takeSnuffleCap(SnuffleCap cap) {
cap.take();
}
}
class BadEncapsulation {
public static void main(String[] args) {
ColdPatient suf = new ColdPatient();
// 콧물 캡슐 구매 후 복용
suf.takeSinivelCap(new SinivelCap());
// 재채기 캡슐 구매 후 복용
suf.takeSneezeCap(new SneezeCap());
// 코막힘 캡슐 구매 후 복용
suf.takeSnuffleCap(new SnuffleCap());
}
}
class SinusCap {
void sniTake() {
System.out.println("콧물이 싹~ 납니다.");
}
void sneTake() {
System.out.println("재채기가 멎습니다.");
}
void snuTake() {
System.out.println("코가 뻥 뚫립니다.");
}
void take() { // 약의 복용 방법 및 순서 담긴 메소드
sniTake();
sneTake();
snuTake();
}
}
class ColdPatient {
void takeSinus(SinusCap cap) {
cap.take();
}
}
class OneClassEncapsulation {
public static void main(String[] args) {
ColdPatient suf = new ColdPatient();
suf.takeSinus(new SinusCap());
}
}
class SinusCap {
SinivelCap siCap = new SinivelCap();
SneezeCap szCap = new SneezeCap();
SnuffleCap sfCap = new SnuffleCap();
void take() {
siCap.take(); szCap.take(); sfCap.take();
}
}