♨학습내용
☞ package 키워드
☞ import 키워드
☞ 클래스패스
☞ CLASSPATH 환경변수
☞ -classpath 옵션
☞ 접근지시자
- package 키워드
- Package는 Class, Interface file의 집합이다.
- 클래스를 구분짓는 폴더 개념
- 패키지의 가장 상위 디렉토리(root)에서 실행해야 한다는 약속이 있기 때문에 해당 패키지로 가서 컴파일 하지 않는다.
- 소스에 가장 첫 줄에 있어야하며, 패키지 선언은 소스 하나에 하나만 있어야한다.
- 패키지 이름과 위치한 폴더의 이름이 같아야한다.
- 패키지 이름을 java로 시작하면 안된다.
- 모든 클래스에는 정의된 클래스 이름과 패키지 이름이 있다. 이 둘을 합쳐야 완전하게 한 클래스를 표현한다고 할 수 있으며, 이를FQCN(Fully Qualified Class Name)라고 표현한다.
- 예를 들어 자바의 Map 객체를 사용한다고 가정 했을 때, 해당 Map은 자바에서 편의를 제공해주는 자료구조 API이며 이 Map 클래스의 FQCN은 java.util.Map이다.
package com.example.test; // package
public class Car {
// logic
}
- 위 소스를 기준으로 보면 FQCN(Fully Qualified Class Name) 은 아래와 같다.
Class Name : Car
Package Name : com.example.test
FQCN : com.example.test.Car
- Package Naming Rule : 최상위 도메인/나라코드.회사명.프로젝트명
- 최상위 도메인/나라코드 : com, net, org...
- 회사명 : 회사명, 그룹명...
- 프로젝트명 : 프로젝트명, 프로그램명
- Built In Package
- 자바는 개발자들이 사용할 수 있도록 편의성을 제공하기 위해서 여러 많은 패키지, 클래스들을 제공하고 있다.
- 예를 들어 java.lang, java.util 패키지가 개발자들이 자주 사용했던 클래스들을 포함하고 있는 아주 대표적인 패키지다.
package com.example.test;
public class Car {
public void print() {
String str = ""; // 별도의 import없이 java.lang.String을 사용할 수 있음
}
}
- import 키워드
- Import는 다른 클래스나 인터페이스를 참조할 때 사용한다.
- 동일한 패키지 내의 클래스나 인터페이스를 참조할 때는 별도로 추가하지 않아도 된다.
- 다른 패키지의 클래스나 인터페이스를 참조할 때 사용한다.
- Static을 사용할 때도 사용할 수 있다.
- 아래와 같이 import 키워드를 사용할 수 있다.
import 패키지명.클래스명
- 패키지의 모든 하위 클래스를 import 하는 경우 import 패키지명.* 처럼 import 할 수 있다.
import java.util.*
- 만약 서로 다른 패키지가 같은 이름을 가진 클래스를 가지고 있다면 이는 컴파일시 에러로 이어진다.
- 왜냐하면 컴파일러가 무슨 클래스를 load 해야될지 모르기 때문이다.
- 이러한 경우를 피하기 위해서는 특정 클래스의 주소를 import하는 방식을 사용해야한다.
- 같은 이름을 가진 클래스들을 모두 사용해야한다면 패키지 전체 주소를 이용하는 방식을 사용해야한다.
ex) Date라는 클래스는 java.util 패키지에도 존재하고 java.sql 패키지에도 존재한다.
import java.util.*;
import java.sql.*;
- 이렇게 사용할 경우 컴파일 에러를 발생시키기에 import 방식이 아닌 전체 주소를 이용하는 방식을 이용해야한다.
java.util.Date utilDate = new java.util.Date();
java.sql.Date sqlDate = new java.sql.Date(0);
- 클래스패스
- JVM에서 Application을 구동하면 Class Loader가 클래스패스 변수를 기준으로 클래스 파일들을 찾아 Load 시킨다.
- Java Application 실행순서
- JVM이 실행되기 전에 메모리를 할당 받는다.
- Java Complier에서 .java 파일을 .class로 변환한다. (바이트 코드)
- Class Loader가 .class 파일을 Load 한다.
- Excution Engine을 통해 Load된 Class 파일을 해석한다.
- 해석된 byte code는 Runtime Memory Area를 통해 사용된다.
- Java Application 실행 중 3번에서 Class Loader가 .class 파일을 찾을 때 클래스패스를 기준으로 찾는다.
- 클래스패스를 설정하는 방법은 2가지가 있다.
(1) 환경 변수 CLASSPATH를 사용하는 방법
(2) java runtime에 -classpath 옵션을 사용하는 방법
- CLASSPATH 환경변수
- 컴퓨터 시스템 변수 설정을 통해 지정할 수 있다.
- JVM이 시작될 때 JVM의 클래스 로더는 이 환경 변수를 호출한다.
- -classpath 옵션
- 원래의 자바 컴파일러인 javac를 사용할 때는 javac <options> <source filed>와 같은 형태로 컴파일을 했었지만
- 참조할 클래스 파일들을 찾기 위해서 파일 경로를 지정해주는 -classpath 옵션이 있다.
- 예를들어, 컴파일 할 Test.java파일이 C:\Users에 있고, 필요한 클래스파일들이 C:\Java\classes에 존재한다면,
- javac -classpath C;\Java\classes C:\Users\Test.java로 옵션을 주면 컴파일시에 클래스패스가 참조된다.
- 이 때, -cp로 약자를 사용하여 옵션을 주는 것도 가능하다.
- 접근지시자
- 접근지시자는 클래스, 메소드, 인스턴스 및 클래스 변수를 선언할 때 사용된다.
- 접근지시자는 크게 public, protected, default, private 으로 총 4가지이다.
같은 클래스 | 같은 패키지 | 상속받은 클래스 | import한 클래스 | |
public | O | O | O | O |
protected | O | O | O | X |
default | O | O | X | X |
private | O | X | X | X |
* public
- 어디서든 접근 가능하다.
* protected
- 같은 패키지에 있거나, 상속 받는 경우 사용할 수 있다.
* default
- 아무런 접근제어자를 적어주지 않은 경우이며, 같은 패키지 또는 클래스 내부에서 접근 가능하다.
* private
- 해당 클래스 내에서만 접근 가능하다.
'Study > Java_study' 카테고리의 다른 글
Java_study_9 (예외처리) (0) | 2021.08.23 |
---|---|
Java_study_8 (인터페이스) (0) | 2021.08.17 |
Java_study_6 (상속) (0) | 2021.08.09 |
Java_study_5 (클래스) (0) | 2021.08.04 |
Java_study_4 (제어문) (0) | 2021.08.01 |