package king.k;
public class Prince {
public int a = 20;
protected void kim(){
System.out.println(a);
}
}
================================================
package king;
import king.k.Prince;
class King extends Prince{
public int a = 20;
public static void main(String[] args){
King k = new King();
k.kim();
Prince p = k;
p.kim(); //에러
}
}
상위클래스 : Prince
하위클래스 : King
코드를 더 간결하게 했습니다.
k와 p는 King 클래스의 클래스멤버 즉 현재 사용가능한 상태이자 모든 King의 공유 메소드의 지역변수입니다..
그리고 k와 p는 똑같은 객체를 바라보고 있습니다.
근데 k.kim(); 되고 p.kim();은 안됩니다.
하위클래스 King의 클래스멤버 메소드 main(String[] args)는 당연히 상속받은 모든 Prince 클래스의
public이나 protected로 선언된 멤버들을 접근 더 쉽게 말하자면 보입니다.
클래스멤버 메소드 main(String[] args)의 내부 선언된 매개변수나 지역변수들도 당연히 상속받은 모든 Prince 클래스의
public이나 protected로 선언된 멤버들을 접근 더 쉽게 말하자면 보입니다.
그런데 k.킴은 되고 p.킴은 안됩니다.
메모리 관점으로 간결하게 설명해주실 스승님 없나요.
대체 왜 이런 병신같은 의문을 가질까?
Prince 클래스에는 kim 메소드가 있음
허나 외부접근이기 때문에 protected로 선언된 메소드를 다른 클래스에서 허용하지 않는거지
좆같으면 그냥 public 쓰면 되잖아?
ㄴ외부접근이라뇨... 엄연히 하위클래스의 클래스멤버 메소드 main 안에서 선언된 참조포인터변수 p와 k인데요.
ㄴ 전 반드시 이 차이점을 확실하게 정리해서 코딩할때 문법때문에 엉키고 싶지 않단 말입니다용...
ㄴ new King() 코드를 컴파일하면 King 인스턴스가 생깁니다. 모든 King인스턴스는 main메서드를 공유하지요. 그러니 p와 k가 당연히 kim() 메서드를 호출할수 있는게 당연한거 아닌가요? 하위클래스 메서드 안에서 선언된 변수니 당연히 protected 메서드가 눈에 보여서 호출가능하게 접근되는게 당연한거지요.
클래스 선언은 외부에 되어있단다
이건 include가 아니고 import란다 얘야
main은 어느 클래스에도 소속되지 않았단 의미인가요? 클래스 선언은 킹 클래스에 main 메소드 안에서 지역변수 p와 k에 선언된 인스턴스가 아니란 소리입니까?
? 님 클래스 선언이 외부에 되었단 소리는 어느 책에서 봐도 안나온 개념이고 처음 들어봅니다. 조금 더 설명해주실수 없으신가요?
개념이고 자시고 King 클래스의 외부에 Prince 클래스가 선언 되어있다는 말이란다
아아 그는 오늘도 부처를 만들고 있습니다.
protected:상속받은 클래스와 동일 패키지 내부에서 접근가능
눈을 크게 뜨고 바라보면 King 클래스와 Prince 클래스가 서로 다른 곳에 선언 되어있다는 것을 알 수 있을 것이란다
좆도 아닌거 가지고 개념세우는척 하지 왜?
그리고 King 클래스 내에서 Prince 클래스를 불러오기 위해 import 하고 kim 메소드를 사용해보려 했으나 Prince 클래스의 kim 메소드에는 외부 접근을 방지하는 protected 접근제어지시자가 붙어있음을 알 수 있을 것이란다
King 클래스는 Prince를 상속받은 클래스입니다. 단순히 남남관계의 클래스가 아니라구요. 그리고 상속받은 클래스 King은 protected로 선언된 상위클래스의 모든 멤버를 가질수 있구요. 메인 메소드는 엄연히 킹 클래스 안에 있으니 하위클래스의 메소드가 되겠고 그 안에서 선언된 지역참조변수들은 당연히 상위클래스의 protected 된 멤버들을 호출할수 있는게 당연한거 아닙니까?
상상이는 지금 상속의 개념만 이야기하고 서로 파일로 격리된 개념은 이야기하지 않는구나
패키지는 달라도 상속관계에 있다면 상속받은 클래스는 엄연히 protected나 public 제어자로 선언된 상위클래스의 멤버들을 호출할수 있는 시야 즉 접근권한이 생깁니다. 근데 왜 하위클래스 메소드 main안에 선언된 참조변수 두개중 하나는 되고 하나는 안되냐 이말이죠.
자바에서 파일은 그냥 관리용이지 진짜는 클래스와 패키지 분리죠. 파일은 아무상관없습니다.
@상상 // 하는방법 있어 잠시만 기다려봐
국어사전에는 잣대라는 단어가 있단다
네가 만든 언어가 아니라면 \'아무 상관 없다\'라고 단정지을 수 있는건 없단다
Method m = Prince.class.getDeclaredMethod(\"kim\"); m.invoke(p);
@상상 // 사실 상상님이 말씀하신건 기초적으로본다면 맞는말입니다.
그렇기때문에 자바에서도 그러한 기능을 제공하는 기술이있습니다.
좋은 프로그래머가 될듯하네요 .
\"생각없는 배움은 소용없고, 배움없는 생각은 위험하다.\" 상상님은 생각있는 배움을하고있으신것같습니다.
Method m = Prince.class.getDeclaredMethod(\"kim\"); m.invoke(p); //안전장치풀고 사용가능
http://www.hanb.co.kr/network/view.html?bi_id=1370