본문 바로가기
Java

[Java] 접근 제어자 - public, protected, package-private, private

by A6K 2020. 10. 1.

자바 언어에는 접근 제어자(Access Modifier)라는 것이 있다. 프로그래머는 접근 제어자를 통해 변수와 메소드, 클래스에 대한 접근을 제한할 수 있다. 사전에 멤버 변수나 메소드, 클래스들의 성격을 규정하고 잘못된 접근을 차단함으로써 의도하지 않은 실수를 줄이기 위한 자바의 고유 장치다.

특히 클래스의 상속이 고려 대상에 포함될 경우 접근 제어자의 동작이 복잡해지는 경우가 있다. 따라서 접근 제어자에 따른 정확한 동작을 이해하고 코드를 작성해야 실수를 줄일 수 있다.

목차

    자바 접근제어자

    자바에는 4가지 접근 제어자가 있다.

    • private
    • default (package-private)
    • protected
    • public

    private < default < protected < public 순으로 많은 접근을 허용한다.

      같은 클래스 같은 패키지 같은 패키지의
    상속 클래스
    다른 패키지의
    상속 클래스
    전체 클래스
    public O O O O O
    protected O O O O  
    package-private O O O    
    private O        

    접근 제어자의 차이점을 호환표 스타일로 나타내면 위와 같다.

    private

    메소드나 멤버 변수에 private 이 붙어있다면 해당 클래스 내에서만 접근이 가능하다. 같은 패키지에 포함되어 있는 다른 클래스나 자신을 상속하는 다른 클래스에서조차 접근이 불가능하다.

    public class UserClass {
    
        private String member;
    
        private String getMember() {
            return member;
        }
    }

    가장 작은 범위에만 접근을 허용하는 제어자다.

    default(package-private)

    메소드나 멤버 변수에 아무런 접근 제어자가 붙어있지 않은 경우라면 default(package-private) 접근이다.

    package user;
    
    public class UserClass {
    
    	private String name;
    
    	String getName() {
    		return name;
    	}
    }
    
    package user;
    
    public class OtherClass {
    
    	private final UserClass userClass;
    
    	public OtherClass() {
    
    		this.userClass = new UserClass();
    	}
    	
    	public String getName() {
    		return this.userClass.getName();	
    	}
    }

    같은 패키지에 포함되어 있는 다른 클래스까지만 접근을 허용한다.

    protected

    메소드나 멤버 변수에 protected 가 붙어있다면, 같은 패키지에 포함되어 있는 다른 클래스와 해당 클래스를 상속하는 클래스에서 접근할 수 있다.

    package user;
    
    public class UserClass {
    
    	private String name;
    
    	protected String getName() {
    		return name;
    	}
    }
    
    package user;
    
    public class SubClass extends UserClass {
    
    	public void printName() {
    		String name = getName();
    		
    		System.out.println("Name : " + name);
    	}
    }

    public

    메소드나 멤버 변수의 접근 제어자가 public으로 설정되어 있다면 어떤 클래스에서라도 접근가능한 상태다.

    package user;
    
    public class UserClass {
    
    	private String name;
    
    	public String getName() {
    		return name;
    	}
    }

    초보 프로그래머들의 경우 모든 메소드와 멤버 변수들을 public 으로 선언해서 사용하는 경우가 많다. 물론 그렇게 사용해도 프로그램은 잘 동작할 것이다.

    하지만 되도록이면 필요한 최소한의 접근제어자를 설정하는 것이 바람직하다. 모두 public으로 열어주면 코드의 유지보수가 어려워지기 때문이다. 하나의 클래스의 내부 동작을 수정하는 행위가 시스템 전체에 영향을 주지 않도록 최소한의 접근 제어자를 사용하는 습관을 들이자. (IntelliJ나 Eclipse에서 불필요하게 많이 열어두었다는 Warning을 띄우도록 하는 기능이 있다.)

    댓글