Java 접근 제어자 이해하기

Java에서 접근 제어자(Access Modifier)는 클래스, 메서드, 필드의 접근 수준을 결정하는 중요한 요소입니다. 이 제어자들은 객체 지향 프로그래밍에서 정보 은닉(Encapsulation)을 구현하는데 핵심적인 역할을 하며, 코드의 가독성과 유지보수성을 높이는 데 기여합니다. 이번 글에서는 public, private, protected, 그리고 default 네 가지 접근 제어자의 개념과 사용법을 예시를 통해 알아보겠습니다.
1. public: 어디서나 접근 가능
public은 가장 개방적인 접근 제어자로, 클래스나 메서드, 필드가 모든 패키지나 클래스에서 접근 가능합니다. 예를 들어, 다른 패키지에 있는 클래스에서도 자유롭게 접근할 수 있습니다.
<HTML />public class MyClass { public String name; public void printName() { System.out.println(name); } }
위의 코드는 MyClass 클래스의 name 필드와 printName 메서드가 어디서든 접근 가능한 상태입니다. 하지만 주의할 점은, 너무 많은 public 멤버는 객체 간 결합도를 높일 수 있으므로 신중하게 사용해야 한다는 것입니다.
2. private: 클래스 내부에서만 접근 가능
private는 가장 제한적인 접근 제어자입니다. 해당 클래스 내에서만 필드와 메서드에 접근할 수 있으며, 외부에서 직접 접근할 수 없습니다. 보통 중요한 데이터를 보호하거나 클래스의 내부 상태를 외부에서 임의로 변경하지 못하게 할 때 사용합니다.
<HTML />public class MyClass { private int age; public void setAge(int age) { if (age > 0) { this.age = age; } } public int getAge() { return age; } }
위 코드에서 age 필드는 private으로 선언되었기 때문에 다른 클래스에서 직접 접근할 수 없습니다. 대신, getAge()와 setAge() 메서드를 통해 접근할 수 있도록 캡슐화합니다. 이를 통해 외부에서 잘못된 값을 설정하는 것을 방지할 수 있습니다.
3. protected: 상속 관계에서만 접근 가능
protected는 같은 패키지 내에서는 public처럼 동작하며, 다른 패키지에서는 상속받은 클래스에서만 접근 가능합니다. 상속 관계에서 부모 클래스의 필드나 메서드를 자식 클래스가 접근할 수 있게 허용하는데 사용됩니다.
<HTML />public class Parent { protected String familyName = "Smith"; protected void printFamilyName() { System.out.println(familyName); } } public class Child extends Parent { public void showFamily() { printFamilyName(); // 자식 클래스에서 부모의 protected 메서드 접근 가능 } }
위 코드에서 Child 클래스는 Parent 클래스를 상속받아, 부모 클래스의 protected 필드와 메서드에 접근할 수 있습니다. 하지만 다른 패키지에 있는 상속받지 않은 클래스는 이 멤버들에 접근할 수 없습니다.
4. default: 패키지 내에서만 접근 가능
default 접근 제어자는 명시적으로 설정하지 않은 경우 자동으로 적용됩니다. 즉, 별도의 제어자를 지정하지 않으면 해당 멤버는 default로 간주됩니다. 같은 패키지 내에서는 접근이 가능하지만, 다른 패키지에서는 접근할 수 없습니다.
<HTML />class MyClass { int id; void printId() { System.out.println(id); } }
위 예시에서 id 필드와 printId 메서드는 접근 제어자가 명시되지 않았기 때문에 default로 간주됩니다. 따라서 같은 패키지 내의 클래스들은 이 멤버들에 자유롭게 접근할 수 있지만, 다른 패키지에서는 접근할 수 없습니다.
5. 접근 제어자의 사용 시 주의사항
접근 제어자를 적절히 사용하는 것은 클래스 설계에서 중요합니다. 중요한 데이터나 메서드에 불필요한 접근을 허용하면 보안 문제나 잘못된 상태 변경이 발생할 수 있습니다. 반대로, 너무 제한적으로 설정하면 확장성이 떨어지거나 유닛 테스트 작성이 어려울 수 있습니다.
권장 사항
• 캡슐화가 중요한 필드는 private으로 설정하고, 필요한 경우에만 getter/setter를 제공
• 상속받은 클래스에서만 사용해야 할 메서드는 protected로 선언
• 외부에서 꼭 접근해야 할 멤버만 public으로 공개
• 특별한 이유가 없다면 default 접근 제어자는 지양하는 것이 좋습니다. 패키지 의존성이 생길 수 있기 때문입니다.
6. 마무리
Java의 네 가지 접근 제어자(public, private, protected, default)는 클래스나 객체 간의 관계를 적절히 조절하는 데 중요한 역할을 합니다. 올바르게 접근 제어자를 사용하면 클래스 내부의 데이터 보호, 확장성 유지, 코드 유지 보수성을 높일 수 있습니다. 코드 작성 시 각 멤버에 적합한 접근 제어자를 신중하게 선택하는 것이 중요합니다.
'JAVA' 카테고리의 다른 글
Java record: 불변 객체의 간결한 정의와 활용 (0) | 2024.10.23 |
---|---|
Java Stream API 사용법 (0) | 2024.10.21 |
Java Enum 사용법과 활용 예시 (4) | 2024.10.18 |