티스토리 뷰

Java

7. 패키지

kingsubin 2021. 1. 2. 12:12

목표

자바의 패키지에 대해 학습하세요.

학습할 것 (필수)

  • package 키워드
  • import 키워드
  • 클래스패스
  • CLASSPATH 환경변수
  • classpath 옵션
  • 접근지시자

1. package 키워드

- 왜 사용 하는가 ?

1. 이름 충돌 방지

college.staff.cse.Employee, college.staff.ee.Employee 

이런식으로 두 개의 같은 클래스가 있을때 cse, ee 와 같이 다른 패키지에 넣어서 충돌을 방지 할 수 있다.

 

2. 클래스, 인터페이스, 이넘, 애노테이션을 찾기 쉽게끔 한다.

패키지를 사용하면 만들거나 찾을때 유용하다.

 

3. 접근제어자를 통하여 패키지 마다 접근을 다르게 할 수 있다

접근제어자 마다 패키지 접근하는게 다른데 이것을 가능하게 한다.

 

- 패키지 이름 지정 규칙 ?

도메인 이름의 역순 (필수는 아니다.)

ex) org.geeksforgeeks.practice , college.tech.cse 등등...

 

- 패키지는 어떻게 작동하는가 ?

패키지 이름과 디렉토리 구조는 밀접하게 관련이 있다.

패키지 이름이 예를 들어 college.staff.cse라면 college - staff - cse  라는 3개의 디렉토리가 있다.

여기서 college 디렉토리는 CLASSPATH 변수를 통해 접근이 가능하다.

즉, college 디렉토리의 상위 디렉토리 경로가 CLASSPATH 에 있다.

패키지의 아이디어는 클래스를 쉽게 찾을수 있도록 하는 것이다.

 

 

 

- 패키지 유형

 

https://www.geeksforgeeks.org/packages-in-java/

내장 패키지는 Java API 의 다수의 클래스로 구성된다.

일반적으로 사용되는 내장 패키지들은 아래와 같다.

 

1. java.lang 

언어 지원 클래스를 포함한다. (ex. primitive type, 수학연산)

이 패키지는 자동으로 import 되어진다.

 

2. java.io 

입력, 출력을 위한 클래스가 포함되어 있다.

 

3. java.util

데이터 구조를 구현하는 유틸 클래스를 포함한다. (ex. Linked List, Dictonary)

 

4. java.applet

Applets 생성을 위한 클래스를 포함한다.

 

5. java.awt

그래픽 사용자 인터페이스에 대한 구성요소를 구현하기 위한 클래스를 포함한다.

(ex. button, menus)

 

6. java.net

네트워킹 작업을 지원하는 클래스를 포함한다.

 


2. import 키워드

- 패키지 내부의 클래스 접근

// util 패키지에서 Vector 클래스를 가져옵니다.
import java.util.vector;

// utill 패키지에서 모든 클래스를 가져옵니다.
import java.util.*;

 

import java.util.Vector; 
   
public class ImportDemo { 
  public ImportDemo() { 
    // 위에서 Vector를 import 했기에 접근가능하다.
    Vector newVector = new Vector(); 
   
    // java.util.ArrayList 는 import 되지 않았다.
    // 이럴때, 아래 처럼 완벽한 pacakage 를 적어서 사용할 수 있다.
    java.util.ArrayList newList = new java.util.ArrayList(); 
  } 
   
  public static void main(String arg[]) { 
    new ImportDemo(); 
  } 
} 

 

- Static import

public static 으로 정의된 필드를 static import 를 통해 사용할 수 있다.

import static java.lang.System.*; 
   
class StaticImportDemo { 
  public static void main(String args[]) {       
    // 위에서 System 을 static import 했기에 System을 사용할 필요가없다.
    out.println("GeeksforGeeks"); 
   } 
} 

 

- 이름 충돌 방지

import java.util.*;
import java.sql.*;

Date today ; //ERROR-- java.util.Date or java.sql.Date?

java.util, java.sql 모두에 Date란 클래스가 있고 사용시 위와 같이 컴파일러는 어떤 Date 클래스를 말하는지 파악할 수 없다.

 

이럴땐 아래와 같이 특정 import 문을 사용하여 해결할 수 있다.

import java.util.Date;
import java.sql. *;

 

만약에 두 개의 패키지에 있는 Date 클래스가 모두 필요한 경우에는 아래와 같이 새 객체를 선언할 때 마다 패키지 전체 이름을 사용해야 한다.

java.util.Date deadLine = new java.util.Date();
java.sql.Date today = new java.sql.Date();

 


3. 클래스패스

- 디렉토리 구조

예를 들어 com.zzz.project1.subproject2 패키지의 Circle 클래스는 

“$BASE_DIR\com\zzz\project1\subproject2\Circle.class” 에 저장된다.

여기서 $BASE_DIR 은 패키지의 기본 디렉토리를 나타낸다.

 

기본 디렉토리 ($BASE_DIR) 은 파일시스템의 어디에나 위치할 수 있다. 

따라서 클래스를 찾기 위해서는 컴파일러 및 런타임에 $BASE_DIR의 위치를 알려줘야 한다.

이것은 CLASSPATH 라는 환경변수에 의해 수행되어진다.

CLASSPATH 는 command shell 에서 실행 프로그램을 검색하기 위해서 사용되어지는 다른 PATH 변수와 유사하다. 

 

- .java 를 .class 파일로 변환할때 java runtime 으로 .class 파일을 찾을 수 있어야 하는데 이때 classpath의 지정경로를 사용한다.

 

 


4. CLASSPATH 환경변수

- ClASSPATH 설정

1. 환경에서 영구적으로 설정

제어판 - 시스템 - 고급 - 환경 변수 - 시스템 변수 에서 편집하거나 새로 만들기

 

2. CMD shell 에서 임시로 설정

> SET CLASSPATH = .; c : \ javaproject \ classes; d : \ tomcat \ lib \ servlet-api.jar

 

3. CLASSPATH 환경변수 대신 -classpath, -cp 사용

> java –classpath c : \ javaproject \ classes com.abc.project1.subproject2.MyClass3

 


5. classpath 옵션

- -classpath, - cp

> java –classpath c:\javaproject\classes com.abc.project1.subproject2.MyClass3

이런식으로 위치하는 폴더의 <패키지명><소스파일>

 

 


6. 접근지시자

- Java의 access modifieres 는 class, constructor, method, variable, data member 의 범위를 제한하는데 사용한다.

 

1. Default : No keyword required

2. Private

  - 최상위 클래스 또는 인터페이스는 private 로 선언 할 수 없다.

3. Protected

  - 클래스에 적용할 수 없다.

4. Public

 

https://www.geeksforgeeks.org/access-modifiers-java/

 


 

※ 출처

www.geeksforgeeks.org/java/?ref=leftbar

 

※ 스터디

github.com/whiteship/live-study/issues/7

'Java' 카테고리의 다른 글

9. 예외처리  (0) 2021.01.17
8. 인터페이스  (0) 2021.01.09
6. 상속  (0) 2020.12.23
5. 클래스  (0) 2020.12.19
4. 제어문  (0) 2020.12.04