기능을 숨기지 않고 어디서든 호출할 수 있게 공개
package mypackage;
public class PublicClass {
public String name = "John"; // 어디서든 접근 가능
public void sayHello() {
System.out.println("Hello, " + name);
}
}
import mypackage.PublicClass;
public class Test {
public static void main(String[] args) {
PublicClass obj = new PublicClass();
obj.sayHello(); // 정상 실행됨
System.out.println(obj.name); // 정상 실행됨
}
}
상속 관계로 속성과 기능을 숨길 때 사용, 상속 관계가 아닌 곳에서 해당 기능을 호출할 수 없다.
package mypackage;
public class Parent {
protected String familyName = "Smith";
protected void showFamilyName() {
System.out.println("Family name: " + familyName);
}
}
package otherpackage;
import mypackage.Parent;
public class Child extends Parent {
public void printFamilyName() {
showFamilyName(); // 가능 (상속 받았기 때문)
System.out.println(familyName); // 가능
}
public static void main(String[] args) {
Child obj = new Child();
obj.printFamilyName();
}
}
나의 패키지 안으로 속성과 기능을 숨길 때 사용, 외부 패키지에서 해당 기능을 호출할 수 없다.
package mypackage;
class DefaultClass { // 접근 지정자를 명시하지 않으면 default
String message = "Hello from DefaultClass";
void printMessage() {
System.out.println(message);
}
}
package mypackage;
public class Test {
public static void main(String[] args) {
DefaultClass obj = new DefaultClass(); // 가능
obj.printMessage(); // 가능
}
}
나의 클래스 안으로 속성과 기능을 숨길 때 사용, 외부 클래스에서 해당 기능을 호출할 수 없다.
package mypackage;
public class PrivateClass {
private String secret = "This is a secret";
private void showSecret() {
System.out.println(secret);
}
public void revealSecret() {
showSecret(); // 클래스 내부에서는 호출 가능
}
}
class Person {
// 필드는 private으로 선언 (외부에서 직접 접근 불가능)
private String name;
private int age;
// 생성자
public Person(String name, int age) {
this.name = name;
this.age = age;
}
// getter 메서드 (읽기)
public String getName() {
return name;
}
public int getAge() {
return age;
}
// setter 메서드 (쓰기)
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
if (age > 0) { // 나이는 음수가 될 수 없도록 제한
this.age = age;
} else {
System.out.println("나이는 0보다 커야 합니다.");
}
}
}
public class Main {
public static void main(String[] args) {
// Person 객체 생성
Person person = new Person("Alice", 25);
// private 필드 직접 접근 (불가능) → 오류 발생
// System.out.println(person.name); // 오류
// getter를 사용하여 값 가져오기
System.out.println("이름: " + person.getName());
System.out.println("나이: " + person.getAge());
// setter를 사용하여 값 변경
person.setName("Bob");
person.setAge(30);
System.out.println("변경된 이름: " + person.getName());
System.out.println("변경된 나이: " + person.getAge());
// 잘못된 나이 설정 (제한 조건 확인)
person.setAge(-5); // "나이는 0보다 커야 합니다." 출력
}
}
| 접근 지정자 | 같은 클래스 | 같은 패키지 | 다른 패키지 (상속X) | 다른 패키지 (상속O) |
|---|---|---|---|---|
| public | O | O | O | O |
| protected | O | O | X | O |
| default | O | O | X | X |
| private | O | X | X | X |