[Java] 자바의 4가지 접근 제어자

하원·2024년 5월 4일
post-thumbnail

안녕하세요, 하원입니다.
이번에는 자바의 접근 제어자에 대해 알아보겠습니다.


접근 제어자

자바에는 public, private, protected, default와 같이 4가지의 접근 제어자가 존재합니다.

보통 publicprivate을 자주 사용하고, protected는 여러 코드를 구경하면서 본 것 같지만, default는 솔직히 이번에 처음 접했는데요..!
이번 기회에 접근 제어자를 다시 자세히 공부해 보는 시간을 가져보도록 하겠습니다.


public

먼저 코드 작성 중에 제일 자주 접하게 되는 public인데요!
public 접근 제어자를 사용하면 해당 객체를 사용하는 모든 클래스모든 패키지에서 접근이 가능해집니다.

public class Member {
    public String name;
    public int age;

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }
}
public class Main {
    public static void main(String[] args) {
        Member member = new Member();
        System.out.println(member.name);
        System.out.println(member.getAge());
    }
}

위 코드와 같이 Member 클래스의 field와 method를 public으로 지정하고,
다른 클래스에서 Member 객체를 만들면 위와 같이 field와 method에 모두 접근할 수 있게 됩니다.

"그러면 모두 public으로 선언해서 편하게 사용하면 되지 않나요?"

물론 본인만 사용하는 코드거나 작은 규모로 진행되는 프로젝트라면 public으로 선언해 두고 사용해도 무방합니다. 하지만, 규모가 커지거나 여러 개발자가 함께 협업하는 경우에는 코드에 숨겨져 있는 의도를 알 수 없기 때문에 접근 금지와 같은 설정이 필요해지게 됩니다.

예를 들면 누군가가 외부에서 age를 음수로 바꿔버릴 수도 있겠죠?


private

그 다음으로는 public과 더불어 많이 사용되는 private 입니다.
private 접근 제어자를 사용하면 private으로 지정된 field나 method는 해당 클래스 내에서만 접근할 수 있게 됩니다. 또한, 외부 클래스와 외부 패키지에서는 접근할 수 없습니다.

public class Member {
    public String name;
    public int age;
    private String password;

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        if (password.length() < 12) {
            System.out.println("12자리 이상의 비밀번호를 입력하세요.");
            return;
        }
        this.password = password;
    }
}

위 코드를 보면 Member의 password와 같은 외부에 노출해서는 안되는 필드를 private으로 보호할 수 있습니다.

또한, private으로 설정된 필드는 해당 클래스 내부에 존재하는 public method를 통해 접근할 수 있는데요, 위와 같이 민감한 필드라면 조건문을 추가하여 처리해 줄 수 있습니다.


Member member = new Member();
member.setPassword("hawon");

만약 외부에서 위처럼 "hawon"으로 비밀번호를 설정하려고 하면 길이가 5이기 때문에 조건문에 걸리게 되겠죠?

이렇게 클래스 내부에서만 사용할 변수 또는 메서드를 private으로 지정하여 외부 접근을 막는 기능을
정보 은닉(Information Hiding)이라고 합니다.
그리고 정보 은닉은 객체지향 프로그래밍에 해당하는 기법으로, 정보를 은닉하여 보안이 향상되는 것 뿐만 아니라 은닉된 부분은 외부에서 알 필요가 없는 정보이기 때문에 서로의 역할에만 더 집중할 수 있게 됩니다.


protected

그다음으로 protected 접근 제어자를 사용하면, 같은 패키지 안에 있는 모든 클래스와 해당 클래스를 상속하는 자식 클래스에서 접근이 가능해집니다.

public class Member {
    public String name;
    public int age;
    protected String password;
}

위 사진처럼 core 패키지와 outside 패키지가 존재하고, Member 클래스의 password 필드가 protected라면

  • 같은 패키지에 있는 Computer 클래스 -> password 접근 가능
  • 다른 패키지에 있는 OtherPackage 클래스 -> password 접근 불가능

public class OtherPackage extends Member {
    public static void main(String[] args) {
        OtherPackage otherPackage = new OtherPackage();
        String password = otherPackage.password;

        Member member = new Member();
        member.password -> 불가능
    }
}

위 코드와 같이 OtherPackage 클래스가 Member상속하는 경우, password에 접근할 수 있습니다. 하지만 OtherPackage 객체를 통해서만 접근이 가능하고, 위 코드처럼 Member 객체를 통해서는 접근이 불가능 합니다.
개인적으로는 해당 부분이 개발자에게 혼란을 야기시킨다고 생각하기 때문에 저는 protected같은 패키지에서만 접근하도록 제한하는 용도로 사용하는 것이 더 편한 것 같습니다.


default

마지막으로 default 접근 제어자를 사용하면, 같은 패키지 안에 있는 클래스에서만 접근이 가능해집니다. default 이름의 뜻과 같이 default 접근 제어자는 개발자가 field나 method에 아무런 접근 제어자를 설정하지 않으면 자동으로 default로 설정됩니다.

public class Member {
    String name;
    int age;
    String password;
}

위와 같이 접근 제어자를 설정하지 않으면 default가 자동으로 붙게 됩니다.

public class Computer {
    public static void main(String[] args) {
        Member member = new Member();
        String password = member.password;
    }
}

그러면 위와 같이 같은 패키지에 있던 Computer 클래스에서 Member 객체를 만들어 field에 접근할 수 있게 됩니다.

그리고 default 접근 제어자는 인터페이스의 메서드 구현에도 사용됩니다. 인터페이스를 구현하는 클래스에서 override 해야 하는 메서드가 존재하는데 가끔 인터페이스 내에서 이미 구현되어 있는 메서드를 볼 수 있습니다. 이때 해당 인터페이스를 들어가 보면 default를 사용해서 메서드에 기본 구현을 해둔 것을 볼 수 있습니다.


정리

public : 모든 클래스, 모든 패키지
private : 선언된 해당 클래스
protected : 같은 패키지, 자식 클래스(다른 패키지에 존재해도 가능)
default : 같은 패키지


마무리

접근 제어자는 자바를 사용하면서 흔하게 접할 수 있는 개념이다.
하지만 public과 private만 주로 사용했기 때문에 나머지 protected와 default를 자세히 알지 못했다. 심지어 private에는 정보 은닉과 같은 객체지향 프로그래밍 개념이 연관되어 있었다.
앞으로는 접근 제어자 뿐만 아니라 다른 자바의 기초 개념들을 꼼꼼히 학습해야겠다.

profile
호기심 저장소

0개의 댓글