
| 접근 제어자 | 그 외 |
|---|---|
| public protected (default) private | static final abstract native trandient synchronized volatile strictfp |
public class ModifierTest {
public static final int WIDTH = 200; // 여러 제어자를 사용할 때 접근 제어자는 제일 왼쪽에 명시해준다.
...
}
class StaticTest {
// 간단 초기화
static int width = 200; // 클래스 변수(static 변수)
static int height = 120; // 클래스 변수(static 변수)
static { // 클래스 초기화 블럭
// static 변수의 복잡한 초기화 수행
}
static int max(int a, int b){ // 클래스 메서드(static 메서드)
return a > b ? a : b;
}
}
final class FinalTest { // 조상이 될 수 없는 클래스
final int MAX_SIZE = 10; // 값을 변경할 수 없는 멤버변수(상수) (이땐 일반적으로 변수 설정을 대문자로 해줌)
final void getMaxSize() { // 오버라이딩할 수 없는 메서드(변경 불가)
final int LV = MAX_SIZE; // 값을 변경할 수 없는 지역변수(상수)
retuen MAX_SIZE;
}
}
abstract class AbstractTest { // 추상클래스(추상 메서드를 포함한 메서드)
abstract void move(); // 추상메서드(구현부가 없는 메서드)
} // 미완성 클래스, 미완성 메서드
AbstractTest a = new AbstractTest(); // 에러 : 미완성인 추상클래스의 인스턴스 생성불가
public > protected > (default) > private
public class Time {
public int hour;
public int minute;
public int second;
}
이렇게 접근 제한 없이 클래스를 생성하면
Time t = new Time(); t.hour = 25; // 멤버변수에 직접 접근외부에서 멤버변수에 직접 접근할 수 있기 때문에 데이터 보안에 취약해진다.
public class Time {
// 접근 제어자를 private으로 하여 외부에서 직접 접근하지 못하도록 한다.
private int hour;
private int minute;
private int second;
public int getHour() { return hour; }
public void setHour(int hour) {
if(hour < 0 || hour > 23) return;
this.hour = hour;
}
// 메서드는 public 이라서 메서드를 통해서 iv에 간접 접근이 가능함
// 외부로부터 직접적인 접근을 막는게 중요*****
}
내부에서만 메서드 사용을 할 때 private으로 하면 후에 코드 수정을 했을 때 class안에서만 변경 후 테스트를 하면 됨 (테스트해야 할 부분이 많이 줄어듬)
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();
원래는 이렇게 타입이 일치해야 하는데 다형성의 특징에 의해
Tv t = new SmartTv(); //타입 불일치
타입이 불일치 해도 가능
SmartTv s = new SmartTv(); //참조 변수와 인스턴스의 타입이 일치 - 타입이 일치하면 모든 기능 사용가능함
// 리모컨에 기능 수 만큼 버튼이 있다고 생각하면 됨
Tv t = new SmartTv(); //조상 타입 참조변수로 자손 타입 인스턴스 참조(타입 불일치) -기능을 가지고 있지만 사용은 일치하는 타입 기능들만 사용 가능하다고 생각하면 됨
// 리모컨에 기능은 다 들어있지만 일치하지 않은 타입들은 버튼이 만들어져 있지 않아서 사용이 불가능하다고 생각하면 됨
Tv t = new SmartTv(); //OK 허용.
// 기능이 있어서 사용 못 하는 건 가능
SmartTv s = new Tv(); //에러 허용안됨
// 이 경우는 기능은 부족한데 더 많은 버튼들이 만들어져 있다고 생각하면 됨
// 없는 기능을 버튼으로 만들어놓는 건 안됨
👀
어떤 프로그램을 만드는지에 따라 어떤 접근제어자를 사용할지 잘 고민해 봐야겠다.
오늘 들었던 강의 중 다형성에 대한 강조를 많이 들었는데 정리한 내용들, 예제에 표시해놓은 주석을 꼼꼼히 읽고 다시 한번 정리해둬야겠다.
📑 참고
1. https://youtu.be/Hmu7YH8AXmI?si=8CwUA3iBmV6RLnxI
2. https://youtu.be/Qm08p4Vk2sw?si=C9T5NCp1QKQsjofI
3. https://youtu.be/3NuVD8eOMfc?si=4V-jlN4vyk6iA5Ki
4. https://youtu.be/fw7Nm_li0pE?si=TJm0jjRUNtWEXDSr