15. 클래스와 멤버의 접근 권한을 최소화하라

📝 전체 내용 간단 요약

  • 클래스와 멤버는 가능한 **가장 낮은 접근 수준(private → default → protected → public)**을 사용하여 외부에 노출을 최소화해야 합니다.

  • 이를 통해 코드의 캡슐화(Encapsulation) 가 강해지며, 결과적으로 안정성, 보안성, 유지보수성을 높일 수 있습니다.


📚 미리 알아야 할 내용 요약

📌 접근 제어자(access modifier)

접근제어자
같은 클래스
같은 패키지
다른 패키지 하위 클래스
전체

private

default

protected

✅(상속된 경우만)

public

📌 캡슐화(Encapsulation)

  • 클래스 내부의 데이터를 외부에서 보호하고 숨겨, 오직 허용된 방식(메서드)으로만 접근할 수 있도록 설계하는 것.

  • 캡슐화를 하면 클래스가 외부의 변화에 덜 민감해지고 관리가 쉬워집니다.


📌 캡슐화의 장점

  • 시스템 개발 속도 향상

    • 여러 팀이 병렬로 각자의 부분을 개발할 수 있습니다.

  • 관리 비용 감소

    • 클래스들이 서로 영향을 덜 받아 유지보수가 쉬워집니다.

  • 성능 최적화 용이

    • 특정 부분만 개별적으로 최적화 가능.

  • 코드 재사용성 증가

    • 독립적인 클래스를 쉽게 재활용 가능.

  • 개발 난이도 감소

    • 전체가 완성되지 않아도 개별 클래스를 독립적으로 테스트할 수 있음.


🚩 주의사항

  • public 클래스를 많이 만들수록 외부에 API를 공개하는 꼴이 되어, 향후 변경에 부담이 됩니다.

  • Serializable을 구현한 클래스는 필드가 의도치 않게 공개 API로 노출될 수 있으니 특히 주의가 필요합니다.

  • public 클래스 내 멤버의 접근 수준을 protected 이상으로 설정하면 공개 API로 노출되어 변경이 어렵습니다.

  • 테스트 목적으로 접근 범위를 늘리면 안 됩니다.


⭐ 중요한 점

  • 클래스와 멤버의 접근 범위는 필요한 만큼만 열어놓는 게 좋습니다.

  • 기본적으로는 모든 멤버를 private으로 설정하고, 꼭 필요한 경우만 접근 범위를 늘려주세요.

  • 특히 public 클래스의 필드는 절대 public이어서는 안됩니다.

    • 외부에서 아무나 값을 바꿀 수 있어서 위험합니다.


❌ 잘못된 예제

아래는 나쁜 예입니다:

// 모든 필드를 public으로 선언하여 외부에서 값을 직접 수정 가능
public class Account {
    public String ownerName;
    public int balance;
}

// 외부에서 의도하지 않은 값이 설정될 수 있음
Account account = new Account();
account.owner = "홍길동";
account.balance = -10000;  // 잘못된 값 설정 가능

✅ 좋은 예제

아래처럼 사용하는 것이 좋습니다:

public class Account {
    private String owner;       // 소유자 이름 (private으로 보호)
    private int balance;        // 잔고 (private으로 보호)

    public Account(String owner, int balance) {
        setOwner(owner);
        setBalance(balance);
    }

    public void deposit(int amount) {
        if(amount < 0) throw new IllegalArgumentException("잘못된 금액");
        balance += amount;
    }

    public int getBalance() {
        return balance;
    }
    
    public String getOwner() {
        return owner;
    }
}
  • 클래스 외부에서 balance와 owner를 함부로 변경하지 못합니다.

  • 필드를 보호하고 메서드를 통해서만 변경을 허용하므로 안전합니다.


⚠️ 주의사항

  • 클래스나 인터페이스를 공개(public)로 설정하면 해당 클래스가 공개 API로 인식되어 변경이 어려워집니다.

    • 특별한 이유가 없다면 package-private으로 유지하세요.

  • 클래스 안에만 쓰이는 클래스는 중첩클래스(private static nested class)로 만들어 외부 접근을 완벽히 차단하세요.

  • 자바 9 이후 모듈 시스템을 사용하면, 패키지 간 접근을 명확히 통제할 수 있어 접근 권한 관리에 도움이 됩니다.


🤔 어려운 점

  • 처음 접할 때 접근제어자를 이해하는 건 쉬웠지만, 실제 개발할 때 언제 어떤 제어자를 써야 할지 판단하기 어려웠습니다.

  • 특히, 왜 처음부터 모든 걸 공개하지 않고 제한적으로 만들어야 하는지 감각적으로 와 닿는 데 시간이 필요했습니다.


🗣 느낀 점

  • 처음 접근 제어자에 대해 배울 때는 “굳이?”라는 생각이 들었지만, 실제로 코드가 길어지고 복잡해질수록 접근 제어를 잘하는 것이 중요하다는 점을 깨달았습니다.

  • 특히 외부에 공개되는 클래스는 수정이 어렵다는 점이 신선했고, 협업을 할 때는 클래스의 접근 권한을 적절히 제한하면 협업이 훨씬 편하고 안전하겠다는 생각이 들었습니다.

  • 클래스와 멤버 접근 권한의 최소화는 좋은 프로그래밍 습관이자 코드의 품질을 유지하는 방법임을 알게 되었습니다.


🎯 핵심 한 줄 정리

🔑 클래스와 멤버는 항상 가능한 최소한의 접근 권한을 부여해 코드의 안정성과 유지보수성을 높이자!


Last updated