문제의 역사
자바에서 접근 제어자는 데이터 캡슐화와 클래스 내부 작업의 세부 사항을 숨기는 원칙을 구현하기 위해 도입되었습니다. 자바가 처음 등장했을 때부터 private는 클래스 외부의 우연한 또는 무단 접근으로부터 데이터를 보호하는 동의어가 되었습니다.
문제
필드 및 메서드에 대한 접근을 적절하게 관리하지 않으면 객체의 내부 상태가 클래스 외부의 코드에 의해 변경될 수 있습니다. 이는 캡슐화 위반, 디버깅의 어려움 및 잦은 버그로 이어집니다.
해결책
private는 필드, 메서드 또는 내부 클래스가 선언된 클래스 내부에서만 접근 가능하도록 보장합니다. 일반적으로 프라이빗 필드와 메서드와 관련하여 접근자 메서드(겟터 및 세터)를 사용합니다. 이렇게 하면 캡슐화 및 객체 상태 변경에 대한 제어가 유지됩니다.
코드 예:
public class Person { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
주요 특징:
내부 클래스가 외부 클래스의 프라이빗 멤버에 접근할 수 있는가?
네, 내부 클래스는 외부 클래스의 프라이빗 필드와 메서드에 완전하게 접근할 수 있습니다. 이는 내부 클래스가 외부 클래스의 구현 부분으로 간주되기 때문입니다.
코드 예:
public class Outer { private int data = 42; class Inner { int getData() { return data; // 접근 가능! } } }
생성자를 private로 만들 수 있으며 그 이유는 무엇인가?
네, 가능합니다. 프라이빗 생성자는 싱글톤 패턴이나 객체 생성을 그 클래스 내부에서만 제한하기 위해 사용됩니다. 예를 들어, 팩토리 메서드를 통해서요.
private static 필드를 선언하면 무슨 일이 발생할까요?
private static 필드는 자신의 클래스 내부에서만 접근 가능하지만 클래스에 소속되고 인스턴스에는 소속되지 않습니다. 이는 외부에서 접근할 수 없는 유틸리티 카운터, 상수 및 기타 정적 데이터를 저장하는 데 유용합니다.
프로젝트에서 User 클래스의 모든 필드가 public으로 선언되었습니다. 이는 외부 모듈이 balance 및 password와 같은 필드를 직접 변경할 수 있게 했습니다.
장점:
단점:
같은 프로젝트에서 클래스 필드는 private로 설정하고, 유효성 검사를 통과한 세터를 통해 작업이 진행되었습니다. balance와 password 작업에서 발생하는 오류가 즉시 드러났습니다.
장점:
단점: