접근제어자의 종류 / 왜 사용할까?

woonie·2022년 7월 3일
0

프로젝트를 진행하면서 사용했던 접근제어자는 public 과 private만 사용해봤었다.
이외에 2가지의 접근제어자가 있다고는 알고 있었지만 사용해보진 못했다. 이번 기회에 접근제어자에 대해 정확히 이해하고 넘어가야겠다.

1. 접근제어자(Access Modifier)란?

접근제어자는 클래스나 변수, 메서드의 접근을 제어하기 위해 적어주는 예약어를 말한다.
접근제어자는 생략이 가능하며 생략했을 경우 자동으로 default 임을 뜻한다.

  • 접근제어자를 사용하는 이유?

    • 은행에 비유해보자면 은행에 있는 창구에는 누구나 접근하여 일처리를 할 수 있다. 하지만 은행내에 있는 금고에는 관계자외에는 출입이 엄격하게 통제되고 있다. 만약 금고에도 누구나 접근할 수 있고 사용할 수 있다면 큰 문제가 발생하지 않을까?

      이처럼 사용자가 객체에서 사용하는 변수나 메서드를 건드리면 개발자의 의도와 다른 오작동이 생길 수 있다. 접근제어자는 객체의 로직을 보호하기 위해 외부의 접근을 허용하거나 차단하는 보안 목적으로 사용된다. 또 다른 이유로는 사용자들이 객ㅊ페사용에 집중할 수 있도록 돕기위함도 있다.

2. 접근제어자(Access Modifier)의 종류

접근제어자에는 흔히 볼 수 있는 public부터 private, protecte, default 네 가지 종류가 있다.

2-1. public

  • public은 모든 패키지, 클래스에서 접근 가능하다.
    아래의 코드를 참고하여 확인해보자.
package A;

public class ClassA {
    
    public String static = "static";
}
package B;

import A.ClassA;

public class ClassB {

    public static void main(String[] args) {
        
        ClassA.static = "";
    }
}

위와 같이 클래스를 import만 해주면 다른 패키지에서 접근이 가능하여 변수들을 사용할 수 있다.

2-2. protected

  • protected가 붙은 변수나 메서드는 같은 패키지에서 사용 가능하며 다른 패키지의 상속 받은 자식클래스에서 사용 가능하다.
    아래의 코드를 참고하여 확인해보자.
package B;

public class SameClass {
    
    protected String sameVar= "다른 패키지에 속하는 자식 클래스까지 허용";
}
package B_other;

import B.SameClass;

public class ClassB extends SameClass {

    public static void main(String[] args) {
        
        SameClass inst = new SameClass();
        inst.sameVar = "";
    }
}

B패키지에 SameClass 클래스를 정의하여 변수에 protected를 붙이고 ClassB 클래스가 SameClass 클래스를 상속하도록 했다.
상속받은 ClassB에서 SameClass의 변수가 오류 없이 잘 사용된다.

2-3. default

  • 접근제어자가 생략된 변수나 메서드는 default 상태로 같은 패키지,클래스 안에서만 사용 가능하다.
    아래의 코드를 참고하여 확인해보자.
package A;

public class SamePackage {
    
    String sameVar = "같은 패키지 허용";
}
package A;

import A.SamePackage;

public class ClassB {

    public static void main(String[] args) {
        
        SamePackage.sameVar = "";
    }
}

SamePackage의 필드값에 ClassB가 접근이 가능한 이유는 같은 A라는 패키지에 있기 때문이다.

2-4. private

  • private가 붙은 변수나 메서드는 같은 클래스 내에서만 사용 가능하다.
public class SameClass {
    private String var = "같은 클래스만 허용";
    
    private String getVar(){
    return this.var;
    }
}

private는 접근제어자들 중 접근 범위가 가장 작고 같은 패키지 내에서도 해당 클래스에서만 접근이 가능하다.

위의 내용을 표로 정리하자면 아래와 같다

접근제어자외부 패키지에서 사용상속 관계에서 사용외부 클래스에서 사용같은 클래스에서 사용
publicOOOO
protectedXOOO
defaultXXOO
privateXXXO


참고
https://88240.tistory.com/448
https://csw7432.tistory.com/entry/Java-%EC%A0%91%EA%B7%BC%EC%A0%9C%EC%96%B4%EC%9E%90-Access-Modifier
https://makecodework.tistory.com/entry/Java-%EA%B0%9D%EC%B2%B4%EC%A7%80%ED%96%A5-%EC%A0%91%EA%B7%BC%EC%A0%9C%ED%95%9C%EC%9E%90Access-Modifier?category=955623
https://mungto.tistory.com/310
https://peemangit.tistory.com/394
https://doublesprogramming.tistory.com/76

profile
동료들과 함께하는 개발의 중요성에 관심이 많습니다. 언제나 호기심을 갖고 꾸준히 노력하는 개발자로서 성장하고 있습니다.

0개의 댓글