글 작성자: 취업중인 피터팬
728x90
기본 환경
JDK : 1.8.0_261 버전
JRE : 1.8.0_261 버전
JAVA VERSION : 8 업데이트 261
Eclipse IDE VERSION : 2020-06버전

 

목표

자바에서 각기 다른 패키지에서 접근 제어지시자가 어떻게 작동하는지 이해한다.


 

 

패키지

E01AccessModifier2와 E01AccessModifier1을 서로 다른 패키지에 넣고 같은 접근지시자로 구성한 후에 E01AccessModifierMain.java파일에서 객체를 생성하고 어떻게 다르게 작동하는지 알아보겠습니다. 먼저 코드를 보여드리겠습니다.

 

E01AccessModifier1.java

package ex10accessmodifier;


/*
 class를 정의할 때는 반드시 public과 default(생략형)만
 사용해야한다.
 */
//private class PrivateClass1 {
//	void myFunc() {
//		System.out.println("나는 정의할 수 없는 Class");
//	}
//}

/*
 접근지정자를 생략했으므로 default클래스로 지정된다.
 해당 클래스는 동일 패키지 내에서만 접근 가능한다.
 */
class DefaultClass1 {
	void myFunc() {
		System.out.println("DefalutClass클래스의 myFunc()메소드 호출");
	}
}

public class E01AccessModifier1 {

	private int privateVar;
	int defaultVar;
	public int pulicVar;
	
	private void privateMethod() {
		privateVar = 100;
		System.out.println("privateMethod() 메소드 호출");
	}
	
	void defaultMethod() {
		privateVar = 200;
		System.out.println("defaultMethod() 메소드 호출");
	}
	
	
	/*
	 private으로 선언된 맴버(변수 혹은 메소드)를 외부 클래스에서 접근하고 싶을때 public으로 선언된 
	 맴버메소드를 이용해서 간접적으로 접근 할 수 있다.
	 */
	public void publicMethod() {
		privateVar = 300;
		System.out.println("publicMethod() 메소드 호출");
		privateMethod();
	}
	
}

 

 

E01AccessModifier2.java

package ex10accessmodifier.sub;


class DefaultClass2{
	void myFunc() {
		System.out.println("DefaultClass 클래스의 myFunc() 메소드 호출");
	}
}

/*
public 클래스는 해당 java파일을 대표하는 클래스로 파일명과 동일하고
다른 패키지에서도 접근이 가능하다. public클래스는 하나의 자바파일에 
하나만 정의할 수 있다.
*/
public class E01AccessModifier2 {
	//맴버변수를 각각의 접근지정자를 통해 선언
	private int privateVar;
	int defaultVar;
	public int pulicVar;
	
	/*
	동일 클래스내에서 private 맴버라 할지라도 접근이 가능한다.
	즉 동일 클래스면 접근 지정자에 영향을 받지 않는다.
	 */
	private void privateMethod() {
		privateVar = 100;
		System.out.println("privateMethod() 메소드 호출");
	}
	
	void defaultMethod() {
		privateVar = 200;
		System.out.println("defaultMethod() 메소드 호출");
	}
	
	public void publicMethod() {
		privateVar = 300;
		System.out.println("publicMethod() 메소드 호출");
		privateMethod();
	}
}

 

 

E01AccessModifierMain.java

 

package ex10accessmodifier;

import ex10accessmodifier.sub.E01AccessModifier2;

public class E01AccessModifierMain {

	public static void main(String[] args) {
		System.out.println("E01AccessModifire1 객체 생성 및 접근");
		/*
		 private으로 선언된 맴버는 동일한 패키지라 할지라도 접근이 불가능하다.
		 해당 맴버는 동일 클래스 내에서만 접근을 허용한다.
		 
		 ※private으로 선언된 맴버를 외부클래스에서 접근할때는 주로
		 public으로 선언된 맴버메소드를 통해 간접적으로 접근한다.
		 */
		
		E01AccessModifier1 one = new E01AccessModifier1();
		
		//System.out.println("one.privateVar = " + one.privateVar); [에러 발생]
		System.out.println("one.defaultVar =" + one.defaultVar);
		System.out.println("one.publicVar = " + one.pulicVar);
		
		//one.privateMethod(); [에러 발생]
		one.defaultMethod();
		one.publicMethod();
		
		/*
		 동일한 패키지에 선언된 클래스이므로 import없이 객체생성 및 
		 접근이 가능하다.
		 */
		System.out.println("DefaultClass 객체 생성 및 접근");
		new DefaultClass1().myFunc();// 객체 생성과 동시에 맴버 메소드 호출
		
		
		
		
		
		/////////////////////////////////////////////////////////////////
		
		
		System.out.println("E01AccessModifier2 객체 생성 및 접근");
		
		/*
		 다른 패키지에 선언된 클래스으므로 객체생성을 위해 import선언을 해야한다.
		 패키지가 다른경우 private, default 맴버에 접근을 허용하지 않는다.
		 */
		
		E01AccessModifier2 two = new E01AccessModifier2();
		
		System.out.println("two.privateVar");

		//System.out.println("one.privateVar = " + one.privateVar); [에러 발생]
		//System.out.println("one.defaultVar =" + two.defaultVar); [에러 발생]
		System.out.println("one.publicVar = " + two.pulicVar);
		
		//one.privateMethod(); [에러 발생]
		//two.defaultMethod(); [에러 발생]
		two.publicMethod();
		
		/*
		 다른 패키지에 정의된 디폴트 클래스이므로 객체생성이 불가능 하다.
		 import도 불가능하므로 아예 사용할 수 없는 클래스가 된다.
		 */
		System.out.println("DefaultClass 객체 생성 및 접근");
		//new DefaultClass2().myFunc();

	}

}

 

 

 

 

결과 값

 

결과 값을 보면 패키지에 따라 실행되는것과 안되는 것이 있습니다. 주석을 보시고 공부하시면 됩니다.

 

 

 

'Java > Java_기초부터 _끝까지' 카테고리의 다른 글

Java 기초 접근제어지시자 - 캡술화  (0) 2020.11.16
Java 기초 접근제어지시자 - 과일판매  (0) 2020.11.16
Java 기초 package(3)  (0) 2020.11.12
Java 기초 package(1)  (0) 2020.11.12
Java 기초 package(2)  (0) 2020.11.12