본문 바로가기

Java/Java 기초

접근제어자 public, protected, default, private

접근제어자를 통해서 class간 변수 및 메소드 접근을 제어할 수 있다. 


public: 어떠한 조건에서도 모두 사용할 수 있다.

protected: 같은 패키지 내에 존재하는 class나 상속 class에서 사용할 수 있다.

defualt: 아무 것도 붙이지 않는 경우 default가 되며, 동일 패키지 내에 존재하는 class의 변수와 함수를 사용할 수 있다.

private: 선언된 class 내부에서만 사용이 가능하다.


구체적인 테스트는 아래의 소스를 참고하자.


package package1;

import package2.Class3;

public class Class1 {
	public String publicVar1;
	protected String protectedVar1;
	String defaultVar1;
	private String privateVar1;

	public void test1() {
		Class2 c2 = new Class2();
		publicVar1 = c2.publicVar2;
		protectedVar1 = c2.protectedVar2;
		defaultVar1 = c2.defaultVar2;
		// private 변수는 확인할 수 없다는 메시지와 함께 컴파일 에러가 발생한다.
		// privateVar1 = c2.privateVar2;

		Class3 c3 = new Class3();
		publicVar1 = c3.publicVar3;
		// protected와 default는 동일 패키지 안에서는 사용가능하지만 다른 패키지에 있는 class 변수와 메서드는 사용할 수 없다.
		// protected는 동일 패키지가 아니더라도 상속을 받은 경우라면 사용이 가능하다.
		// protectedVar1 = c3.protectedVar3;
		// defaultVar1 = c3.defaultVar3;
		// privateVar1 = c3.privateVar3;

		Class4 c4 = new Class4();
		publicVar1 = c4.publicVar4;
		protectedVar1 = c4.protectedVar4;
		defaultVar1 = c4.defaultVar4;
		// 동일 Java파일 내에 있어도 다른 클래스라면 private 변수는 사용할 수 없다.
		// privateVar1 = c4.privateVar4;
	}
}

class Class4 {
	public String publicVar4;
	protected String protectedVar4;
	String defaultVar4;
	private String privateVar4;
}


package package1;

import package2.Class3;

public class Class2 extends Class3 {
	public String publicVar2;
	protected String protectedVar2;
	String defaultVar2;
	private String privateVar2;

	public void test2() {
		publicVar2 = publicVar3;
		// 다른 패키지에 있지만 상속받고 있기 때문에 protected 접근제어자를 가진 변수에 접근할 수 있다.
		protectedVar2 = protectedVar3;
		// defaultVar2 = defaultVar3;
		// privateVar2 = privateVar3;
	}
}


package package2;

public class Class3 {
	public String publicVar3;
	protected String protectedVar3;
	String defaultVar3;
	private String privateVar3;
}

'Java > Java 기초' 카테고리의 다른 글

Java Stack 구현  (0) 2018.05.24
XSS(Cross-site scripting) 특수문자 치환  (0) 2018.05.10
Arrays.binarySearch() 사용  (0) 2017.12.29
쓰레드(Thread)의 사용  (0) 2017.12.27
스태틱(static)  (0) 2017.11.23