접근제어자란?

허준기·2023년 4월 30일
0

자바

목록 보기
3/9

접근제어자

 클래스의 멤버(변수와 메소드)들의 접근권한 지정 
  • public
  • protected
  • default
  • private
  • 같은 클래스같은 패키지다른패키지 서브클래스관계없음
    publicOOOO
    protectedOOOX
    defaultOOXX
    privateOXXX

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

     클래스 내부에 선언된 데이터를 보호하기 위해서 사용한다 → 캡슐화
    데이터가 유효한 값을 유지하도록 하고 외부에서 함부로 변경하지 못하도록 한다

    public

     public으로 설정된 변수, 메소드는 어떤 클래스에서라도 접근이 가능하다 

    protected

     protected로 설정된 변수, 메소드는 같은 클래스, 같은 패키지, 다른 패키지 서브클래스에서 접근이 가능하다. → 다른 패키지 일반클래스에서는 접근이 불가능 

    default

     default로 설정된 변수, 메소드(접근제어자가 붙지 않은 변수, 메소드)는 같은 클래스, 같은 패키지에서 접근이 가능하다. → 다른 패키지에서는 접근이 불가능 

    private

     private로 설정된 변수, 메소드는 같은 클래스 내에서만 접근이 가능하다. 

    자 이제 예시를 들어서 설명해보자!

    예시

    일단 프로젝트를 하나 만들어서 그 안에 패키지 2개와 패키지안에 클래스를 2개씩 만들어 줬다.

    일단 Package2에 있는 MainClass부터 보자

    package Package2;
    
    public class MainClass {
        public MainClass() {
            this._public();
            this._protected();
            this._default();
            this._private();
        }
    
        public void _public() {
            System.out.println("public");
        }
    
        protected void _protected() {
            System.out.println("protected");
        }
    
        void _default() {
            System.out.println("default");
        }
    
        private void _private() {
            System.out.println("private");
        }
    
    }
    
    class MainClassChecker {
        public static void main(String args[]){
            MainClass checker = new MainClass();
            checker._public();
            checker._protected();
            checker._default();
            //checker._private();
        }
    
    }

    MainClass안에는 _public(), _protected(), _defalut(), _private()메소드들이 각 메소드들의 이름에 맞는 접근제어자로 설정이 되어있다. 생성자를 통해서는 4가지 접근제어자 모두에 접근이 가능하다.

    이제 그 아래에 있는 클래스인 MainClassChecker클래스를 보자. 이 클래스에서는 MainClass의 객체를 생성해서 메소드를 수행해준다. _private()를 제외한 다른 메소드들에는 접근이 가능한데 _private() 메소드를 사용하려고 하면 오류가 나서 주석처리를 해줬다.

    이제 다음으로 같은 패키지 안에 있지만 다른 클래스인 SamePackge 클래스를 살펴보자

    package Package2;
    
    public class SamePackage {
        public static void main(String args[]){
            MainClass samepackage = new MainClass();
            samepackage._public();
            samepackage._protected();
            samepackage._default();
            //samepackage._private();
        }
    }

    MainClassChecker 와 같게 _private() 메소드를 제외한 다른 접근제어자들은 잘 동작하는 것을 볼 수 있다.

    이제 다른 패키지를 한번 보자!
    우선 Package1ExtendedClass 부터 살펴보자
    이 클래스는 Package2에 있는 MainClass를 상속받은 클래스이다

    package Package1;
    
    import Package2.MainClass;
    
    public class ExtendedClass extends MainClass {
        public static void main(String args[]){
            ExtendedClass extendedClass = new ExtendedClass();
            extendedClass._public();
            extendedClass._protected();
            //extendedClass._default();
            //extendedClass._private();
        }
    }

    다른 패키지이다 보니 같은 패키지일때랑 조금 달라졌다. _private() 메소드는 당연히 접근이 불가능하고 이제는 _default() 메소드도 접근이 불가능하다. 그래도 MainClass를 상속받아서 아직까지 _protected() 메소드에는 접근이 가능한 것을 볼 수 있다.

    마지막으로 다른 패키지에 있고 상속받지 않은 클래스인 AnotherPackage 클래스를 보자!!!

    package Package1;
    
    import Package2.MainClass;
    
    public class AnotherPackage{
        public static void main(String args[]){
            MainClass anotherPackage = new MainClass();
            anotherPackage._public();
            //anotherPackage._protected();
            //anotherPackage._default();
            //anotherPackage._private();
        }
    }

    다른패키지에 있고 상속도 받지 않다보니 모두 접근할 수 있는 public 으로 설정한 _public() 메소드를 제외하고는 모두 접근할 수 없는 것을 볼 수 있다.

    지금까지 접근제어자에 대해 알아봤다. 다음 글은 static에 대해서 알아볼 예정이다. 그럼 이만!

    참고사이트
    생활코딩

    혼공

    점프 투 자바

    profile
    나는 허준기

    0개의 댓글