2011-05-12 5 views
4

Java의 비공개 회원이 다른 프로그래밍 언어 비공개 회원과 다른가요? 왜냐하면 필자는 어떤 유형의 Object를 compareTo에 전달하고 getMethod를 사용하지 않고 해당 Object의 private 멤버에 액세스 할 수 있다는 사실에 놀랐 기 때문입니다.Java의 비회원번호

예.

public class Foo implements Comparable<Foo>{ 

    private int bar; 

    public Foo() { bar = 1; } 

    public int compareTo(Foo o) { 
     if(bar == o.bar) 
      return 0; 
     return 1; 
    } 
} 
+0

Smalltalk에서 private의 경계는 클래스가 아니라 객체입니다 (예상대로). – scravy

답변

3

비록 11 년 동안 살아있는 동안 자바를 프로 그래도 사용했지만, 나는이 사실을 2 년 전에 발견했을 때 놀라지 않았다. 나는 전에 그것을 읽었 음에 틀림 없다. 그러나 어떻게 든 결코 침몰하지 않았다. 나는 이것이 처음에는 이상하게 보일 것이라고 동의하지만, 조금 더 오래 생각하면 그것은 완벽하게 이해된다.

OO는 무엇에 관한 것입니까? 우려와 정보 숨김에 관해서, 맞습니까? 그래서 당신의 디자인에서 당신은 항상 당신의 관심 밖의 것들에 대해 '알아야'하는 것을 피하려고 노력해야합니다. 디자인 타임에 당신이 알고있는 것들은 나중에 바뀔 수 있고 당신의 클래스가 만들고있는 가정을 무효화 할 수 있습니다.

이 경우 Foo는 다른 Foo의 개인 표시 줄에 액세스 할 수 있습니다.이 Foo의 개인 표시 줄은 처음에는 Foo의 우려 사항 이외의 항목에 대해 '아는'것으로 느낍니다. 그러나 우리가 똑같은 클래스 (Foo)의 두 인스턴스에 대해서 이야기하고 있기 때문에 실제로 이것은 우리의 관심 밖이 아닙니다! 예를 들어 bar를 int에서 double로 바꾼다면 동일한 클래스 내에서 bar를 수행하면 모든 컴파일 오류가 즉시 표시됩니다.

또한 이러한 유형의 액세스가 금지되었다고 가정 해보십시오. 그렇다면 Foo가 compareTo를 호출하여 'this'를 인수로 전달하면 어떨까요? 그런 다음 Foo가 자체 전용 막대에 액세스하는 것을 금지해야합니다. 그리고 개인 정적 필드는 어떻습니까? 그건 아주 혼란 ​​스러울거야, 그렇지 않니?

어쩌면 조금 길어질 지 모르겠지만, 첫 번째 쇼크가 끝난 후이 사실을 이해할 수 있기를 바랍니다. (- :..

10

예, 자바 개인 회원 일부 다른 언어를 다릅니다. 예를 들어, 과 같은 코드가 유효하다고 생각합니다.

반면에 C#에서는 유효합니다. C#과 Java는 여전히 내부 클래스 나 중첩 클래스의 private 멤버에 대한 액세스 측면에서 차이가 있지만 기본적으로 비슷합니다.

두 언어가 동일한 동작을하지는 않을 것입니다. 실제로 관심이있는 언어의 사양에 대해 상담해 볼 가치가 있습니다.이 경우에는 section 6.6 of the JLS입니다.

+0

아니요, 그렇지만 사적인 변수를 가지고 있다는 생각을 좀 부숴 버리는 것 같지 않습니까? – starcorn

+1

@starcom, 왜? 당신은 개인 침실을 가지고 있다고 생각합니다. 그럼에도 불구하고 당신이 바닥에서 자야한다는 것을 의미하지는 않습니다. 아무도 거기에서 자지 않을 수 있다는 것을 의미합니다. – Ingo

+1

글쎄,'private'은 동적 인 것이 아닌 어휘 범위를 가지고 있습니다. 그것은 정의와 구현의 문제입니다. – musiKk

1

Java에서 범위는 개체가 아닌 클래스를 기반으로합니다. 뭔가가 비공개 인 경우 인스턴스의 필드이고 코드가 다른 인스턴스에서 실행 중이더라도 해당 클래스에 정의 된 코드에서 볼 수 있음을 의미합니다.

같은 클래스의 물체는 모든 것을 서로 공유하는 쌍둥이처럼 생각할 수 있지만 대부분의 것을 모든 사람들에게 숨겨 둡니다.

1

난 그냥)

당신은 당신은 compareTo (에 형 푸의 객체를 통과하지 않은 compareTo와

자바 허가 액세스 규칙을 일부 형의 Object를 전달할 수 Foo 클래스 내의 모든 Foo 멤버에게 C++는 자신의 Foo 전용 멤버에만 액세스 할 수 있다는 점에서보다 제한적입니다.