포스트

[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 : 같은 패키지 내에서와 다른 패키지의 자식 클래스에서 접근 가능
제어자같은 클래스같은 패키지자식 클래스전체
publicOOOO
protectedOOO(다른 패키지)X
(default)OOXX
privateOXXX

다형성(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 라이센스를 따릅니다.