Java에서 액세스 한정자는 변수 메서드와 같은 클래스 멤버와 심지어 클래스 자체가 프로그램의 다른 부분에서 액세스될 수 있는 방법을 정의하는 필수 도구입니다.
Java에는 4가지 유형의 액세스 수정자가 있습니다.
Java의 액세스 수정자비공개 액세스 수정자
개인용 액세스 수정자는 개인 키워드를 사용하여 지정됩니다. private으로 선언된 메서드나 데이터 멤버는 해당 클래스 내에서만 액세스할 수 있습니다.
Java
class Person { // private variable private String name; public void setName(String name) { this.name = name; // accessible within class } public String getName() { return name; } } public class Geeks { public static void main(String[] args) { Person p = new Person(); p.setName('Alice'); // System.out.println(p.name); // Error: 'name' // has private access System.out.println(p.getName()); } }
산출
Alice
설명: 캡슐화를 시행하는 Person 외부에서는 이름에 대한 직접 액세스가 허용되지 않습니다.
기본 액세스 수정자
클래스 메서드나 데이터 멤버에 대해 액세스 한정자가 지정되지 않은 경우 기본적으로 기본 액세스 한정자가 있다고 합니다. 이는 동일한 패키지 내의 클래스만 액세스할 수 있음을 의미합니다.
Javaclass Car { String model; // default access } public class Main { public static void main(String[] args){ Car c = new Car(); c.model = 'Tesla'; // accessible within the same package System.out.println(c.model); } }
산출
Tesla
설명: 기본 액세스 권한이 있는 멤버는 다른 패키지의 클래스에서 액세스할 수 없습니다.
Geeks.java: 동일한 패키지 내의 기본 클래스
Java// default access modifier package p1; // Class Geek is having // Default access modifier class Geek { void display() { System.out.println('Hello World!'); } }
GeeksNew.java: 다른 패키지의 기본 클래스(대조용)
C++// package with default modifier package p2; import p1.*; // importing package p1 // This class is having // default access modifier class GeekNew { public static void main(String args[]) { // Accessing class Geek from package p1 Geek o = new Geek(); o.display(); } }
설명: 이 예에서 프로그램은 다른 패키지의 기본 수정자 클래스에 액세스하려고 할 때 컴파일 시간 오류를 표시합니다.
보호된 액세스 수정자
protected 액세스 수정자는 protected 키워드를 사용하여 지정됩니다. protected로 선언된 메서드나 데이터 멤버는 동일한 패키지 또는 다른 패키지의 하위 클래스 내에서 액세스할 수 있습니다.
Javaclass Vehicle { protected int speed; // protected member } class Bike extends Vehicle { void setSpeed(int s) { speed = s; // accessible in subclass } int getSpeed() { return speed; // accessible in subclass } } public class Main { public static void main(String[] args){ Bike b = new Bike(); b.setSpeed(100); System.out.println('Access via subclass method: ' + b.getSpeed()); Vehicle v = new Vehicle(); System.out.println(v.speed); } }
산출
Access via subclass method: 100 0
설명: speed는 동일한 패키지의 하위 클래스 메서드와 다른 클래스를 통해 액세스할 수 있지만 다른 패키지(하위 클래스가 아닌)에서의 직접 액세스는 실패합니다.
공개 액세스 수정자
공용 액세스 한정자는 public 키워드를 사용하여 지정됩니다. 공개 회원은 프로그램의 모든 곳에서 액세스할 수 있습니다. 공개 데이터 구성원의 범위에는 제한이 없습니다.
Javaclass MathUtils { public static int add(int a int b) { return a + b; } } public class Main { public static void main(String[] args) { System.out.println(MathUtils.add(5 10)); // accessible anywhere } }
산출
15
설명: add()는 public 수정자로 인해 전역적으로 접근 가능합니다.
비공개는 '인클로징 클래스 내에서만 표시됨'을 의미하므로 최상위 클래스 또는 인터페이스를 비공개로 선언할 수 없습니다.
Java의 액세스 수정자 비교표
액세스 수정자실제 프로젝트에서 각 액세스 수정자를 사용하는 경우
- 사적인: 아이디어는 가능한 한 제한적인 액세스를 사용해야 하므로 비공개를 최대한 많이 사용해야 합니다.
- 기본 (Package-Private): 패키지 범위 유틸리티나 도우미 클래스에서 자주 사용됩니다.
- 보호됨: 프레임워크 확장과 같은 상속 기반 디자인에 일반적으로 사용됩니다.
- 공공의 : 이는 애플리케이션의 여러 부분에서 공유되는 API 엔드포인트 서비스 클래스 또는 유틸리티 메서드에 사용됩니다.