- 생성자, 메소드, 필드 등은 접근 제어자를 사용해 접근 범위를 설정 할 수 있음.
- 주요 접근제어자는 다음 표 참고
접근 제어자 |
동일 클래스 |
동일 패키지 |
상속받은 클래스 |
전체(외부) |
public |
O |
O |
O |
O |
(default) |
O |
O |
X |
X |
protected |
O |
O |
O |
X |
private |
X |
X |
X |
X |
생성자에서 접근 제어자 생략 시
- 생성자 앞에 접근 제어자를 명시하지 않으면
default
접근 제어자가 적용.
default
접근 제어자는 동일한 패키지 내에서만 접근할 수 있음.
- 이 경우, 같은 패키지 내의 다른 클래스에서 이 생성자를 호출할 수 있음.
- 만약 생성자를 다른 패키지에서도 사용할 예정이라면
public
접근 제어자를 붙여야 한다.
현재 코드의 상황
Person
클래스와 해당 생성자를 호출하는 코드가 같은 패키지에 있다면, default
접근 제어자(생략된 상태)로도 충분.
- 하지만 다른 패키지에서
Person
생성자를 호출하려면, 반드시 public
접근 제어자를 붙여야 함.
실제로 필요한 경우
- 같은 패키지 내에서만 사용할 경우:
default
접근 제어자를 사용하면 불필요한 외부 접근을 제한할 수 있다.
- 다른 패키지에서도 사용할 경우:
- 생성자 앞에
public
을 붙여 외부 접근을 허용해야 한다.
예제
같은 패키지에서 사용
package exam;
public class Main {
public static void main(String[] args) {
Person person = new Person("김철수", "30", "서울");
person.printInfo(); // 정상 동작 (default 접근 제어자는 같은 패키지에서 사용 가능)
}
}
다른 패키지에서 사용
package another;
import exam.Person;
public class Main {
public static void main(String[] args) {
Person person = new Person("김철수", "30", "서울");
person.printInfo(); // 오류 발생! (default 접근 제어자는 다른 패키지에서 접근 불가)
}