Programming/Java

[JAVA] 캡슐화, 다형성

Supreme_YS 2021. 11. 8. 14:12

자바의 정석 기초편 - ch 7-22, 23


* 접근 제어자를 사용하는 이유 

- 외부로부터 데이터를 보호하기 위함

- 외부에는 불필요한, 내부적으로만 사용되는 부분을 감추기 위함

 

아래의 예시코드처럼 값에 직접접근을 할 수 있게 되면, 클래스 Time의 룰이 깨져버리는 참사가 일어난다.

(0~59의 값을 입력해야하는데 80을 입력하는 경우)

public class Time {
	public int hour;   // 0~23
    public int minute; // 0~59
    public int second; // 0~59
}

Time t = new Time();
t.hour = 25; // 멤버 변수에 직접 접근

따라서, 이 코드를 접근제어자를 사용해서 리팩토링한다면 다음과 같다.

public class Time {
	private int hour;
    private int minute;   // 접근 제어자를 private로 하여 외부에서 직접 접근하지 못하도록 한다.
    private int second;
    
    public int getHour() { return hour; }
    public void setHour(int hour) {
    	if (hour < 0 || hour > 23) return;
        this.hour = hour;
    }
 }

즉, 직접 접근은 막고, 메서드를 통한 간접 접근을 허용해서 로직을 구성한다. 이와 같은 방법을 캡슐화라고 한다. 

package AFTERCH6;

class Time {
    private int hour;   // 0~23사이의 값을 가져아함
    private int minute;
    private int second;

    public void setHour(int hour) {
        if (isValidHour(hour)) return;
        this.hour = hour;
    }

    // 매개변수로 넘겨진 hour가 유효한지 확인해서 알려주는 메서드
    // 조건식을 메서드로 분리 함 command+option+m 단축키
     private boolean isValidHour(int hour) {
        return hour < 0 || hour > 23;
    }

    public int getHour() { return hour; }
}

public class TimeTest {
    public static void main(String[] args){
        Time t = new Time();
        t.setHour(21);
        System.out.println(t.getHour()); // 21 출력
        t.setHour(100);
        System.out.println(t.getHour()); // 21 출력
    }
}

* 다형성 (polymorphism)

- 여러 가지 형태를 가질 수 있는 능력

- 조상 타입 참조 변수로 자손 타입 객체를 다루는 것

class TV {
	boolean power;
    int channel;
    
    void power() { power = !power;}
    void channelUp() { ++channel; }
    void channelDown() { --channel; }
}

class SmartTV extends TV {
	String text; 
    void caption() { ...}
}
/* 각각의 객체를 생성해서 다뤄야 하는데 */
TV t = new TV();
SmartTV s = new SmartTV();

/* 이처럼 타입 불일치가 OK가 되는 것을 다형성이라 함 */
/* 조상 타입의 참조 변수로, 자손 타입 객체를 다루는 상황 */
TV t = new SmartTV();

* 객체와 참조변수의 타입이 일치할 때와 일치하지 않을 때의 차이?

- 아래의 예시처럼 리모컨이 5개 밖에 기능을 못하는데 7개 기능을 가진 제품을 사용한다는 것이 왜 좋은 것일까?

/* SmartTV 멤버 7개의 기능을 사용할 수 있는 리모컨에 SmartTV를 생산함 */
SmartTV s = new SmartTV();

/* TV 멤버 5개의 기능을 사용할 수 있는 리모컨에 SmartTV를 생산함 */
TV t = new SmartTV();

/* 자손 타입의 참조변수로 조상 타입의 객체를 가리킬 수 없다 */
SmartTV s = new TV(); // 에러

* 참조변수의 타입은 인스턴스의 타입과 반드시 일치해야 한가?

- 일치하는 것이 보통이지만 일치 하지 않을 수도 있다. 다형성! 

 

* 참조변수가 조상타입일 때와 자손타입일 때의 차이?

- 사용할 수 있는 멤버의 갯수가 달라진다. 

 

* 자손 타입의 참조변수로 조상 타입의 객체를 가리킬 수 있나?

- 안됨. 

'Programming > Java' 카테고리의 다른 글

[JAVA] 매개변수의 다형성  (0) 2021.11.09
[JAVA] 참조변수의 형변환, Instanceof 연산자  (0) 2021.11.09
[JAVA] 제어자  (0) 2021.11.08
[JAVA STUDY] 6주차 : 상속  (0) 2021.11.07
[JAVA STUDY] 5주차 : 클래스(Class)  (0) 2021.10.29