접근제어자 (Access Modifier)

public, private, protected



접근제어자 3가지

자바(Java)의 접근제어자는 private, public, protected 3가지이다.

 

 

  • public : 클래스(Class) 외부에서 사용할 수 있도록 공개

  • private : 클래스(Class) 외부에서 사용할 수 없도록 비공개

  • protected : 클래스(Class) 외부에서 사용할 수 없도록 비공개하지만, 상속받은 자식 클래스에게만 사용할 수 있도록 공개

자바는 private과 protected를 통해 외부에서 접근을 못하도록 할 수 있기 때문에, 자료의 은폐화 혹은 캡슐화(Encapsulation, 인캡슐레이션) 를 가질 수 있는 언어라고 말한다.

 

 

접근제어자 사용 위치

자바(Java)의 접근제어자를 사용할 수 있는 곳은 클래스(Class), 함수(Function), 변수(Variable)이다. 예를들면, 아래처럼 코드를 작성할 수 있다. 이 글에서는 클래스(Class)에 대한 접근제어 설명은 하지 않고, 함수(Function)와 변수(Variable)에 대한 접근제어자에 따른 특징 설명만 한다.

public Class Joker {	// Class 앞에 Access Modifier 사용
	private int s;	// Variable 앞에 Access Modifier 사용
	protected setS(int s);	// Function 앞에 Access Modifier 사용
}

 

 

접근제어자 범위(Scope)

자바(Java)의 접근제어자를 사용했을 때, 어느 범위(Scope)까지 영향을 미치는지 이해하는 것이 중요 한다. 클래스(Class) 내에 변수(Variable) 앞에 작성한 접근제어자에 따라 아래처럼 영향을 미치는 범위가 구분된다.

 

Class 내 접근제어자별 범위

그림처럼 하나의 Class(=Joker Class) 안에 public, protected, private 를 사용해서 정의한 변수와 함수들이 있을 때, 각각에 대해서 접근할 수 있는 범위가 다르다.

 

Class 내 접근제어자별 범위 이해

아래 그림은 하나의 Class(=Joker Class) 내에 변수 3개에 대해 각각 다른 접근제어자들을 사용한 것이다. 그리고 해당 Class를 사용하려는 다른 Class(=ExeJoker Class, JokerChild)들이 어떤 변수들까지 접근을 할 수 있는지 설명하는 내용이다.

 

[ Class 하나를 만들어서 사용한 경우 ]

 

[ Class 하나를 만든 후, 상속받아서 새로운 Class도 만들어서 사용한 경우 ]

Public

public을 사용하는 이유

public은 자료보호를 하지 않고 외부에서 사용가능하도록 공개하기 위함이다.

 

public을 을 외부에서 접근하는 방법

public은 외부로 사용할 수 있도록 공개하는 것이 목적이기 때문에 변수와 함수 앞에 public 키워드만 있다면, Class 외부에서 접근이 가능하다.

 

[이해] Joker Class의 모든 변수와 함수는 public으로 정의했기 때문에, Caller Class에서는 직접 접근해서 사용할 수 있다. 

public class Joker {
	public int p;               // public 변수 정의
	public void setP(int x){	// public 함수 정의
		p = x;
 	}
	public int getP(){          // public 함수 정의
 		return P;
 	}
}

public class Caller {
 	public static void main(String[] args) {
   		Joker t = new Joker();
   		int s;
   		t.p = 1000;           	// public 변수 직접 접근
   		System.out.println("s의 값은: " + s);
   		t.setP(1000);           // public 함수 직접 호출
   		s = t.getP();           // public 함수 직접 호출
   		System.out.println("s의 값은: " + s);
 	}
}



Private

private을 사용하는 이유

private은 자료보호를 해서 외부에서 사용못하도록 공개하지 않기 위함이다. 변수와 함수 앞에 private 키워드가 있다면, 해당 변수와 함수는 Class 내부에서만 접근 가능하다.

 

private을 외부에서 접근하는 방법

private은 자료보호를 위해 외부에서 접근을 할 수 없지만, 일반적으로 외부에서 접근 할 수 있는 public 함수를 통해서 접근하는 기법을 사용한다.

 

  1. Class 안에 (외부에서 접근할 수 없는) private 변수 or  함수를 만든다.

  2. Class 안에 (외부에서 접근할 수 있는) public 함수를 만든다.

  3. Class 안에 private 변수 or 함수를 외부에서 사용할 때는 public 함수통해 접근한다.

 

1. private 변수를 외부에서 접근

Class 내에 있는 private 변수로 접근할 수 있는 방법은 public 함수를 만든 후, 이 함수를 통해 우회해서 접근하는 것이다.

 

[이해] 앞의 방법에 맞게 작성한 예제 코드이다. 아래 코드는 두개의 독립된 Class(Joker Class, Caller Class)를 만들었고, Caller Class에서 Joker Class의 객체 안에 있는 private 변수에 접근하는 방법을 설명하는 코드이다.

public class Joker {
	private int s;             // 1. private 변수 정의
 	public void setS(int x){   // 2. public 함수 정의 (private 변수에 직접 접근)
   		s = x;
 	}

 	public int getS(){        // 2. public 함수 정의 (private 변수에 직접 접근)
   		return s;
 	}
}

public class Caller {
 	public static void main(String[] args) {
   		Joker t = new Joker();
   		t.setS(1000);            // 3. public 함수 직접 호출 (private 변수에 간접 접근)
   		int s = t.getS();        // 3. public 함수 직접 호출 (private 변수에 간접 접근)
   		System.out.println("s의 값은: " + s);
 	}
}

 


2. private 함수를 외부에서 접근

Class 내에 있는 private 변수로 접근하는 방법도 위와 동일하다. public 함수를 만든 후, 이 함수 내부에서 private 함수가 호출되도록 작성하면, 사용할 때는 이 함수를 통해 우회해서 접근하는 것이다.

 

[이해] 위에 코드에서 private 변수와 private 함수를 하나씩 추가시켰다. 그리고 이 변수와 함수는 외부에서 직접 호출이 불가능하지만, public 함수를 통해 접근할 수 있다는 것을 볼 수 있다.

public class Joker {
 	private int s;     
 	private int zeroCnt;
 	public void setS(int x){	// 2. public 함수 정의 (private 함수 직접 호출)
   		s = x;
   		if(s == 0) {
    	 	plusZeroCnt();
   		}
 	}
 	public int getS(){
   		return s;
 	}
 	private void plusZeroCnt() {	// 1. private 함수 정의 (private 변수 직접 접근)
   		zeroCnt = zeroCnt + 1;
 	}
}

public class Caller {
 	public static void main(String[] args) {
   		Joker t = new Joker();
   		t.setS(1000);	// 3. public 함수 호출 (private 함수 간접 호출)
   		int s = t.getS();
   		System.out.println("s의 값은: " + s);
 	}
}



Protected

protected을 사용하는 이유

protected는 자료보호를 해서 외부에서 사용못하도록 공개하지 않기 위함이다. 변수와 함수 앞에 protected 키워드가 있다면, 해당 변수와 함수는 Class 내부와 Class를 상속받은 다른 클래스에서만 접근 가능하다.

 

protected을 외부에서 접근하는 방법

protected를 외부에서 접근하는 방법은 위에서 설명한 private과 동일하기 때문에 설명을 생략한다. protected의 접근제어자는 상속(Interitance)과 밀접한 관계가 있다. 따라서, Java의 상속개념을 함께 이해해야 protected를 잘 사용할 수 있을 것이다.