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