JAVA OOP 캡슐화
JAVA OOP
1. 은닉성 (캡슐화 encapsulation)
외부와의 차단으로 변수들을 관리할 수 있다. class의 내부에서 접근 (처리)이 가능하도록 접근 지정자로 제어 할 수 있다.
종류
- private → 주로 멤버변수에 쓰임
- public → 주로 멤버메서드에 쓰임
- protected → 상속
Private
- 멤버변수에 사용하며 외부로 부터 변수에대한 접근을 차단한다.
- 접근을 위해서 setter/ getter 를 설정하여 변수를 관리한다.
- 만약 setter없이 getter만 설정하면 ‘읽기전용’으로 적용된다.
this
예제
- 문제 MyTv2클래스의 멤버변수 isPowerOn, channel, volume을 클래스 외부에서 접근할 수 없도록 제어자를 붙이고 대신 이 멤버변수들의 값을 어디서나 읽고 변경할 수 있도록 getter와 setter메소드를 추가하라.작성한 MyTv2클래스에 이전 채널(previous channel)로 이동하는 기능의 메소드를 추가해서 실행결과와 같은 결과를 얻도록 하시오.
-
MyTv2 클래스
public class MyTV2 { private boolean isPowerOn; private int channel; private int volume; private int prev; final int MAX_VOLUME = 100; final int MIN_VOLUME = 0; final int MAX_CHANNEL = 100; final int MIN_CHANNEL = 1; public boolean isPowerOn() { return isPowerOn; } public void setPowerOn(boolean isPowerOn) { this.isPowerOn = isPowerOn; } public int getChannel() { return channel; } public void setChannel(int channel) { prev = this.channel; this.channel = channel; } public int getVolume() { return volume; } public void setVolume(int volume) { this.volume = volume; } public void gotoPrevChannel() { this.setChannel(prev); } }
각 멤버변수에 private를 이용하여 접근제어를 하였고 get/set을 하여 관리할 수 있게 클래스를 생성하였다. ★로 표시된 곳은 _이전 채널_의 함수를 적용하기 위한 작업이다.
public void setChannel(int channel) {
prev = this.channel;
this.channel = channel;
}
-
prev 멤버변수에 처음채널 이전 설정된 멤버변수의 채널 을 저장해준다. - 그후 메서드의 파라미터 int channel로 받은 값을 멤버 변수로 넣어준다.
public void gotoPrevChannel() {
this.setChannel(prev);
}
setChannel() 메서드에 이전의 저장하였던 채널의 값을 파라미터로 넣은 식을 설정해준다. 이러면 gotoPrevChannel()메서드를 외부에서 실행하였을때 prev의 채널값이 설정이되고 이전채널로 돌아가게 된다.
public class MainClass {
public static void main(String[] args) {
MyTV2 t = new MyTV2();
t.setChannel(10);
System.out.println("CH: "+ t.getChannel());
t.setChannel(20);
System.out.println("CH: "+ t.getChannel());
t.gotoPrevChannel();
System.out.println("CH: "+ t.getChannel());
t.gotoPrevChannel();
System.out.println("CH: "+ t.getChannel());
}
}
//결과
CH: 10
CH: 20
CH: 10
CH: 20