접근 제어자를 사용하는 이유
1) 외부로부터 데이터를 보호하기 위해서
2) 외부에는 불필요한, 내부적으로만 사용되는, 부분을 감추기 위해서
get멤버변수이름
으로 하고, 멤버변수의 값을 변경하는 메서드의 이름을 set멤버변수이름
으로 한다. 암묵적인 규칙이므로 특별한 이유가 없는 한 따르자.get
으로 시작하는 메서드를 '게터(getter)', set
으로 시작하는 메서드를 '세터(setter)'라고 한다.class Tv{
boolean power
int channel;
void power() {}
void channelUp(){}
void channelDown(){}
}
class SmartTv extends Tv{
String text; // 캡션(자막)을 보여주기 위한 문자열
void caption(){}
}
Tv t = new Tv();
SmartTv s = new SmartTv();
Tv t = new SmartTv();
SmartTv s = new SmartTv();
둘은 어떤 차이가 있을까.text
와 caption()
를 사용할 수 없다.부모타입의 참조변수로 자식타입의 인스턴스를 참조할 수 있다.
바내로 자식타입의 참조변수로 부모타입의 인스턴스를 참조할 수는 없다.
참조변수도 형변환이 가능하다.
서로 상속관계에 있는 클래스 사이에서만 가능하기 때문에 자식타입의 참조변수를 부모타입의 참조변수로, 부모타입의 참조변수를 자식타입의 참조변수로의 형변환만 가능하다.
바로 위 혹은 아래의 상속관계가 아니어도 가능하다. 부모의 부모로도 형변환이 가능한 것. 따라서 모든 참조변수는 모든 클래스의 조상인 Object클래스 타입으로 형변환이 가능하다.
하지만 같은 부모를 상속하는 두 클래스가 형변환하는 것은 불가능하다.
Car 클래스와 FireEngine, Car와 Ambulance는 양방향 형변환이 가능하지만, FireEngine과 Ambulance는 형변환하는 것이 불가능하다.
기본형의 그것과는 다르게, 참조형의 형변환은 변수에 저장된 값(주소값)이 변환되는 것이 아니다.
참조변수의 형변환은 그저 리모컨(참조변수)을 다른 종류의 것으로 바꾸는 것일 뿐이고, 리모컨의 타입을 바꾸는 이유는 사용할 수 있는 멤버 개수를 조절하기 위한 것일 뿐이다.
부모 타입으로의 형변환은 생략할 수 있는데, 부모타입으로 형변환하면 다룰 수 있는 멤버의 개수가 줄어들기 때문에 항상 안전하기 때문이다. 반면, 자식타입으로의 변환은 그렇지 않은데, 실제 객체가 가진 기능보다 멤버의 개수가 늘어나기 때문이다.
서로 상속관계에 있는 타입간의 형변환은 양방향으로 자유롭게 수행될 수 있으나, 참조변수가 가리키는 인스턴스의 자손타입으로 형변환은 허용되지 않는다.
그래서 참조변수가 가리키는 인스턴스의 타입이 무엇인지 먼저 확인하는 것이 중요하다.
값이 null인 참조변수에 대해 instanceof 연산을 수행하면 false를 결과로 얻는다.
어떤 타입에 대한 instanceof 연산의 결과가 true라는 것은
검사한 타입으로 형변환이 가능하다는 것을 뜻한다.