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 자바 Enum 열거형 사용법

Enum이란? Enum은 "enumeration"의 줄임말로, 특정 값들의 집합을 정의할 수 있는 특별한 클래스입니다. 예를 들어, 요일,…

3주 ago

Java 자바 래퍼 클래스(Wrapper Class)란? 래퍼 클래스의 필요성

래퍼 클래스(Wrapper Class)란? 자바에서 래퍼 클래스는 기본 데이터 타입(Primitive Data Type)을 객체(Object)로 감싸는 클래스입니다. 자바의…

3주 ago

Java 자바 StringBuilder 개념 및 특징 주요 메소드

서론 Java에서 문자열을 다룰 때, 문자열의 변경이 빈번하게 발생하는 경우라면 StringBuilder 클래스를 사용하는 것이 매우…

4주 ago

웹 개발 FitOn 팀 프로젝트 회고

서론 현대인들은 점점 더 운동과 건강에 대한 관심을 가지고 있으며, 이를 체계적으로 관리하고 공유할 수…

1개월 ago

Java 자바 String 클래스 특징 및 메소드

String 클래스란? 자바에서 String 클래스는 가장 널리 사용되는 클래스 중 하나입니다. 문자열 시퀀스를 나타내며, 문자열을…

2개월 ago

Java 자바 불변 객체(Immutable Object) 개념 정리

불변 객체란? 불변 객체(Immutable Object)는 생성된 이후 그 상태를 변경할 수 없는 객체를 의미합니다. 불변…

2개월 ago