2010-04-06 3 views

답변

0

변수를 private으로 설정하는 것을 information hiding 또는 encapsulation이라고합니다. 이 개념은 프로그램 구현을 위해 프로그램 논리를 분리하기 위해 도입되었습니다.

변수가 public이거나 공용 getter 및 setter와 함께 private 인 변수가있는 경우 getter와 setter가 변수를 변환하지 않아도 동일하지 않습니다. Getter 및 Setter는 set이거나 캐싱 또는 제약 조건 확인과 같은 get 일 때 변수에 대해 일종의 연산을 수행합니다.

공용 getter 또는 setter는 하위 클래스에서 해당 동작을 전문적으로 덮어 쓸 수 있습니다. 공용 변수를 사용하여 동일한 작업을 수행 할 수 없습니다. 속성을 사용하더라도 하위 클래스의 접근자를 덮어 쓸 수 없으므로 동작이 동일하지 않습니다. 접근자를 비우면 더 많은 확장이 가능합니다.

이 개념은 예를 들어 C 및 Python과 같이 모든 언어로 구현되지는 않습니다.

5

음, 기본값이 있습니다.

자신에게 물어야하는 질문은 모든 것을 공개하지 않는 이유입니다. 일단 이해하면 자신의 질문에 대답 할 수 있습니다.

0

이 코드를 사용하는 유일한 사람은 누구나 공개 할 수 있습니다. 그렇지 않다면 누군가의 변경을 원하지 않으면 비공개 필드를 사용해야합니다. 이는 설계가 망가져 클래스의 동작이 예측할 수 없기 때문입니다.

0
  1. 일부 변수는 내부 로직 새 값을 설정 만
  2. 가능한 검증을 위해 필요하다. 당신이 알 필요가없는 경우, 아마 나중에
1

당신은 그것을 변수 private를하는 것이 좋습니다, 아주 잘, 그리고 public 게터/세터가 필요합니다. public 필드에 대한 직접 액세스는 실제로는 bad practice입니다.

이것은 "표현의 독립성"과 관련이 있습니다. 즉, 외부 액세스가 getter/setter를 통해 발생하면 주요 결함이없는 객체의 내부 표현을 변경할 수 있다는 사실입니다.

1

진실은 필드가 언어에서 비공개로 설정되어 있으면 많이 손실되지 않습니다. 대부분의 langauages에서, 당신이 말했듯이, 프로퍼티 setter/getter로 모든 필드를 캡슐화하는 것이 좋습니다. 언어는 모든 영역을 비공개로 만들 수 있습니다.

그러나 개인 내부 클래스 같은 경우 :

public class OuterClass 
{ 
    private InnerClass 
    { 
      public int publicField; 
    } 
} 

이 그럼 당신은 게터가/세터가 필요하지 않습니다 주장 할 수 있습니다. 이 경우 C#에서는 자동 구현 된 속성을 사용하는 것이 쉽습니다. 그러나 이들은 C# 2에서만 소개되었으므로 공개 필드가 여전히 허용되는 이유입니다. 사전 자동 구현 된 속성은 개인 내부 클래스의 과도 함으로 간주 될 수있는 getters/setters를 작성해야했습니다.

C++와 같은 포인터가있는 언어에서는 클래스 외부에서 필드에 대한 포인터를 얻으려는 경우 공용 필드가 필요합니다.

0

프로그래머를위한 일반적인 반사는 클래스의 모든 필드를 private *로 설정하고 일련의 getter와 setter로 구성된 인터페이스를 제공하여 조작합니다. 이것은 클래스의 내부 동작이 숨겨진 상태로 유지되고 프로그래머가 변경이 가능하다는 것을 설명 할 수있는 캡슐화 원리에 따른 것입니다.

경우에 따라 public, protected 및 default (= none) 액세스 지정자가 필요합니다. 공용은 클래스 외부에서 자유롭게 액세스 할 수있는 모든 메소드 또는 필드에 사용할 수 있지만 지정자가없는 경우 클래스 자체 및 동일한 패키지 내의 모든 클래스에 대한 액세스가 제한됩니다. 마지막으로, protected는 필드가 프레임 워크에서 때때로 사용되는 접근 방식 인 패키지의 하위 클래스 및 다른 클래스에서 액세스해야하는 경우에 사용할 수 있습니다. 인스턴스를 검색하는 당신에게 완벽하게 제어 할 수 있습니다
http://java.sun.com/docs/books/tutorial/java/javaOO/accesscontrol.html

* 컨테이너 개체를 제외하고 가입일 :

여기에 액세스 지정자의 차이를 보여주는 링크입니다.

관련 문제