자바의 정석 기초편 - 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 |