[JAVA] 캡슐화와 접근제어자, 다형성
캡슐화와 접근제어자
캡슐화
외부로부터 데이터를 보호하기 위해서, 내부적으로만 사용되는 것을 감추려고 접근제어자를 사용한다.
직접 접근을 막고 메소드로 간접 접근허용시키면 메소드로만 접근이 가능하다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class Time {
private int hour; // private로 같은 클래스를 제외한 외부 접근 금지
public void setHour(int hour) {
if (0 <= hour && hour < 24) {
this.hour = hour;
}
}
public int getHour() {
return hour;
}
}
public class Main {
public static void main(String[] args) {
Time time = new Time();
time.setHour(24);
System.out.println("Hour : " + time.getHour()); // 0
time.setHour(5);
System.out.println("Hour : " + time.getHour()); // 5
}
}
위 코드에서 setHour
로 시간을 24
로 걸어주었지만 0이상 24 미만일 경우에 멤버변수 값이 수정되어 있기 때문에 처음 값은 반영이 안 되어 0
이 되는 것이다.
접근제어자(Access modifer)
- public : 접근 제한이 없다.
- private : 같은 클래스 내에서만 접근 가능
- (default) : 같은 패키지 내에서만 접근 가능
- protected : 같은 패키지 내에서와 다른 패키지의 자식 클래스에서 접근 가능
제어자 | 같은 클래스 | 같은 패키지 | 자식 클래스 | 전체 |
---|---|---|---|---|
public | O | O | O | O |
protected | O | O | O(다른 패키지) | X |
(default) | O | O | X | X |
private | O | X | X | X |
다형성(polymorphism)
- 부모 타입 참조변수로 자식 타입 객체를 다루는 것
- 자식 타입의 참조변수로 부모 타입 객체를 가리킬 수 없다.
일반 TV에는 전원과 볼륨 채널 조절 기능만 있다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class TV {
void power() {
}
void volumeUp() {
}
void volumeDown() {
}
void channelUp() {
}
void channelDown() {
}
}
스마트 TV에는 일반 TV에서 추가적으로 어시스턴스 기능이 있다면 아래처럼 상속하여 클래스를 생성할 수 있다.
1
2
3
4
class SmartTV extends TV {
void assistance() {
}
}
위 클래스들을 참조 변수를 생성해 초기화할 때 아래 코드와 같이 부모타입 참조 변수로 자식 클래스명으로 된 객체만 생성할 수 있다.
1
2
Tv t = new smartTv(); // 부모타입 참조변수(Tv),자식객체(smartTv)일 경우 허용
SmartTV s = new TV(); // 자식타입 참조변수(smartTv), 부모객체(Tv)일 경우 에러
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.