본문 바로가기
Programming/Java

[whiteship 온라인 스터디] 7주차 과제 - 패키지

by 읽고 쓰는 개발자 2021. 1. 2.

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 옵션
  • 접근지시자

1. package 키워드

이미지 출처 : https://searchstorage.techtarget.com/definition/file-system

  • 자바에서 클래스를 효율적으로 관리하기 위하여 패키지(package) 개념을 사용
  • 패키지의 물리적인 형태는 파일 시스템의 폴더
  • 클래스를 유일하게 만들어주는 식별자 역할 (클래스의 전체이름은 "패키지명+클래스명" 구분은 도트) 따라서 클래스 이동시 패키지 전체를 이동시켜야 한다.
  • 패키지는 컴파일 과정에서 자동으로 생성되는 폴더
  • 클래스 내 선언 : package 상위패키지.하위패키지; 

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

package com.company;

public class ClassName {

}

패키지명 명명 규칙

숫자로 시작하면 안되며, 특수문자는 _ $ 만 가능
java로 시작하는 패키지는 자바 표준 API에서 사용하기에 불가
모두 소문자로 작성하는 것이 관레

패키지 선언이 포함된 클래스 컴파일

  • 패키지 폴더 생성과 함께 컴파일하기 위해서는 -d 옵션을 붙여야 한다.
  • javac -d [패키지가 생성될 위치] ClassName.java    : 자동으로 패키지 생성 + 그 내부에 .class 파일 생성 

2. import 키워드

  • 다른 패키지에 속하는 클래스를 사용하기 위한 선언문 
  • package 경로 전부를 입력하지 않아도 되어 번거로움이 줄어듦
  • 작성 위치 : 패키지 선언과 클래스 선언 사이 
  • *를 사용하여 패키지 하위 모든 클래스 import 가능 (하위 패키지는 대상 아님)
  • 동명의 class의 상위 클래스를 모두 import하면 컴파일 에러. (이럴 땐, 하나의 클래스는 상위 패키지 경로 기술)
import com.company.*;		//company package 하위 클래스 모두 import. 패키지 제외
import com.company.project.*; //project package 하위 클래스 모두 import 

* static import (스태틱 임포트)

  • 특정 static method를 import하여, 인스턴스 생성없이 사용 가능하도록 한 자바5에서 추가된 기능
// Math class의 abs라는 정적 메소드를 static import하여, 클래스명 없이 메소드 명으로만 사용 가능
import static java.lang.Math.abs;   

import static java.lang.Math.PI;	// 정적 멤버 변수에도 적용 가능

 

3. 클래스패스

  • 클래스를 찾기위한 경로. java 명령을 실행하는 위치
  • JVM이 프로그램을 실행할 때 클래스파일을 찾는 기준이 되는 경로
  • .class 파일이 포함된 디렉토리와 파일을 콜론으로 구분한 목록
  • 클래스패스 지정 방법 : 환경변수 CLASSPATH 찾는 방법, 자바 런타임시 -classpath 플래그를 사용하는 방법 

effectivesquid.tistory.com/entry/%EC%9E%90%EB%B0%94-%ED%81%B4%EB%9E%98%EC%8A%A4%ED%8C%A8%EC%8A%A4classpath%EB%9E%80#recentComments

 

자바 클래스패스(classpath)란?

클래스패스란(Class Path)란?? 클래스패스란 말 그대로 클래스를 찾기위한 경로이다. 자바에서 클래스패스의 의미도 똑같다. 즉, JVM이 프로그램을 실행할 때, 클래스파일을 찾는 데 기준이 되는 파

effectivesquid.tistory.com

자세한 내용은 위 포스팅을 참고하여 더 공부가 필요할 것 같다.

 

4. CLASSPATH 환경변수

  • 클래스패스를 환경변수로 지정하는 방법 

 

5. -classpath 옵션

  •  자바를 실행할 때 사용할 클래스들의 위치를 가상머신에게 알려주는 역할을 함
  • 필요한 클래스 파일 위치 경로 추가하고 싶다면 ;(세미콜론)으로 연결 가능하다.

javac -classpath [필요한 클래스 파일경로] [자바파일 경로] 

 

6. 접근지시자 (Access Modifier) 

객체 생성을 제한하거나 객체의 특정 데이터, 메소드를 보호하기 위하여  사용

  • 클래스 제한 : 다른 패키지에서 클래스 사용 제한
  • 생성자 제한 : 클래스로부터 객체를 생성하지 못하도록 제한
  • 필드, 메소드 제한 : 특정 필드와 메소드를 보호 및 제한

종류 

  • public : 모든 패키지에서 아무런 제한 없이 사용 가능
  • protected : 같은 패키지에 속한 클래스 + 자식 클래스에서 접근 가능
  • default : 같은 패키지에 속한 클래스에서 접근 가능
  • private : 오로지 해당 클래스 내부에서만 사용 가능

이미지 출처 : https://velog.io/@gillog/Java-%EC%A0%91%EA%B7%BC-%EC%A0%9C%ED%95%9C%EC%9E%90

 

 

라이브 스터디 피드백

- FQCN : Fully Qualified Class Name

- 빌트인 package ( 따로 import 안해줘도 됨)

- classpath 옵션은 자바 실행 , 자바 컴파일시 둘다 사용 가능! (java, javac )

    외부 라이브러리 추가 시, 이러한 라이브러리의 jar 파일도 classpath에 들어가게 됨. ( 따라서 컴파일할 때도 classpath 되는 것 알 수 있음,,)

- 모든 클래스는 어떤 패키지에 속하게 된다.

- 하나의 파일 속 모든 클래스는 동일한 패키지에 속한다.

- 패키지를 선언하지 않으면 디폴트 패키지 (unnamed package)에 속하게 된다.

- 상수를 정의할 때 : 상수만 정의한 클래스를 만들어서 사용 ( 생성자 접근 제한하여 인스턴스 생성 막은 클래스로 ) 

- code style - java - imports - import with [999] -> *