왜 모든 변수를 비공개로 설정하지 않습니까? 모든 변수는 getter, setter에게 수정/읽기를 제공해야합니다. 왜 "공개"키워드를 여기에 두어야합니까? 편리함을 제외하고는 다른 이유가 있습니까?변수를 private/public으로 설정해야하는 이유는 무엇입니까?
답변
변수를 private으로 설정하는 것을 information hiding 또는 encapsulation이라고합니다. 이 개념은 프로그램 구현을 위해 프로그램 논리를 분리하기 위해 도입되었습니다.
변수가 public이거나 공용 getter 및 setter와 함께 private 인 변수가있는 경우 getter와 setter가 변수를 변환하지 않아도 동일하지 않습니다. Getter 및 Setter는 set
이거나 캐싱 또는 제약 조건 확인과 같은 get
일 때 변수에 대해 일종의 연산을 수행합니다.
공용 getter 또는 setter는 하위 클래스에서 해당 동작을 전문적으로 덮어 쓸 수 있습니다. 공용 변수를 사용하여 동일한 작업을 수행 할 수 없습니다. 속성을 사용하더라도 하위 클래스의 접근자를 덮어 쓸 수 없으므로 동작이 동일하지 않습니다. 접근자를 비우면 더 많은 확장이 가능합니다.
이 개념은 예를 들어 C 및 Python과 같이 모든 언어로 구현되지는 않습니다.
음, 기본값이 있습니다.
자신에게 물어야하는 질문은 모든 것을 공개하지 않는 이유입니다. 일단 이해하면 자신의 질문에 대답 할 수 있습니다.
이 코드를 사용하는 유일한 사람은 누구나 공개 할 수 있습니다. 그렇지 않다면 누군가의 변경을 원하지 않으면 비공개 필드를 사용해야합니다. 이는 설계가 망가져 클래스의 동작이 예측할 수 없기 때문입니다.
- 일부 변수는 내부 로직 새 값을 설정 만
- 가능한 검증을 위해 필요하다. 당신이 알 필요가없는 경우, 아마 나중에
당신은 그것을 변수 private
를하는 것이 좋습니다, 아주 잘, 그리고 public
게터/세터가 필요합니다. public
필드에 대한 직접 액세스는 실제로는 bad practice입니다.
이것은 "표현의 독립성"과 관련이 있습니다. 즉, 외부 액세스가 getter/setter를 통해 발생하면 주요 결함이없는 객체의 내부 표현을 변경할 수 있다는 사실입니다.
진실은 필드가 언어에서 비공개로 설정되어 있으면 많이 손실되지 않습니다. 대부분의 langauages에서, 당신이 말했듯이, 프로퍼티 setter/getter로 모든 필드를 캡슐화하는 것이 좋습니다. 언어는 모든 영역을 비공개로 만들 수 있습니다.
그러나 개인 내부 클래스 같은 경우 :
public class OuterClass
{
private InnerClass
{
public int publicField;
}
}
이 그럼 당신은 게터가/세터가 필요하지 않습니다 주장 할 수 있습니다. 이 경우 C#에서는 자동 구현 된 속성을 사용하는 것이 쉽습니다. 그러나 이들은 C# 2에서만 소개되었으므로 공개 필드가 여전히 허용되는 이유입니다. 사전 자동 구현 된 속성은 개인 내부 클래스의 과도 함으로 간주 될 수있는 getters/setters를 작성해야했습니다.
C++와 같은 포인터가있는 언어에서는 클래스 외부에서 필드에 대한 포인터를 얻으려는 경우 공용 필드가 필요합니다.
프로그래머를위한 일반적인 반사는 클래스의 모든 필드를 private *로 설정하고 일련의 getter와 setter로 구성된 인터페이스를 제공하여 조작합니다. 이것은 클래스의 내부 동작이 숨겨진 상태로 유지되고 프로그래머가 변경이 가능하다는 것을 설명 할 수있는 캡슐화 원리에 따른 것입니다.
경우에 따라 public, protected 및 default (= none) 액세스 지정자가 필요합니다. 공용은 클래스 외부에서 자유롭게 액세스 할 수있는 모든 메소드 또는 필드에 사용할 수 있지만 지정자가없는 경우 클래스 자체 및 동일한 패키지 내의 모든 클래스에 대한 액세스가 제한됩니다. 마지막으로, protected는 필드가 프레임 워크에서 때때로 사용되는 접근 방식 인 패키지의 하위 클래스 및 다른 클래스에서 액세스해야하는 경우에 사용할 수 있습니다. 인스턴스를 검색하는 당신에게 완벽하게 제어 할 수 있습니다
http://java.sun.com/docs/books/tutorial/java/javaOO/accesscontrol.html
* 컨테이너 개체를 제외하고 가입일 :
여기에 액세스 지정자의 차이를 보여주는 링크입니다.
- 1. OutputCache 특성에서 VaryByParam 매개 변수를 설정해야하는 이유는 무엇입니까?
- 2. Scala RemoteActors에서 클래스 로더를 설정해야하는 이유는 무엇입니까?
- 3. ContentControl에서 IsTabStop을 true로 설정해야하는 이유는 무엇입니까?
- 4. 클래스에서 오는 경우 IsRequired를 설정해야하는 이유는 무엇입니까?
- 5. SSL 인증서 변수를 정확히 설정해야하는 "중앙 위치"
- 6. 코드 서명을 할 때 타임 스탬프를 설정해야하는 이유는 무엇입니까?
- 7. document.domain을 설정하면 모든 팝업 및 iframe에도 설정해야하는 이유는 무엇입니까?
- 8. HTML 텍스트 상자의 값을 null로 설정해야하는 이유는 무엇입니까?
- 9. 선택 사항 인 경우 내 영사를 별명으로 설정해야하는 이유는 무엇입니까?
- 10. PDO에 강력하게 매개 변수를 입력하는 이유는 무엇입니까?
- 11. 로거를 설정해야하는 액세스 수준은 무엇입니까?
- 12. 정적 변수를 보유해야하는 이유는 무엇입니까?
- 13. net.tcp 서비스에 대해 설정해야하는 SPN은 무엇입니까?
- 14. asp.net 앱에서 generatePublisherEvidence를 false로 설정해야하는 위치는 무엇입니까?
- 15. ASP.Net의 페이지 지시문에서 AutoEventWireup을 설정해야하는 값은 무엇입니까?
- 16. 원시 변수를 포함한 로컬 변수를 Java에서 항상 초기화해야하는 이유는 무엇입니까?
- 17. SendMessageTimeout이 환경 변수를 업데이트하지 않는 이유는 무엇입니까?
- 18. PHP에서이 변수를 고수하지 않는 이유는 무엇입니까?
- 19. 클래스 및 전역 변수를 사용해야하는시기와 이유는 무엇입니까?
- 20. pop이 어셈블리에서 매개 변수를 사용하는 이유는 무엇입니까?
- 21. 스위치 블록에 변수를 만들 수없는 이유는 무엇입니까?
- 22. 함수 내에서이 변수를 수정할 수없는 이유는 무엇입니까?
- 23. LoginView에서 반복 변수를 사용할 수없는 이유는 무엇입니까?
- 24. INotifyPropertyChanged가 XAML의 변수를 업데이트하지 않는 이유는 무엇입니까?
- 25. OPENQUERY가 변수를 허용하지 않는 이유는 무엇입니까?
- 26. Double 변수를 비교해도 false가 반환되는 이유는 무엇입니까?
- 27. PHP $ _SESSION이 토큰 변수를 변경하는 이유는 무엇입니까?
- 28. Python - 내 변수를 읽지 않는 이유는 무엇입니까?
- 29. JavaScript에서 전역 변수를 사용해야하는 이유는 무엇입니까?
- 30. Java에서 지역 변수를 "자동"이라고도하는 이유는 무엇입니까?