본문 바로가기

JAVA

클래스 패스, 패키지 & 접근 제어

현재 디렉터리의 정보가 다음과 같을 때,

[main.java] [aaa.java] [bbb.java]

main.java 에서는 aaa.java bbb.java 를 모두 이용할 수 있다.

 

그런데,

[main.java]

->aaa -> [aaa.java]

->bbb ->[bbb.java]

 

즉, 하위 디렉터리 aaa와 bbb에 aaa.java, bbb.java가 있는 경우에는 main.java에서 aaa.java bbb.java를 이용할 수 없다.

컴파일 시 aaa.java bbb.java 가 현재 디렉터리에 없기 때문이다.

 

이 경우 환경변수 중 classpath에 aaa.java, bbb.java 가 있는 경로를 설정하면 컴파일이 가능하다.

 

또 다른 방법은 패키지를 이용하는 것이다.

위와  같은 상황에서 aaa.java, bbb.java 를 다음과 같이 작성하여 패키지로 선언할 수 있다.

 

package AAA;

public class asimple {
	
	public asimple()
	{
		System.out.println("AAA.simple");
	}
}
package BBB;

public class bsimple {
	
	public bsimple()
	{
		System.out.println("BBB.simple");
	}
}

패키지 선언은 디렉터리 관점으로 보면 된다.

즉, aaa -> aa -> [aaa.java] 라면 위 패키지 선언은

package AAA.aa; 

로 되야 한다.

 

그리고 main.java를 다음과 같은 방식으로 작성한다.

import AAA.asimple;
import BBB.bsimple;

public class example {
	
	public static void main(String[] args)
	{
		//AAA.asimple as = new AAA.asimple();
		//BBB.bsimple bs = new BBB.bsimple();
		
		asimple as = new asimple();
		bsimple bs = new bsimple();
	}
}

클래스 이름만 다르면 import 시켜 바로 사용할 수 있고,

패키지 명 부터 클래스 이름 까지 전부 포함하여 사용 할 수 있다.

 

자바의 모든 클래스는 반드시 하나의 패키지에 포함되어야 한다.

그러나 별도의 패키지 선언 없이도 자바 소스 작성 및 컴파일 후 실행이 가능한데,

이는 패키지 선언이 별도로 존재하지 않으면 default package에 묶이기 때문이다.

 

그리고 자바에서 기본적인 라이브러리에 대하여 별도로 import 시킬 필요가 없는데,

이는 import java.lang.* 이 컴파일 시 자동으로 삽입되기 때문이다.

 

  클래스 내부 동일 패키지 상속받은 클래스 이외 모든 영역
private o x x x
default o o x x
protected o o o x
public o o o o

변수 선언 시 별도로 접근제어 지시자를 선언하지 않은 경우는 default로 처리되며

상속받은 클래스의 경우 접근이 제한되는 것은 다른 패키지의 존재하는 클래스를 상속하는 경우로 생각하면 된다.

 

public class는 디폴트 생성자도 public 이며,

default class에 경우 디폴트 생성자는 default이다.

 

static 변수의 초기화 시점은 JVM에 의해 클래스가 메모리 공간에 올라가는 순간이다.

static 메소드는 별도의 인스턴스 생성 없이 클래스 이름만 가지고 호출할 수 있다.

 

그리고 자바에서는 메소드의 종류에 상관없이 메소드 내에서 자신이 속해있는 클래스의 인스턴스 생성을 허용한다.

그래서 다음과 같이 인스턴스의 무한한 생성을 제한 할 수 있다.

class limit
{
	private static limit s = null; //디폴트로 null로 초기화 됨,
	private int t; //디폴트로 0으로 초기화 됨, 
	
	private limit()
	{
		//생성자 사용 불가,
		System.out.println(s); //static 변수는 클래스내 어디에서나 접근 가능,
	}
	
	public static limit create()
	{
		if (s == null) //if 절에는 무조건 boolean type으로 와야함,
			s = new limit();
		
		//System.out.println(t++); //static 메소드에서는 인스턴스 변수에 접근 불가,
		return s;
	}
}

 

'JAVA' 카테고리의 다른 글

Nested class, Lambda basic & concept  (0) 2021.10.21
객체와 참조변수  (0) 2021.10.21
자바 자료형 및 기타 연산자  (0) 2021.10.21