접근 제어자
: 멤버 또는 클래스에 사용되어, 해당하는 멤버 또는 클래스를 외부에서 접근하지 못하도록 제한하는 역할접근 제어자가 사용될 수 있는 곳 = 클래스, 멤버변수, 메서드, 생성자
private : 같은 클래스 내에서만 접근이 가능
(default) : 같은 패키지 내에서만 접근이 가능
접근 제어자가 default라는 것은 아무런 접근 제어자도 붙이지 않는 것을 의미
protected : 같은 패키지 내에서, 그리고 다른 패키지의 자손클래스에서 접근이 가능
public : 접근 제한 전혀 없음
🐣 접근 범위가 넓은 쪽에서 좁은 쪽의 순으로 왼쪽부터 나열
public > protected > (default) > private
제어자 | 같은 클래스 | 같은 패키지 | 자손클래스 | 전체영역 |
---|---|---|---|---|
public | O | O | O | O |
protected | O | O | O | |
(default) | O | O | ||
private | O |
접근 제어자를 사용하는 이유
1.외부로부터 데이터를 보호하기 위함
2.외부에는 불필요한, 내부적으로만 사용되는 부분을 감추기 위함
public class Time {
public int hour;
public int minute;
public int second;
}
: 시간을 표시하기 위한 클래스 Time이 위와 같이 정의되어 있을 때
이 클래스의 인스턴스를 생성한 다음, 멤버변수에 직접 접근하여 값을 변경할 수 있음 (아래와 같이)
Time t = new Time();
t.hour = 25; //멤버변수에 직접 접근
:멤버변수에 잘못된 값을 지정하는 것을 막기 위해, 멤버변수를 private나 protected로 제한하고
멤버변수의 값을 읽고 변경할 수 있는 public메서드를 제공함으로써
간접적으로 멤버변수의 값을 다룰 수 있도록 하는 것이 바람직함
다형성
: 여러 가지 형태를 가질 수 있는 능력class Tv {
boolean power; //전원상태(on/off)
int channel; //채널
void power() { power = ! power; }
void channelUp() { ++channel; }
void channerlDown() { --channel; }
}
class SmartTv extends Tv {
String text; //캡션(자막)을 보여 주기 위한 문자열
void caption() { /*내용생략*/ }
}
ex)
Tv t = new Tv();
SmartTv s = new SmartTv();
Tv t = new SmartTv();
//타입 불일치. 조상 타입의 참조변수로 자손 인스턴스를 참조
SmartTv s = new SmartTv(); //참조변수와 인스턴스의 타입이 일치
Tv t = new SmartTv(); //조상타입 참조변수로 자손 타입 인스턴스를 참조
▶Tv타입의 참조변수로는 SmartTv인스턴스 중에서 Tv클래스의 멤버들(상속받은 멤버포함)만 사용가능
▶즉, Tv클래스에 정의되지 않은 멤버, text와 caption()은 참조변수 t로 사용 불가
둘 다 같은 타입의 인스턴스지만 참조변수의 타입에 따라 사용할 수 있는 멤버의 개수가 달라짐
ex)
SmartTv s = new Tv(); //에러!! 허용 안됨
▶ 실제 인스턴스인 Tv의 멤버 개수보다 참조변수 s가 사용할 수 있는 멤버 개수가 더 많기 때문에 허용불가
조상타입의 참조변수로 자손타입의 인스턴스를 참조 가능
반대로, 자손타입의 참조변수로 조상타입의 인스턴스 참조 불가
저는 자바의 정석 기초편으로 공부하는중인데 진도 많이 나가셨네요
자바의 정석 완강까지 화이팅입니다!