[JAVA] Java의 접근 제어자

SmileJun·2025년 3월 28일

Java

목록 보기
2/8

자바의 접근 제어자(Access Modifier) 는 클래스, 변수, 메서드 등의 접근 범위를 제어하는 역할을 한다. 접근 제어자는 필드와 메서드, 생성자에 사용된다.

1. Public

기능을 숨기지 않고 어디서든 호출할 수 있게 공개

  • 접근 범위 : 같은 클래스, 같은 패키지, 다른 패키지 모두 가능
  • 특징 : 모든 클래스에서 접근 가능, API 설계할 때 외부에서 호출
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);  // 정상 실행됨
    }
}

2. Protected

상속 관계로 속성과 기능을 숨길 때 사용, 상속 관계가 아닌 곳에서 해당 기능을 호출할 수 없다.

  • 접근 범위 : 같은 패키지 + 다른 패키지의 자식패키지(하위클래스)에서만 접근 가능
  • 특징 : 같은 패키지 내에서는 public처럼 사용되지만, 다른 패키지 내에서는 사용 불가능. 단 상속받은 클래스에서는 접근 가능
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();
    }
}

3. Default (package-private)

나의 패키지 안으로 속성과 기능을 숨길 때 사용, 외부 패키지에서 해당 기능을 호출할 수 없다.

  • 접근 범위 : 같은 패키지 내에서만 접근 가능
  • 특징 : 별도의 접근 지정자를 명시하지 안흥면 default 접근 지정자 적용
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();  // 가능
    }
}

4. Private

나의 클래스 안으로 속성과 기능을 숨길 때 사용, 외부 클래스에서 해당 기능을 호출할 수 없다.

  • 접근 범위 : 같은 클래스 내부에서만 접근 가능
  • 특징 : 다른 클래스에서는 접근 불가능. 보통 필드(멤버변수)를 private으로 선언하고, getter/setter 메서드(함수)를 통해 접근
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)
publicOOOO
protectedOOXO
defaultOOXX
privateOXXX
profile
하루하루는 성실하게, 인생 전체는 되는대로

0개의 댓글