본문 바로가기

언어/Java

정보 은닉, 접근 수준 시지자, 캡슐화

정보은닉

= 인스턴스 변수를 숨긴다

 

필요성 : 인스턴스 변수를 클래스 내부에서만 접근 하도록 허용하기 위해

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