개발은 재밌어야 한다
article thumbnail
Published 2024. 10. 22. 09:45
Java 접근 제어자 이해하기 JAVA
반응형

Java 접근 제어자 이해하기


Java에서 접근 제어자(Access Modifier)는 클래스, 메서드, 필드의 접근 수준을 결정하는 중요한 요소입니다. 이 제어자들은 객체 지향 프로그래밍에서 정보 은닉(Encapsulation)을 구현하는데 핵심적인 역할을 하며, 코드의 가독성과 유지보수성을 높이는 데 기여합니다. 이번 글에서는 public, private, protected, 그리고 default 네 가지 접근 제어자의 개념과 사용법을 예시를 통해 알아보겠습니다.

public: 어디서나 접근 가능


public은 가장 개방적인 접근 제어자로, 클래스나 메서드, 필드가 모든 패키지나 클래스에서 접근 가능합니다. 예를 들어, 다른 패키지에 있는 클래스에서도 자유롭게 접근할 수 있습니다.

public class MyClass {
    public String name;

    public void printName() {
        System.out.println(name);
    }
}


위의 코드는 MyClass 클래스의 name 필드와 printName 메서드가 어디서든 접근 가능한 상태입니다. 하지만 주의할 점은, 너무 많은 public 멤버는 객체 간 결합도를 높일 수 있으므로 신중하게 사용해야 한다는 것입니다.

private: 클래스 내부에서만 접근 가능


private는 가장 제한적인 접근 제어자입니다. 해당 클래스 내에서만 필드와 메서드에 접근할 수 있으며, 외부에서 직접 접근할 수 없습니다. 보통 중요한 데이터를 보호하거나 클래스의 내부 상태를 외부에서 임의로 변경하지 못하게 할 때 사용합니다.

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() 메서드를 통해 접근할 수 있도록 캡슐화합니다. 이를 통해 외부에서 잘못된 값을 설정하는 것을 방지할 수 있습니다.

protected: 상속 관계에서만 접근 가능


protected는 같은 패키지 내에서는 public처럼 동작하며, 다른 패키지에서는 상속받은 클래스에서만 접근 가능합니다. 상속 관계에서 부모 클래스의 필드나 메서드를 자식 클래스가 접근할 수 있게 허용하는데 사용됩니다.

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 필드와 메서드에 접근할 수 있습니다. 하지만 다른 패키지에 있는 상속받지 않은 클래스는 이 멤버들에 접근할 수 없습니다.

default: 패키지 내에서만 접근 가능


default 접근 제어자는 명시적으로 설정하지 않은 경우 자동으로 적용됩니다. 즉, 별도의 제어자를 지정하지 않으면 해당 멤버는 default로 간주됩니다. 같은 패키지 내에서는 접근이 가능하지만, 다른 패키지에서는 접근할 수 없습니다.

class MyClass {
    int id;

    void printId() {
        System.out.println(id);
    }
}


위 예시에서 id 필드와 printId 메서드는 접근 제어자가 명시되지 않았기 때문에 default로 간주됩니다. 따라서 같은 패키지 내의 클래스들은 이 멤버들에 자유롭게 접근할 수 있지만, 다른 패키지에서는 접근할 수 없습니다.

접근 제어자의 사용 시 주의사항


접근 제어자를 적절히 사용하는 것은 클래스 설계에서 중요합니다. 중요한 데이터나 메서드에 불필요한 접근을 허용하면 보안 문제나 잘못된 상태 변경이 발생할 수 있습니다. 반대로, 너무 제한적으로 설정하면 확장성이 떨어지거나 유닛 테스트 작성이 어려울 수 있습니다.

권장 사항

• 캡슐화가 중요한 필드는 private으로 설정하고, 필요한 경우에만 getter/setter를 제공
• 상속받은 클래스에서만 사용해야 할 메서드는 protected로 선언
• 외부에서 꼭 접근해야 할 멤버만 public으로 공개
• 특별한 이유가 없다면 default 접근 제어자는 지양하는 것이 좋습니다. 패키지 의존성이 생길 수 있기 때문입니다.

마무리


Java의 네 가지 접근 제어자(public, private, protected, default)는 클래스나 객체 간의 관계를 적절히 조절하는 데 중요한 역할을 합니다. 올바르게 접근 제어자를 사용하면 클래스 내부의 데이터 보호, 확장성 유지, 코드 유지 보수성을 높일 수 있습니다. 코드 작성 시 각 멤버에 적합한 접근 제어자를 신중하게 선택하는 것이 중요합니다.

반응형

'JAVA' 카테고리의 다른 글

Java record: 불변 객체의 간결한 정의와 활용  (0) 2024.10.23
Java Stream API 사용법  (0) 2024.10.21
Java Enum 사용법과 활용 예시  (10) 2024.10.18
profile

개발은 재밌어야 한다

@ghyeong

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!