본문 바로가기

Java

[자바의 신] 접근제어자

4년 넘게 개발하면서 이제야 중요성을 인식하는 것중 하나가 바로 접근제어자이다. 이 접근제어자를 제대로 쓸 줄 알아야 정보은닉, 캡슐화 등 객체지향 프로그래밍의 주요 개념들을 제대로 사용할 수 있다고 생각한다. 

 

자바의 접근제어자는 클래스, 메소드, 인스턴스 변수, 클래스 변수를 선언할때 사용한다. 접근제어자는 public, protected, package-private, private 4가지가 있다. 이중에서 protected와 private는 클래스 안에서만 쓸 수 있다. 클래스를 선언할때 쓸 수 없다.

 

  • public
    • 같은 클래스에서 접근 가능
    • 같은 패키지에서 접근 가능
    • 다른 패키지에서 접근 가능
    • 상속받았을때 접근 가능
  • protected
    • 같은 클래스에서 접근 가능
    • 같은 패키지에서 접근 가능
    • 상속받았을때 접근 가능
  • package-private
    • 같은 클래스에서 접근 가능
    • 같은 패키지에서 접근 가능
  • private
    • 같은 클래스에서 접근 가능

위에서 아래로 접근할수 있는 범위가 좁아진다.(public > protected > package-private > private)

 

javastudy>com>molt 패키지에 AccessInClass.java 파일을 만들었다.

package com.molt;

public class AccessInClass {

    public static void main(String[] args) {
        AccessInClass accessTest = new AccessInClass();
        accessTest.publicAccess();
        accessTest.protectedAccess();
        accessTest.packagePrivateAccess();
        accessTest.privateAccess();
    }

    public void publicAccess () {
        System.out.println("public");
    }

    protected void protectedAccess () {
        System.out.println("protected");
    }

    void packagePrivateAccess () {
        System.out.println("packagePrivate");
    }

    private void privateAccess () {
        System.out.println("private");
    }
}
// 결과
public
protected
packagePrivate
private

같은 클래스 안에서는 모든 접근제어자에 접근 가능하다. 

 

이번에는 같은 패키지에 AccessInPackage.java 파일을 만든다.

package com.molt;

public class AccessInPackage {
    public static void main(String[] args) {
        AccessInClass accessInClass = new AccessInClass();
        accessInClass.publicAccess();
        accessInClass.protectedAccess();
        accessInClass.packagePrivateAccess();
    }
}
// 결과
public
protected
packagePrivate

같은 패키지 안에 있지만, 다른 클래스에서는 private 접근 제어자를 가진 메소드 자체를 쓸 수가 없다.

 

이번에는 javastudy > com 패키지에 AccessOutPackage.java를 만들었다. 자바에서 패키지는 상하관계가 아니라 같은 패키지에 속했는지 아닌지만 중요하다고 했다. 다시 말해 com 패키지 안에 molt 패키지가 있지만, 서로 다른 패키지라는것을 이해하고 보자.

package com;

import com.molt.AccessInClass;

public class AccessOutPackage {
    public static void main(String[] args) {
        AccessInClass accessInClass = new AccessInClass();
        accessInClass.publicAccess();
    }
}
// 결과
public

결과는 서로 다른 패키지에 있을때는 public 접근제어자만 접근 할 수 있다.

 

마지막으로 상속받았을 경우를 확인해 보자.

package com;

import com.molt.AccessInClass;

public class AccessExtends extends AccessInClass {
    public static void main(String[] args) {
        AccessExtends accessExtends = new AccessExtends();
        accessExtends.call();
    }

    public void call(){
        super.publicAccess();
        super.protectedAccess();
    }
}
//결과
public
protected

상속받은 클래스에서 부모에 있는것을 사용할때는 super 키워드를 쓴다. 이때 public, protected 접근제어자가 붙은것만 사용할 수 있다.

 

이렇게 접근제어자를 사용하면 정보를 선택적으로 노출할 수 있다. 변수를 직접 변경할수 없도록 지정할 수 있고, 특정 로직을 해당 클래스 안에서만 쓸수 있도록 제한할 수 있다.

 

클래스 접근 제어자 선언시 유의사항

  • 클래스를 선언할때는 반드시 파일 이름에 해당하는 클래스가 있어야 한다.
  • 만약 파일 하나에 클래스가 두개 있는데, 파일이름에 해당하는 클래스는 public이 아니고 public으로 선언된 다른 클래스가 있다면 이 파일은 컴파일 되지 않는다.

'Java' 카테고리의 다른 글