반응형

 

 


Access Modifier(접근 제어자)
    클래스 내의 멤버에 접근을 제한하기 위한 예약어
    객체를 가지고 접근을 하더라도 모두 개방적일 경우
    원치 않는 값의 변경에 따른 에러 등의 문제를 해결하기 위해서 만들어졌으며
    어떠한 클래스이건 내부 멤버에 접근 제한자가 지정되어야 함
    (선언하지 않으면 package로 지정됨)

 

클래스, 생성자, 메서드, 필드에 전부 적용(지역변수는 제외)
private과 protected는 클래스와 생성자에는 잘 사용하지 않음을 권장
일반적으로 멤버 필드는 private , 멤버 메서드는 public으로 선언


직접 접근 가능 범위 비교

 

접근 제어자 예제1.

package exam;

class Test {
	public int pubval;
	protected int proval;
	private int prival;
	int defval;

	public void method() {
		pubval = 1;
		proval = 2;
		prival = 3;
		defval = 4;
	}
}

public class Exam {
	public static void main(String[] args) {
		Test ob = new Test();
		ob.pubval = 10;
		ob.defval = 20;
		ob.proval = 30; 
		// ob.prival = 40; //접근 제한
	}
}

 

private멤버의 접근 제한 확인
Test클래스 내부에 있는 메서드는 모든 멤버에 접근 가능
Exam클래스에서 Test객체의 멤버에 접근 할 때 private멤버에는 접근이 불가

 

접근 제한자가 지정되지 않는(package) 멤버 접근 제한 확인
프로젝트에 ex패키지를 만든다.
위 Test클래스를 별도의 자바 파일로 만들고 ex패키지로 이동한다.


이제 Exam클래스를 보면 Test객체 생성 부분에서 에러가 보인다.


Exam클래스는 exam패키지에 소속되어 있고
Test클래스는 ex패키지에 소속되어 있다.
Exam클래스가 소속된 패키지가 아닌 다른 패키지의 클래스를 사용하는 경우
다음과 같이 import선언이 필요하다.


이제 defval과 proval변수에 접근불가 에러가 보인다.
접근 제한자를 지정하지 않은 package레벨의 멤버는 동일한 패키지에서만 제한이 없다.
protected멤버 역시 여기까지는 package와 접근 제한이 같은 것을 확인할 수 있다.

protected멤버는 package레벨과 같지만 상속 관계에서는 직접 접근이 가능한 멤버이다.
이를 확인하기 위해 이르지만 상속을 사용 하여 확인 해보자.

 

Test클래스에 간단하게 상속받은 ExTest클래스를 정의한다.
상속을하면 부모클래스의 멤버를 모두 가진 형태이다.
자식클래스에 method1()을 하나 정의하여 부모로부터 상속받은 멤버에 접근해 보도록 한다.

 

위와 같이 private멤버만 접근이 불가능하다.
여기까지만 보면 package와 protected의 차이가 보이지 않는다.

마지막으로 상속받은 클래스를 복사하여 별도의 자바파일로 정의한다.
정의한 파일을 ex패키지로 옮겨보도록 하자.

 

이제 package와 protected의 차이가 확인이 된다.
protected멤버는 상속받은 자식멤버는 직접 접근이 가능하다.
package는 동일한 패키지에서만 접근이 가능하며 다른 패키지에서는 접근이 불가하다.
여기까지 패키지와 import등을 이용하여 접근제한자의 의미와 범위를 이해할 수 있겠다.

 

반응형

+ Recent posts