[Java] 패키지

케이·2022년 9월 4일
0

JAVA

목록 보기
11/17
post-thumbnail

학습한 내용을 정리한 포스팅입니다. 참고 문헌 내용이 직역 되어 어색한 문장이 있을 수 있습니다. 틀린 내용이 있다면 지적해주시면 감사하겠습니다.

package 키워드

  • 클래스의 묶음을 패키지라고 한다. 패키지에는 클래스 또는 인터페이스를 포함 시킬 수 있고 관련된 클래스들끼리 묶어 놓음으로써 클래스를 효율적으로 관리할 수 있다.

  • 클래스가 물리적으로 하나의 클래스파일(.class)인 것과 같이 패키지는 물리적으로 하나의 디렉토리이다.

  • 디렉토리가 하위 디렉토리를 가질 수 있는 것처럼 패키지도 다른 패키지를 포함 할 수 있고 ‘점(.)’으로 구분한다. 예를 들어 java.lang 패키지에서 lang 패키지는 java의 하위 패키지이다.

  • 패키지의 선언은 클래스나 인터페이스의 소스 파일 맨 위에 아래와 같이 적으면 된다. 단, 패키지는 하나의 소스파일에 단 한번만 선언될 수 있다.

package 패키지명;
  • 모든 클래스는 반드시 하나의 패키지에 포함되어야 한다. 소스파일을 작성할 때 패키지를 선언하지 않고도 아무런 문제가 없었던 이유는 자바에서 기본적으로 제공하는 ‘unnamed package’ 때문이다.

import 키워드

import 문을 통해서 사용하고자 하는 클래스의 패키지를 미리 명시해줄 수 있다.

import문의 역할은 컴파일러에게 소스파일에 사용된 클래스의 패키지에 대한 정보를 제공하는 것이다. 컴파일 시에 컴파일러는 Import문을 통해 소스파일에 사용된 클래스들의 패키지를 알아 낸 다음 모든 클래스 이름 앞에 패키지명을 붙여준다.

import문을 선언할 때는 아래와 같이 할 수 있다.

import 패키지명.클래스명;
또는
import 패키지명.*;

static import

static import문을 사용하면 static멤버를 호출 할 때 클래스 이름을 생략할 수 있다. 특정 클래스의 static 멤버를 자주 사용할 때 편리하다.


CLASSPATH

(프로그램 실행 시)JVM이 어떤 클래스를 찾으려고 할 때 어떻게 그 위치를 알 수 있을까?

답은 '클래스패스'에 있다.
어떤 패키지를 불러오기위해 VM이 시스템의 모든 폴더를 살펴보는 것은 비효율적이다. VM에게 어디를 살펴봐야지 알려줘야 한다. 이 때 CLASSPATH 환경변수를 사용해서 우리가 사용하고자 하는 것들의 위치를 저장해 둘 수 있다. 즉, 클래스패스는 클래스 파일을 찾는데 기준이 되는 파일 경로라고 볼 수 있다.
(관련해서 https://stackoverflow.com/questions/2396493/what-is-a-classpath-and-how-do-i-set-it 내용이 너무 좋았다. 나는 이렇게 설명을 풀어 쓸수가 없어 아쉬울뿐..)

디렉토리나 jar들을 CLASSPATH 환경변수에 넣을 수 있는데..

classpath를 세팅하려면?

유닉스에서는

export CLASSPATH=/home/myaccount/myproject/lib/CoolFramework.jar:/home/myaccount/myproject/output/

윈도우에서는 환경변수에 세팅해서 환경변수를 추가 하거나 수정할 수 있다.

두번째 방법은 -cp를 사용하는 방법인데 이는 참조하려는 클래스가 위치한 경로를 설정하는 옵션으로 아래와 같다.

java -cp "/home/myaccount/myproject/lib/CoolFramework.jar:/home/myaccount/myproject/output/"  MyMainClass

접근지시자 (접근제어자, access modifier)

접근제어자는 멤버 또는 클래스에 사용되어 해당하는 멤버 또는 클래스를 외부에서 접근하지 못하도록 제한하는 역할을 한다.

접근제어자가 사용될 수 있는 곳 - 클래스, 멤버변수, 메서드, 생성자
private 같은 클래스 내에서만 접근이 가능하다
default 같은 패키지 내에서만 접근이 가능하다
protected 같은 패키지 내에서 그리고 다른 패키지의 자손 클래스에서 접근이 가능하다
public 접근 제한이 전혀 없다

접근 범위가 넓은 쪽에서 좁은 쪽의 순으로 왼쪽부터 나열하면 다음과 같다

public > protected > (default) > private

접근제어자를 사용하는 이유는 클래스의 내부에 선언된 데이터를 보호하기 위해서다. 데이터가 유효한 값을 갖고 비밀번호 같은 데이터를 외부에서 함부로 변경하지 못하도록 외부로부터의 접근을 제한하는 것이 필요하다. 이것은 객체지향개념의 캡슐화(encapsultation)에 해당된다.


참고

남궁성, 자바의 정석

https://stackoverflow.com/questions/2396493/what-is-a-classpath-and-how-do-i-set-it

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

https://effectivesquid.tistory.com/21

profile
삽질하며 깨닫고 배웁니다. (a.k.a 프로삽질러) + 이 구역의 회고왕

0개의 댓글