Language/Java

[자바 스터디 7주차] 패키지

소프 2021. 1. 3.

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

 

7주차 과제: 패키지 · Issue #7 · whiteship/live-study

목표 자바의 패키지에 대해 학습하세요. 학습할 것 (필수) package 키워드 import 키워드 클래스패스 CLASSPATH 환경변수 -classpath 옵션 접근지시자 마감일시 2021년 1월 2일 토요일 오후 1시까지.

github.com

목표

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

학습할 것

- package 키워드

- import 키워드

- 클래스패스

- CLASSPATH 환경변수

- -classpath 옵션

- 접근지시자

- ※ ♥ 스터디원 참고 및 리뷰

package 키워드

패키지란?

  - 서로 관련이 있는 클래스 또는 인터페이스들을 묶어 놓은 묶음이다.

  - 관련 클래스를 그룹화하고 포함된 클래스의 네임스페이스를 정의하는 역할

  - 점(.)을 구분자로 하여 계층구조로 되어 있음

  - 모든 클래스는 반드시 하나의 패키지에 속해야 함

    - 패키지를 선언하지 않으면 자바에서 기본적으로 제공하는 이름 없는 패키지(unnamed package)로 속하게 됨

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

Ex) String 클래스의 패키지는 java.lang이며 FQCN은 java.lang.String이 된다.

 

관례적인 패키지 이름 지정 규칙

패키지 이름 내용
java 자바 기본 패키지(Java vendor 개발)
javax 자바 확장 패키지(Java vendor 개발)
org 일반적으로 비영리단체(오픈소스) 패키지
com  일반적으로 영리단체(회사) 패키지

 

패키지 이름 규칙

  - 패키지 이름은 모두 소문자이여야 한다.

  - 자바의 예약어를 사용하면 안된다.

 

 

패키지의 종류

1) Built-in 패키지

Java API에 포함되는 다수의 클래스를 포함하는 패키지이다.

 

java.lang : language support 클래스들을 포함하는 패키지

  - 프리미티브 타입이나 수학 연산이 정의되어 있는 클래스들

  - 자동적으로 import 됨

  - String, System

java.io : 입출력 기능을 지원하는 클래스들을 포함하는 패키지

java.util : 자료 구조 구현을 위한 유틸리티 클래스를 포함하는 패키지

  - Linked List, Dictionary...

  - Data. Time도 지운

java.applet : Applets을 생성하기 위한 클래스들을 포함하는 패키지

java.awt : GUI 컴포넌트를 구현하기 위한 클래스들을 포함하는 패키지

java.net 네트워킹 기능을 지원하기 위한 클래스를 포함하는 패키지

 

package 패키지명;

package com.blue.hosting.entity.product;

 

import 키워드

import란?

  - 다른 패키지에 있는 클래스를 사용해야 할 때 패키지명을 생략하기 위해서 사용

  - 같은 패키지에 있는 클래스들은 import문을 선언하지 않아도 패키지명 생략 가능

  - 컴파일러에게 소스코드에 사용된 클래스의 패키지에 대한 정보를 제공하는 역할을 함

  - 컴파일시 컴파일러는 import문을 통해 알게 된 패키지를 모든 클래스명 앞에 붙여줌

  - package문 다음, 클래스 선언 이전에 위치해야함

 

import 패키지명.클래스명;

import 패키지명.*;

클래스 이름을 일일히 지정하는 대신 *을 사용하면, 컴파일러는 해당 패키지에서 일치하는 클래스이름을 찾아야 하는 수고를 더해야 하지만, 실행시 성능상의 차이는 없다.

※ 회사 컨벤션마다 일일히 import를 다할것이냐, *를 할것이냐 차이가 있음. *보다는 클래스가 적혀있으면 어디서 왔는지 확인할 수 있어 좋긴 하지만, 인텔리제이를 사용하면 클릭해서 들어갈 수 있어서 별차이가 있는지...

 

 

static import문

자바 5버전 이상에서 소개된 기능으로 

임의의 패키지의 클래스에서 public static으로 정의된 멤버(필드나 메서드)를 사용할 때, 클래스명을 언급하지 않고도 사용할 수 있다.

// import 뒤에 static을 붙여 가져온다.
import static java.lang.System.*;

class StaticImportTest{
	public static void main(String args[]){
	
	// static import를 사용했기 때문에 'System.out'을 모두 나열할 필요 없다.
	out.println("Pocketmon");
	
	}
}

 

클래스명 conclicts 처리하기

서로 다른 패키지에 동일한 이름의 클래스가 존재할 경우 사용에 주의해야 한다.

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();

※ 직접 정의한 클래스를 가져오는것이라면 클래스명을 수정하면 되지만 간혹가다 라이브러리 사용시 겹치는 경우가 발생한다. 이럴때는 코드가 더러워지더라도 위와같은 방법밖에 없다.

 

클래스패스

클래스패스에서 패스란 경로를 의미한다. 

즉, 클래스 패스는 "클래스의 경로(클래스가 존재하는 경로)"를 뜻한다.

JVM은 프로그램의 실행과정에서 실행에 필요한 클래스를 찾을 때, 이 클래스 패스를 기준으로 찾게된다.

 

특징

  - 세미콜론(;)을 구분자로 하여 여러 개의 경로를 지정할 수 잇다.

  - 클래스패스를 지정해주지 않으면 기본적으로 현재 디렉터리가 클래스 패스로 지정된다.

Ex)

import org.company.Menu;

해당 명령어의 의미는 org.company 패키지에 있는 Menu라는 클래스를 현재 클래스에서 사용할 수 있게 하는 것이다.

 

JVM은 Menu클래스의 위치를 찾아서 해당 클래스의 인스턴스를 생성한다.

Menu menu = new Menu();

그럼 JVM은 어떻게 해당 클래스를 찾을까?

만약 JVM이 Menu 클래스를 찾기 위해 존재하는 모든 클래스를 검사해야 한다면 매우 비효율적일 것이다. 그러므로 우리는 CLASSPATH 변수를 사용하여 해당 클래스가 위치한 곳을 JVM에게 알려준다.

 

만약 Menu 클래스가 dir이라는 디렉토리에 존재한다면 Menu 클래스의 전체 경로는 dir/org/company/Menu가 된다.

 

이 때 dir이라는 디렉토리를 classpath변수로 등록해 놓고, 나머지 정보는(org/company/Menu)는 import 명령어를 통해 제공해주므로 외부 패키지의 클래스를 가져와 사용할 수 있게 된다.

 

jar파일도 동일한 형태로 동작시킬 수 있다. jar파일의 path를 classpath로 등록하면 JVM이 해당 jar파일 안에 있는 클래스들을 찾아서 사용할 수 있게 된다.

 

 

지정하는 방법

  - 클래스 환경 변수

    - 시스템에서 어디서든 참조 할 수 있게 환경변수로 설정

    - 최근 지양하는 방법(자세한건 아래 참조)

 

  - classpath 옵션

    - cmd에서 자바 컴파일 또는 실행시 명령어를 통해 임시로 지정할 수 있음

명령어 -classpath 클래스패스 경로 //javac 명령어 칠때
명령어 -cp 클래스패스 경로 //java 명령어 칠때

 

dncjf64.tistory.com/238

: 3가지의 클래스로더에 대한 설명

 

CLASSPATH 환경변수

환경변수는 운영체제에 지정하는 변수로 JVM과 같은 애플리케이션들을은 환경변수 값을 참고해서 동작하게 된다. 자바는 클래스 패스로 환경변수 CLASSPATH를 사용하는데 이 값을 지정하면 실행할 때마다 -classpath 옵션을 사용하지 않아도 되며 애플리케이션이 실행될 때 JVM이 지정한 디렉토리에 있는 클래스들을 먼저 JVM에 로드한다. 그러므로 CLASSPATH 환경변수에는 필수 클래스들이 위치하는 디렉토리를 등록하도록 한다.(모든 프로젝트에 전역적으로 등록되기 때문에 반드시 필수클래스들을 지정해야 한다)

 

https://blog.opid.kr/62  

하지만 최근에는 이방법은 지양되고 있으며 IDE나 빌드도구를 통해 프로젝트별 클래스패스를 설정한다.

maven이나 gradle을 사용하여 라이브러리를 추가하면 external Libraries에 들어가게 되고 이안에 있는 라이브러리들이 classpath에 들어감

 

인텔리제이 기준

프로젝트에서 다운받은 JDK 중 하나를 지정하여 Project SDK를 지정하면

아래와 같이 JDK안에 라이브러리들을 가져올 수 있다.

 

접근지시자

접근지시자는 멤버 변수나 메소드들의 접근 범위를 정의하기 위해 사용한다.

  - public : 접근을 제한하지 않아 프로젝트 내 어디서든 접근이 가능하다.

  - private : 클래스 내부에서만 접근할 수 있다.

  - protected : 클래스 내부, 동일 패키지, 상속받은 클래스에서만 접근을 허용한다.

  - default(명시하지 않음) : 클래스 내부와 동일 패키지에서만 접근이 가능하다.

 

https://velog.io/@ggob_2/java-study-7

 

 

- ※ ♥ 스터디원 참고 및 리뷰

 

테스트 주도 개발 책 추천

www.yes24.com/Product/Goods/12246033

 

테스트 주도 개발

Test-Driven Development: By Example아름다운 코드와 즐거운 개발을 위한 테스트 주도 개발테스트 주도 개발은 학계와 업계에서 많은 주목을 받아온 프로그래밍 방법으로, 여러 연구 논문과 실례를 통해

www.yes24.com

 

 

왕초보를 위한 CS 4종 세트

medium.com/@codesquad_yoda/%EC%99%95%EC%B4%88%EB%B3%B4%EB%A5%BC-%EC%9C%84%ED%95%9C-cs-4%EC%A2%85-%EC%84%B8%ED%8A%B8-49797a61f1d

 

왕초보를 위한 CS 4종 세트

진짜진짜 왕초보용 CS 공부세트

medium.com

자바는 하위호환성을 지키는 특징이 있다. jdk1.4에서 컴파일한 클래스파일이 jre8에서도 잘 돌아간다는 뜻이다. 하지만 호환성을 지키기 위해 포기해야 하는 부분들이 있었는데 바로 jre의 사이즈이다. deprecated되거나 거의 쓰지도 않는 CORBA 클래스 같은 것들을 지원하기 위해 상위 jre에서는 계속 가져가야 했다. 그러다 보니 버전이 올라갈 때 마다 rt.jar의 사이즈는 커질 수 밖에 없었고 이를 해결하기 위해 자바 9부터는 rt.jar의 내부를 각각의 모듈로 나누어서 제공한다.

 

※ JDK 9부터는 JRE가 JDK안에 포함되어 있지 않고 별도의배포 폴더로 분리된다.

 

※ rt.jar이란

rt는 Runtime를 의미한다. rt.jar는 코어 자바클래스(자바 런타임 환경에서)의 콜렉션이다. JVM에서 rt.jar 파일에 담긴 클래스 파일들을 런타임시에 메모리에 올린다. String 클래스, System 클래스 같은 것들이 rt.jar안에 속해있다.

 

아래와 같이 999로 해놓으면 import시 별(*)을 보지 않는다.

 

 

참고

ahnyezi.github.io/java/javastudy-7-package/#4-1-built-in-%ED%8C%A8%ED%82%A4%EC%A7%80

blog.baesangwoo.dev/posts/java-livestudy-7week/

gintrie.tistory.com/67

kils-log-of-develop.tistory.com/430

countryxide.tistory.com/93

'Language > Java' 카테고리의 다른 글

[자바 스터디 9주차] 예외 처리  (0) 2021.01.15
[자바 스터디 8주차] 인터페이스  (4) 2021.01.09
[자바 스터디 6주차] 상속  (0) 2020.12.20
[자바 스터디 5주차] 클래스  (0) 2020.12.19
switch문 동작방식  (0) 2020.12.09

댓글