Study_Java_Package

VANS·2022년 3월 9일
0

스터디

목록 보기
13/15

패키지란?

  • 패키지에는 클래스 또는 인터페이스를 포함시킬 수 있고, 서로 관련된 클래스들끼리 그룹 단위로 묶음으로써 클래스를 효율적으로 관리할 수 있다.
  • 다수의 클래스와 인터페이스를 캡슐화하기 위한 일종의 묶음이다.

패키지의 역할

  1. 동일한 이름을 가진 클래스들을 구분할 수 있다.
    • 2개의 서로 다른 패키지에 동일한 이름의 클래스가 존재하는 경우
  2. class, interface, enumeration, annotation 등을 보다 쉽게 검색하고 사용할 수 있다.
  3. 접근을 제어할 수 있다.
  4. 데이터캡슐화(혹은 데이터 은닉)의 용도로 사용할 수 있다.

패키지의 특징

  1. 클래스의 사실상 전체 이름은 패키지+클래스명이다.

    FQCN (Fully Qualified Class Name)
    모든 클래스에는 정의된 클래스 이름과 패키지 이름이 있고, 이 둘을 합쳐야 완전하게 한 클래스를 표현할 수 있다.
    ex) String 클래스의 패키지는 "java.lang" 이며 FQCN은 "java.lang.String"이 된다.

  2. 패키지가 상위, 하위 패키지로 구분되어 있다면 도트(.)로 나눠 표현한다.

    상위패키지.하위패키지.클래스

  3. 패키지 종류는 사용자 정의 패키지와 Built-in Package로 나뉜다.

FQCN 쓰임새

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

// 2개의 패키지에 모두 Date라는 이름의 클래스가 존재
// 어떤 패키지에 존재하는 Date인지 명시해주지 않았기 때문에 컴파일 에러를 발생시킴.

Date today; // ERROR-- java.util.Date or java.sql.Date?
  • 다음과 같이 수정이 필요함
import java.util.Date;
import java.sql.*;
  • 만약 2개의 패키지에 있는 Date를 다 사용하려한다면, 클래스 풀네임(FQCN)을 사용해서 코드를 작성한다.
java.util.Date deadLine = new java.util.Date();
java.sql.Date today = new java.sql.Date();

패키지 선언

  • 패키지는 클래스를 컴파일 하는 과정에서 자동적으로 생성되는 일종의 폴더이다.
  • 컴파일러는 클래스에 포함되어 있는 패키지 선언을 보고, 파일 시스템의 폴더로 자동 생성시킨다.
package 상위패키지.하위패키지;
public class ClassName{ ... }
  • 패키지 이름을 정할때 지켜야할 규칙이 있다.
    • 숫자로 시작해서 안된다.
    • _, $ 를 제외한 특수문자를 사용해서는 안된다.
    • java로 시작하는 패키지는 자바 표준 api 에서만 사용하므로 사용해서는 안된다.
    • 모두 소문자로 작성하는 것이 관례이다.
    • 자바의 예약어를 사용하면 안된다. (예, int, static)

Built-in Package

  • 자바의 API가 포함되어 있는 다수의 클래스를 포함하는 패키지

Built-in Package 종류

  • java.lang : language support 클래스들을 포함하는 패키지
    • 프리미티브 타입이나 수학 연산이 정의되어 있는 클래스들
    • 자동적으로 import 되기 때문에 해당 패키지의 클래스를 바로 사용할 수 있다.
    • 예시
      java.lang의 String 클래스
      String s = new String(); // java.lang 생략
      java.lang의 System 클래스
      System.out.println(); // java.lang 생략
  • java.io : 입출력 기능을 지원하는 클래스들을 포함하는 패키지
  • java.util : 자료 구조 구현을 위한 유틸리티 클래스를 포함하는 패키지
    • Linked List, Dictionary…
    • Date, Time도 지원
  • java.applet : Applets을 생성하기 위한 클래스들을 포함하는 패키지
  • java.awt : GUI 컴포넌트를 구현하기 위한 클래스들을 포함하는 패키지
  • java.net : 네트워킹 기능을 지원하기 위한 클래스를 포함하는 패키지

사용자 패키지

  • 사용자가 직접 정의한 패키지로, 먼저 패키지명과 동일한 디렉토리를 생성하고, 해당 패키지에 포함할 클래스를 만든 뒤, 맨 첫번째 명령문으로 패키지 이름을 넣는다.
// 패키지 이름은 파일이 저장된 디렉토리의 이름과 반드시 같아야 함
package myPackage;

public class MyClass{
	public void getNames(String s){
		System.out.println(s);
	}
}
  • 다른 패키지에서도 import 하여 사용할 수 있다.
  • 같은 패키지라면 import문 필요 없이 같은 패키지 내에 다른 클래스의 메서드 및 변수를 호출할 수 있다.
// myPackage에 존재하는 `MyClass` 클래스를 import해서 사용할 수 있다.
import myPackage.MyClass;

public class PrintName{
	public static void main(String args[]){
		String name = "Pikachu";
		MyClass mc = new MyClass();
		mc.getNames(name);
	}
}

Import

  • 다른 패키지에 있는 클래스를 사용하고자 할 때 사용하는 키워드이다.
  • import 패키지.클래스 형식으로 경로를 선언해 컴파일러에게 알려준다.
    (한 패키지에서 많은 클래스를 불러 사용할 경우, import 패키지.*를 사용한다.)

ClassPath

  • 클래스를 찾기 위한 경로이다.
  • JVM이 프로그램을 실행할 때, 클래스 파일을 찾는 데 기준이 되는 파일 경로를 의미한다.

  1. 소스 코드(.java)를 컴파일하면 -> 바이트 코드(.class)로 변환이 되는데 java 또는 jre으로 이 바이트 코드 파일에 포함된 명령어를 실행하려면 먼저 이 파일을 찾아야 한다.
  2. 이때 바이트 코드(.class) 파일을 찾을 때 classpath에 지정된 경로를 사용한다.
  3. 클래스패스는. class 파일이 포함된 디렉토리와 파일을 콜론으로 구분한 목록이다.
  4. java runtime은 이 classpath에 지정된 경로를 모두 검색해 .class 파일을 찾는다.
  • ※classpath를 지정할 수 있는 방법은 환경 변수 CLASSPATH를 지정하거나 java runtime에서 -classpath플래그를 사용하는 방법이 있다.

ClassPath 활용방법

-classpath(cp) path(파일 절대 경로)
  • ‘RequiredClass’ 클래스와 해당 클래스를 사용하는 ‘ClasspathDemo’ 클래스를 선언했을때의 경우.
package javabasic.week7;  
  
class RequiredClass{  
    public void print(String s){  
        System.out.println(s);  
  }  
}  
  
public class ClasspathDemo {  
    public static void main(String[] args) {  
        RequiredClass rc = new RequiredClass();  
 		rc.print("classpath test");  
  }  
}
C:\IdeaProjects\JavaStudy\src\main\java\javabasic\week7>javac ClasspathDemo.java
C:\IdeaProjects\JavaStudy\src\main\java\javabasic\week7>dir

2021-01-01  오후 03:54    <DIR>          .
2021-01-01  오후 03:54    <DIR>          ..
2021-01-01  오후 03:54               411 ClasspathDemo.class
2021-01-01  오후 03:53               300 ClasspathDemo.java
2021-01-01  오후 03:54               405 RequiredClass.class

RequiredClass 클래스 파일을 lib 디렉토리로 이동시킨 후 실행한다면?

java ClasspathDemo

결과 : equiredClass.class가 현재 디렉토리에 존재하지 않기 때문에 에러 발생

Exception in thread "main" java.lang.NoClassDefFoundError: RequiredClass at ClasspathDemo.main(ClasspathDemo.java:9)

해결 : lib 디렉토리에서 찾아서 실행시켜준다.

java -classpath ".:lib" ClasspathDemo
  • . : 현재 디렉토리에서 클래스를 찾는다
  • : : 현재 위치(.)에 찾는 파일이 없다면 다음 하위 디렉토리인 lib로 가서 찾는다는 의미
    (맥은 콜론(:), 윈도우에서는 세미콜론(;))

ref.
https://gintrie.tistory.com/67
https://ahnyezi.github.io/java/javastudy-7-package/
https://www.notion.so/ed8e346f88f54849a06ff968b1877ca5
https://jjunbbang.tistory.com/8

profile
코딩도 점진적 과부화

0개의 댓글