CS

접근 제한자 (Access Modifier)

Twisted 2025. 3. 4. 13:54

접근 제한자의 종류  - public, protected, default, private

※ default는 별도의 키워드를 지정하지 않을 때 적용되는 기본 접근 제한자이다.

 

 

1) public (공개, 어디서든 접근 가능)

  • 모든 클래스에서 접근 가능하다
  • 패키지가 달라져도 접근이 가능하며, 가장 개방적인 접근 제한자이다.
package test;

public class PublicExample {
    public void display() {
        System.out.println("public 메서드 호출!");
    }
}
package other;

import test.PublicExample;

public class Main {
    public static void main(String[] args) {
        PublicExample example = new PublicExample();
        example.display(); // 다른 패키지에서도 접근 가능!
    }
}

실무 사용 예시 

  • 라이브러리나 프레임워크에서 공개 API를 제공할 때 public을 사용한다.
  • 서비스 계층(Service Layer)에서 비즈니스 로직을 구현한 메서드는 public으로 선언된다.

 

2) protected (같은 패키지 + 상속 관계에서 접근 가능)

  • 같은 패키지 내에서는 자유롭게 접근할 수 있다.
  • 패키지가 다른 경우, 자식 클래스에서만 접근 가능하다.
  • 주로 상속을 활용할 때 유용하다.
package test;

public class ProtectedExample {
    protected void showMessage() {
        System.out.println("protected 메서드 호출!");
    }
}
package other;

import test.ProtectedExample;

public class Main extends ProtectedExample {
    public static void main(String[] args) {
        Main obj = new Main();
        obj.showMessage(); // 가능 (상속받은 클래스이므로 접근 가능)
    }
}

실무 사용 예시

  • 부모 클래스의 기능을 자식 클래스에서만 활용하고 싶을 때 사용
  • 프레임워크 내부에서 상속을 통해 확장할 수 있도록 설계된 클래스에서 활용

 

3) default (패키지 내부에서만 접근가능)

  • 접근 제한자를 명시하지 않으면 기본값(default)이 적용
  • 같은 패키지 내에서는 접근 가능하지만, 다른 패키지에서는 접근 불가
package test;

class DefaultExample {
    void sayHello() {
        System.out.println("default 메서드 호출!");
    }
}
package other;

import test.DefaultExample;

public class Main {
    public static void main(String[] args) {
        DefaultExample obj = new DefaultExample(); // 오류 발생! (같은 패키지가 아니므로 접근 불가)
        obj.sayHello();
    }
}

실무 사용 예시

  • 패키지 내부에서만 사용될 유틸리티 클래스나 헬터(helper)클래스에 활용
  • 패키지 외부에서 불필요한 접근을 제한할 때 사용

 

4) private (자신의 클래스에서만 접근 가능)

  • 해당 클래스 내부에서만 접근 가능하며, 외부에서는 접근할 수 없다
  • 가장 제한적인 접근 제한자로, 데이터 보호 및 캡슐화에 유용하다.
package test;

public class PrivateExample {
    private String secret = "이것은 비밀 데이터입니다!";

    private void displaySecret() {
        System.out.println(secret);
    }

    public void accessSecret() {
        displaySecret(); // 같은 클래스 내부에서는 호출 가능
    }
}
package other;

import test.PrivateExample;

public class Main {
    public static void main(String[] args) {
        PrivateExample obj = new PrivateExample();
        obj.accessSecret(); // public 메서드를 통해 간접적으로 접근 가능!
        // obj.secret; // 오류 발생! (private 변수 직접 접근 불가)
        // obj.displaySecret(); // 오류 발생! (private 메서드 직접 호출 불가)
    }
}

실무 사용 예시

  • 객체의 데이터를 외부에서 직접 변경하지 못하도록 보호할 때 사용
  • getter/setter를 통해 필요한 경우에만 데이터를 노출하는 방식으로 사용