Categories: Java

Java 자바 접근제어자 (public, private, protected, default) 설명

접근제어자란?

자바에서 접근제어자는 클래스, 메서드, 변수 등의 멤버에 대한 접근 권한을 제어하는 데 사용됩니다. 각 멤버에 대한 접근 권한을 제어하여 외부에서의 무분별한 접근을 방지하고, 객체 지향 프로그래밍의 캡슐화 원칙을 유지하는 데 사용됩니다.

접근제어자 종류

  1. public (공개된):
    • 클래스의 외부에서 해당 멤버에 자유롭게 접근할 수 있습니다.
    • 다른 패키지에서도 접근 가능하므로, 외부 모듈이 해당 멤버를 활용할 수 있습니다.
    • 주로 클래스의 인터페이스로 사용되며, 다른 클래스에서 필요한 부분에 쉽게 접근할 수 있도록 합니다.
  2. protected (보호된):
    • 같은 패키지 내에서는 물론이고, 다른 패키지에서 해당 클래스를 상속받은 자식 클래스에서만 접근 가능합니다.
    • 외부에서 직접 접근은 불가능하지만, 상속 관계에서 자식 클래스에게 유용한 정보나 동작을 제공할 수 있습니다.
    • 주로 상속 관계에서의 확장성을 고려하여 사용됩니다.
  3. default (기본):
    • 접근 제어자를 명시하지 않으면 기본적으로 default로 설정됩니다.
    • 같은 패키지 내에서만 접근이 가능하며, 패키지 외부에서는 직접 접근할 수 없습니다.
    • 패키지 내부의 다른 클래스들끼리의 협력을 위해 사용되며, 클래스의 내부적인 동작에 필요한 부분을 숨기기 위해 활용됩니다.
  4. private (비공개된):
    • 같은 클래스 내에서만 접근 가능하며, 다른 클래스나 패키지에서는 접근할 수 없습니다.
    • 클래스의 내부 구현을 외부에 감추고, 해당 멤버에 대한 직접적인 접근을 막아 정보 은닉을 제공합니다.
    • 주로 내부 구현의 세부사항을 감추어 캡슐화를 유지하고 외부에서의 무분별한 접근을 방지합니다.

💡다음은 자바에서 사용되는 네 가지 접근 제어자의 허용 범위를 나타내는 표입니다.

클래스 내부같은 패키지 내의 클래스다른 패키지의 자식 클래스다른 패키지의 클래스
publicOOOO
protectedOOOX
defaultOOXX
privateOXXX
  • 클래스 내부 (Class Internal): 멤버를 선언한 클래스 내에서는 어떤 접근 제어자든 접근이 가능합니다.
  • 같은 패키지 내의 클래스 (Same Package): 같은 패키지 내에 있는 다른 클래스에서는 public, protected, default로 선언된 멤버에 접근이 가능합니다. private로 선언된 멤버는 해당 클래스 내부에서만 접근이 가능합니다.
  • 다른 패키지의 자식 클래스 (Subclass in Different Package): 상속 관계에 있는 자식 클래스에서는 public과 protected로 선언된 멤버에 접근이 가능합니다. default와 private로 선언된 멤버는 상속 관계에서는 접근이 불가능합니다.
  • 다른 패키지의 클래스 (Different Package): 다른 패키지의 클래스에서는 public으로 선언된 멤버에만 접근이 가능합니다. 나머지 접근 제어자로 선언된 멤버는 외부에서 직접 접근할 수 없습니다.

접근 제어자 사용 위치

필드 (Fields)

  • 클래스의 데이터 멤버인 필드에도 접근 제어자를 사용할 수 있습니다.
  • 주로 데이터의 은닉과 보호를 위해 사용됩니다.
Java
public class Example {
    private int privateField;  // 비공개 필드 - 클래스 내부에서만 접근 가능
    public int publicField;    // 공개된 필드 - 어디서든 접근 가능
    protected int protectedField;  // 보호된 필드 - 같은 패키지 또는 상속받은 클래스에서 접근 가능
    int defaultField;        // 기본 접근 제어자 (default) 필드 - 같은 패키지에서만 접근 가능
}
Java

메서드 (Methods)

  • 클래스의 행동을 정의하는 메서드에도 접근 제어자를 적용할 수 있습니다.
  • 외부에서 직접적인 접근을 허용할지 여부를 결정합니다.
Java
public class Example {
    private void privateMethod() {
        // 비공개 메서드 - 클래스 내부에서만 호출 가능
    }

    public void publicMethod() {
        // 공개된 메서드 - 어디서든 호출 가능
    }

    protected void protectedMethod() {
        // 보호된 메서드 - 같은 패키지 또는 상속받은 클래스에서 호출 가능
    }

    void defaultMethod() {
        // 기본 접근 제어자 (default) 메서드 - 같은 패키지에서만 호출 가능
    }
}
Java

클래스 (Class)

  • 클래스에 대한 접근 제어자입니다.
  • 클래스 레벨에서 사용할 수 있는 접근 제어자는 public과 기본(default) 두 가지입니다.
Java
// 공개된 클래스 - 어디서든 접근 가능
public class PublicClass {

}

// 기본 접근 제어자 (default) 클래스 - 같은 패키지에서만 접근 가능
class DefaultClass {

}
Java

내부 클래스 (Inner Classes)

  • 클래스 내부에 선언된 내부 클래스에도 접근 제어자를 사용할 수 있습니다.
  • 내부 클래스에는 private, public, protected, default 제어자 모두 사용 가능합니다.
  • 내부 클래스의 종류에 따라 외부에서의 접근 범위를 제어합니다.
Java
public class Outer {
    private class InnerPrivate {
        // 비공개 내부 클래스 - 외부 클래스 내부에서만 접근 가능
    }

    public class InnerPublic {
        // 공개된 내부 클래스 - 어디서든 접근 가능
    }

    protected class InnerProtected {
        // 보호된 내부 클래스 - 같은 패키지 또는 상속받은 클래스에서 접근 가능
    }

    class InnerDefault {
        // 기본 접근 제어자 (default) 내부 클래스 - 같은 패키지에서만 접근 가능
    }
}
Java

예제

Java
// Person 클래스: 정보를 캡슐화하고 접근 제어자를 활용한 예제
public class Person {
    private String name;        // 비공개 필드
    private int age;             // 비공개 필드
    public String address;       // 공개된 필드

    // 생성자
    public Person(String name, int age, String address) {
        this.name = name;
        this.age = age;
        this.address = address;
    }

    // 비공개 메서드: name 필드에 접근하는 메서드
    private String getName() {
        return name;
    }

    // 공개된 메서드: age 필드에 접근하는 메서드
    public int getAge() {
        return age;
    }

    // 보호된 메서드: address 필드에 접근하는 메서드
    protected String getAddress() {
        return address;
    }

    // 기본 접근 제어자 메서드: 모든 정보를 출력하는 메서드
    void printInfo() {
        System.out.println("Name: " + getName());
        System.out.println("Age: " + getAge());
        System.out.println("Address: " + getAddress());
    }
}

// Main 클래스: Person 클래스를 사용하는 메인 예제
public class Main {
    public static void main(String[] args) {
        // Person 객체 생성
        Person person = new Person("Alice", 25, "123 Main St");

        // 공개된 필드에 직접 접근 가능
        System.out.println("Address: " + person.address);

        // 비공개 및 보호된 메서드를 통해 접근
        System.out.println("Name: " + person.getAge());
        System.out.println("Age: " + person.getAge());
        System.out.println("Address: " + person.getAddress());

        // 기본 접근 제어자 메서드를 통해 모든 정보 출력
        person.printInfo();
    }
}
Java

  • 이 예제에서는 Person 클래스를 통해 이름(name), 나이(age), 주소(address)를 캡슐화하고 각 필드에 대해 적절한 접근 제어자를 사용하였습니다.
  • 이를 통해 필드에 직접 접근하는 것을 제한하고, 메서드를 통해 정보에 접근하도록 했습니다.

결론

자바의 접근 제어자는 프로그램의 안정성과 유지보수성을 높이기 위한 중요한 도구로, 클래스, 메서드, 변수 등의 멤버에 대한 접근 권한을 제어합니다. 각 접근 제어자는 외부로부터의 불필요한 접근을 막아주며, 객체 지향 프로그래밍의 핵심 원칙 중 하나인 캡슐화를 실현합니다.

suover

Recent Posts

Java 자바 Set – HashSet, TreeSet, LinkedHashSet 정리

소개 자바에서 Set은 중복을 허용하지 않는 데이터 집합을 의미합니다. List와 달리 동일한 요소를 여러 번…

1개월 ago

Java 자바 Hash 해시 제대로 이해하기

해시(Hash)란 무엇인가? 해시(Hash)는 자바 프로그래밍에서 빠르고 효율적인 데이터 저장 및 검색을 위한 핵심적인 개념입니다. 이…

2개월 ago

Java 자바 리스트 (List) 정리

List란 무엇인가? List는 자바 컬렉션 프레임워크의 핵심 인터페이스 중 하나로, 순서가 있는 데이터를 다루는 데…

2개월 ago

Java 자바 LinkedList 동작 원리와 사용법

LinkedList란 무엇인가? LinkedList는 자바에서 유용하게 사용되는 자료구조 중 하나로, 연결 리스트 방식을 이용하여 데이터를 관리하는…

2개월 ago

Java 자바 ArrayList 동작 원리와 사용법

ArrayList란 무엇인가? ArrayList는 자바에서 가장 널리 사용되는 컬렉션 중 하나로, 가변 크기의 배열을 구현한 클래스입니다.…

2개월 ago

Java 자바 제네릭(Generic) 개념과 문법 알아보기

제네릭(Generic)이란? 자바 제네릭은 코드의 재사용성을 높이고 타입 안전성을 보장하는 중요한 개념입니다. 이 블로그 글에서는 자바…

2개월 ago