IMCAT.DEV
로그인 가입
Java 입문 객체지향

Java 접근 제어자

Java 접근 제어자 — 초급

접근 제어자

1. 도입 (왜 배워야 하는가)

접근 제어자는 객체 지향 프로그래밍에서 매우 중요한 개념입니다. 객체 지향 프로그래밍의 핵심은 캡슐화로, 이는 객체의 내부 상태와 구현을 숨기고 외부에서 접근할 수 있는 방법을 제어하는 것입니다. 접근 제어자를 이해하지 못하면 클래스의 데이터와 메서드에 대한 잘못된 접근이 발생할 수 있으며, 이는 데이터 무결성을 해치고 버그를 초래할 수 있습니다. 예를 들어, 중요한 데이터가 외부에서 수정될 수 있다면, 시스템 안정성에 심각한 위험이 될 수 있습니다.

2. 핵심 개념 설명

접근 제어자는 클래스의 멤버(변수, 메서드 등)에 대한 접근 수준을 정의하는 키워드입니다. 자바에는 네 가지 접근 제어자가 있습니다.

접근 제어자설명
public모든 클래스에서 접근 가능
protected같은 패키지 및 서브클래스에서 접근 가능
default같은 패키지에서만 접근 가능
private같은 클래스 내에서만 접근 가능

예를 들어, public은 마치 열려있는 문과 같아 누구나 들어올 수 있는 반면, private는 잠긴 문처럼 오직 소유자만이 열 수 있는 것입니다.

3. 기본 코드 예제

아래는 각 접근 제어자의 기본 사용법을 보여주는 코드입니다.

class AccessControl {
    public int publicField = 1;       // 모든 클래스에서 접근 가능
    protected int protectedField = 2;  // 같은 패키지 및 서브클래스에서 접근 가능
    int defaultField = 3;              // 같은 패키지에서만 접근 가능
    private int privateField = 4;      // 같은 클래스에서만 접근 가능

    public void displayFields() {
        System.out.println("Public: " + publicField);
        System.out.println("Protected: " + protectedField);
        System.out.println("Default: " + defaultField);
        System.out.println("Private: " + privateField);
    }
}

public class TestAccess {
    public static void main(String[] args) {
        AccessControl ac = new AccessControl();
        ac.displayFields();  // 모든 필드를 출력
    }
}

실행 결과:

Public: 1
Protected: 2
Default: 3
Private: 4
  • AccessControl 클래스에서 여러 필드를 정의하고 있습니다.
  • publicField는 모든 클래스에서 접근 가능하므로 자유롭게 사용할 수 있습니다.
  • protectedField는 같은 패키지에 있는 클래스나 서브클래스에서 접근할 수 있습니다.
  • defaultField는 같은 패키지 내에서만 접근할 수 있습니다.
  • privateField는 오직 AccessControl 클래스 내부에서만 접근 가능하므로, 외부에서는 사용할 수 없습니다.
  • displayFields() 메서드는 모든 필드를 출력합니다.
  • 4. 실전 활용 예제

    예제 1: 쇼핑몰의 장바구니 클래스

    class ShoppingCart {
        private List<String> items = new ArrayList<>();
    
        public void addItem(String item) {
            items.add(item);
        }
    
        public void displayItems() {
            System.out.println("장바구니에 있는 아이템: " + items);
        }
    }

    상황 설명: 장바구니에 아이템을 추가하고, 내부 리스트는 외부에서 접근할 수 없도록 private로 설정했습니다. 이렇게 하면 사용자가 장바구니의 아이템을 직접 수정하는 것을 방지할 수 있습니다.

    예제 2: 은행 계좌 클래스

    class BankAccount {
        private double balance;
    
        public BankAccount(double initialBalance) {
            this.balance = initialBalance;
        }
    
        public void deposit(double amount) {
            if (amount > 0) {
                balance += amount;
            }
        }
    
        public double getBalance() {
            return balance;
        }
    }

    상황 설명: 은행 계좌의 잔액을 private으로 설정하여 외부에서 직접 접근할 수 없도록 하고, deposit() 메서드를 통해서만 잔액을 수정할 수 있게 합니다.

    5. 흔한 실수와 주의사항

    1. 접근 제어자를 잘못 설정하기
    2. - 잘못된 코드:

         class Example {
             private int value;
         }
         Example ex = new Example();  // value에 접근 불가

      - 올바른 코드:

         class Example {
             private int value;
      
             public int getValue() {
                 return value;  // 접근 가능한 메서드 제공
             }
         }
    3. default 접근 제어자를 이해하지 못하기
    4. - 같은 패키지에서만 접근 가능하므로, 서로 다른 패키지에서는 사용할 수 없습니다. 이를 모르고 사용할 경우 에러가 발생합니다.

    5. protected의 사용에 대한 혼동
    6. - protected는 같은 패키지의 클래스에서도 접근 가능하다는 점을 명심해야 합니다.

      6. 정리

    7. 접근 제어자는 클래스 멤버의 접근 수준을 제어하여 데이터 무결성을 유지하는 데 도움을 줍니다.
    8. public, protected, default, private의 개념을 이해하고 적절히 사용하는 것이 중요합니다.
    9. 실무에서 자주 사용하는 패턴으로는 장바구니 클래스, 은행 계좌 클래스 등이 있습니다.
    10. 다음에 학습하면 좋은 주제는 상속과 다형성입니다. 접근 제어자와 함께 다루면 더 깊이 있는 이해가 가능합니다.