이 튜토리얼에서는 Java 접근 제어자의 네 가지 종류와 명확한 예제를 통한 사용법을 다룹니다.
접근 제어자란 무엇인가?
Java에서 접근 제어자는 클래스, 인터페이스, 변수, 메서드, 생성자, 데이터 멤버의 가시성을 정의합니다. 예를 들어,
class Animal { public void method1() {...} private void method2() {...} }
위 예제에서 method1은 public으로 모든 클래스에서 접근 가능합니다. method2은 private으로 선언된 클래스 내부에서만 접근 가능합니다.
이 키워드들(public, private)이 Java의 핵심 가시성 제어자입니다.
참고: 게터 메서드 자체에는 접근 제어자를 선언할 수 없습니다.
접근 제어자의 종류
제어자를 살펴보기 전에 Java 패키지 개념을 이해하고 있어야 합니다.
Java는 네 가지 주요 가시성 제어자를 제공합니다:
제어자
설명
Default (패키지-프라이빗)
같은 패키지 내에서만 가시적
Private
선언된 클래스 내부에서만 가시적
Protected
같은 패키지 내 및 다른 패키지의 하위 클래스에서 가시적
Public
모든 곳에서 가시적
Default 접근 제어자
제어자를 명시하지 않으면 Java는 default(패키지-프라이빗) 가시성을 적용합니다. 예를 들어:
package defaultPackage; class Logger { void message() { System.out.println("This is a message"); } }
Logger 클래스는 defaultPackage 내의 클래스에서만 접근 가능합니다. 다른 패키지에서 사용하면 컴파일 에러가 발생합니다.
Private 접근 제어자
멤버를 private로 선언하면 해당 클래스 내부에서만 접근 가능합니다:
class Data { private String name; } public class Main { public static void main(String[] args) { Data d = new Data(); d.name = "Programiz"; // ❌ 컴파일 에러 } }
에러가 발생하는 이유는 name이 Data 클래스에 private이기 때문입니다. 안전하게 노출하려면 접근자 메서드를 제공해야 합니다:
class Data { private String name; public String getName() { return this.name; } public void setName(String name) { this.name = name; } } public class Main { public static void main(String[] args) { Data d = new Data(); d.setName("Programiz"); System.out.println(d.getName()); } }
출력:
The name is Programiz
중첩 클래스는 private로 선언할 수 있지만, 최상위 클래스와 인터페이스는 불가능합니다.
참고: Java는 최상위 클래스나 인터페이스를 private로 허용하지 않습니다.
Protected 접근 제어자
protected로 표시된 멤버는 같은 패키지 내와 다른 패키지의 하위 클래스에서 접근 가능합니다. 예제:
class Animal { protected void display() { System.out.println("I am an animal"); } } class Dog extends Animal { public static void main(String[] args) { Dog dog = new Dog(); dog.display(); // ✅ 허용 } }
출력:
I am an animal
Protected 멤버는 최상위 클래스나 인터페이스에 선언할 수 없습니다.
참고: 최상위 클래스와 인터페이스는 protected가 될 수 없습니다.
Public 접근 제어자
public으로 선언된 멤버는 어디서든 접근 가능합니다:
// Animal.java public class Animal { public int legCount; public void display() { System.out.println("I am an animal."); System.out.println("I have " + legCount + " legs."); } } // Main.java public class Main { public static void main(String[] args) { Animal animal = new Animal(); animal.legCount = 4; animal.display(); } }
출력:
I am an animal. I have 4 legs.
요약: Animal(public 클래스), legCount(public 필드), display()(public 메서드)는 모두 Main에서 접근 가능합니다.
한눈에 보는 접근 제어자 요약
접근 제어자는 캡슐화의 기반이며, 개발자가 가시성을 제어하고 데이터 무결성을 보호할 수 있게 합니다. 캡슐화에 대한 자세한 내용은 Java 캡슐화를 참조하세요.