package king;
class King extends king.k.Prince{
public int a = 20;
public static void main(String[] args){
king.King k = new king.King();
k.kim(); // 이상없음
king.k.Prince p = new king.King();
p.kim(); // 에러 이유 : kim() has protected access in Prince
}
}
======================================================
package king.k;
public class Prince {
public int a = 20;
protected void kim(){
System.out.println(a);
}
}
p.kim(); // 에러 이유 : kim() has protected access in Prince
상위클래스 prince
하위클래스 king
이유가... 머죠....
그렇게 설계해서. 그 기능의 용도가 뭐냐고 묻는다면 예전 댓글을 볼것
protected 된 멤버는 하위클래스 내에서도 접근가능하게 만들어놨단건데... 하위클래스의 메인 메소드에서 참조 k는 되고 참조 p는 왜 안되냐는 말이죠. 상위클래스형 참조변수로 하위클래스 객체 참조하면서 그 하위클래스 안에 있는 상위클래스 맴버를 왜 못 부르냐는거죠. 메인메소드는 하위클래스에 종속된 맴버고 그 안에 선언된 참조변수니 그 참조변수는 상위클래스로부터 상속받은 protected를 당연히 참조할수 있는거 아님?
진짜 컴파일러는 king.k.Prince p = new king.King(); 에서 king.King 객체를 king.k.Prince 객체라고 착각함? 그럼 말이 안되는게 강제형변환이 불가능해야 하는거 아님? 컴파일러가 그렇게 인식할정도면 jvm도 king.k.Prince객체를 만듬? 아닌데... 아닐텐데...
분명히 만들어지는건 king.King 객체고 단지 참조포인터변수가 king.k.Prince 클래스가 가지고 있는 멤버들만 제한적으로 부르는 포인터변수가 되어서 실제 참조하는 객체는 king.King일텐데...
메소드 호출은 동적 바인딩이지만 접근제한자는 컴파일 시간 / 실행시간 둘 다 검사하나봄
SS언어 만들면 되겠다 이런 좆같은구석 없게^^