[JAVA] 패키지

OneTwo·2022년 8월 16일

Java

목록 보기
7/7
post-thumbnail

Ⅰ. package와 import

1. 패키지

  • 패키지란 비슷한 목적으로 생성된 클래스 파일들을 모아 둔 폴더를 의미

  • 클래스를 체계적으로 관리할 수 있음

  • 1개의 프로젝트에 1개또는 여러개의 패키지를 생성 할 수 있다.
    패키지를 아예 생성하지 않아도 문법적으로 문제 없다.

  • 패키지가 다르면 클래스가 저장되는 경로가 분리돼 클래스명의 충돌을
    방지해준다.

  • 패키지가 있을 때는 소스크도의 첫번째 줄에 반드시 'package 패키지명'을
    명시해줘야함

패키지 이름 규칙

  • 숫자로 시작하거나 '_' 와 '$'를 제외한 특수문자 사용 불가
  • java로 시작하는 패키지 금지 (자바 표쥰 API에서만 사용)
  • int,static 등 자바 표준어 사용 불가
  • 소문자로만 작성하는 것이 관례

패키지 사용으로 클래스명의 충돌을 방지 할 수 있다고 했다.
여러 회사가 협업해 프로젝트를 진행하게 되면 클래스명이 중복될 수 있다.
이런 경우 클래스들을 통합하게 되면 문제가 발생할 수 있다.
하지만 서로 다른 패키지를 쓴다면 충돌 문제는 발생하지 않는다.
패키지명의 중복을 피하기 위해서 일반적으로 패키지명에는
회사의 URL 주소를 사용한다. (URL 주소는 이미 유일한 값임을 보장받은 상태임)

2. 임포트

  • 다른 패키지 내의 클래스를 사용하기 위한 문법 요소

  • 소스 코드상 패키지 구문 다음 줄에 위치함

동일한 패키지 내의 클래스들은 자유롭게 사용 할 수 있지만 다른 패키지의 클래스들을 사용하고자 할때는 제약이 따른다.
다른 패키지의 클래스를 사용하는 방법은 크게 2가지로 나뉜다.


방법 1) 클래스의 풀네임 사용

같은 패키지의 클래스들은 객체를 생성할 때 클래스명으로만 객체를 생성했다.

하지만 다른 패키지의 클래스들을 사용할 때는
'패키지명.클래스명'을 명시해야한다.

또한 다른 패키지에서 클래스를 사용하기 위해서는 반드시 해당 클래스는
public class 로 선언되어야 한다.


위의 예시에서는 pack이라는 상위패키지 밑에 두개의 하위패키지 example1과
example2가 존재한다.
이렇게 상위패키지의 하위패키지의 클래스를 사용하기 위해서는
'상위패키지명.하위패키지명.클래스명'을 명시해줘야 한다.
pack.example1 패키지의 클래스를 사용하기 위해 public class로 정의하였고 pack.example2 패키지에서 클래스의 풀네임을 사용하여 객체를 생성했다.


방법 2) 임포트 사용

'import 패키지명.클래스명' 을 표기하면 해당 패키지의 클래스를 사용할 수 있다.
패키지 내의 모든 클래스를 임포트하고 싶다면 'import 패키지명.*' 과 같이 표기하면 된다.
단,이때 임포트되는 클래스는 public class로 선언된 클래스이다.


위와 같이 packimport라는 패키지 내에 public class로 정의된 두 개의 A,B 클래스가 있고 각각은 다음과 같이 정의되어 있다.


이때 클래스 A만 임포트하는 경우와 한번에 두개의 클래스를 모두 임포트하는 경우를 보면 다음과 같다.

다른 패키지의 클래스를 사용할 수 있는 2가지의 방법을 살펴보았는데
서로 다른 패키지를 모두 임포트한 상태에서 이름이 같은 클래스를 사용하는 상황.
즉, import abc.A 와 import bcd.A 를 사용한다고 생각해보면
당연히 사용할 수 없다.
이럴때는 방법1을 사용해야한다.

또한 다음과 같이 packimport 안에 lowpack이라는 하위패키지가 존재할때,
packimport패키지를 *기호를 사용하여 임포트한다고해서 lowpack의 클래스까지 임포트 되는것이 아니라 A,B클래스만 임포트된다.

Ⅱ. 클래스패스

1. 클래스 패스란?

클래스패스란 클래스를 찾기위한 경로이다. JVM이 프로그램을 실행할 때
클래스 파일을 찾는 데 기준이 되는 파일 경로를 말한다.
소스 코드(.java)를 컴파일하게 되면 소스 코드는
바이트 코드(자바 가상 머신이 이해할 수 있는 코드/ .class)로 변환된다.
java runtime(java 또는 jre)으로 이 .class 파일에 포함된 명령을 실행하려면, 이 파일을 찾을 수 있어야 한다. .class 파일을 찾을 때, classpath에 지정된 경로를 사용한다.

classpath는 .class 파일이 포함된 디렉토리와 파일을 콜론(;)으로 구분한 목록이다.

이 classpath 를 지정하기 위한 두 가지 방법이 있다.

  • CLASSPATH 환경 변수 사용
  • java runtime에 -classpath 옵션 사용

2. CLASSPATH 환경 변수 사용

시스템 속성에서 환경 변수를 통해 지정 가능하다.

JVM이 시작될 때 JVM의 클래스 로더는 이 환경 변수를 호출한다.
환경 변수에 설정되어 있는 디렉토리가 호출되면 해당 디렉토리에 있는 클래스들을
먼저 JVM에 로드한다.
따라서 CLASSPATH 환경 변수에는 필스 클래스들이 위치한 디렉토리를 등록하도록 한다.

3. java runtime에 -classpath 옵션 사용

-classpath는 컴파일러가 컴파일러가 컴파일 하기 위해서 필요로 하는 참조할 클래스 파일들을 찾기 위해서 컴파일 시 파일 경로를 지정해주는 옵션이다.
-cp라고 써도 된다.

예컨데,
Hello.java 파일이 C:\Java 디렉토리에 존재하고,
필요한 클래스 파일들이 C:\Java\Engclasses 에 위치한다면
javac -classpath CL\Java\EngClasses C:\Java\Hello.java로 해주면 된다.

만약 참조할 클래스 파일들이 그 외의 다른 디렉터리, 그리고 현 디렉토리에도 존재한다면,
javac -classpath .;C:\Java\Engclasses;C;\Java\Korclasses C:\Java\Hello.java

로 해주면 된다.
위와 같이 세미콜론으로 구분해줄 수 있다.
(.은 현 디렉토리, ..은 현 디렉토리에서 상위 디렉토리를 의미한다.)

Ⅲ. 접근 지정자

접근 지정자는 말 그대로 클래스,필드,메서드,생성자 등에 접근 범위를 지정해주는 문법 요소이다.
접근 지정자는 멤버와 생성자에 붙어 있을 때와 클래스 자체에 붙어 있을 때를
나누어 생각해야 한다.

1) 멤버 및 생성자의 접근 지정자

멤버 및 생성자에는
public, protected, default(또는 package), private 라는 4가지 종류의 접근 지정자를 사용 할 수 있다.

public : 동일 패키지의 모든 클래스 + 다른 패키지의 모든 클래스에서 사용 가능
protected : 동일 패키지의 모든 클래스 + 다른 패키지의 자식 클래스에서 사용가능
default : 동일 패키지의 모든 클래스에서 사용 가능
private : 동일 클래스에서만 사용 가능

2) 클래스의 접근 지정자

클래스에는 public 혹은 default 접근 지정자만 사용 가능하다.
위의 import 부분에서 public class로만 선언된 클래스만 임포트가 가능하다고 했다.

즉, public 으로 선언된 클래스만 다른 패키지에서 임포트하여 사용가능하고
default지정자가 붙은 클래스는 다른 패키지에서 임포트가 불가능하다.

또한 클래스의 생성자를 직접 정의하지 않았을때 컴파일러가 자동으로 추가해주는데 이때 자동으로 추가되는 생성자의 접근 지정자는
클래스의 접근 지정자에 따라 결정된다.

클래스가 public이면 자동으로 추가되는 생성자의 접근 지정자도 public이며
클래스가 default이면 자동으로 추가되는 생성자의 접근 지정자도 default 이다.

생성자를 직접 정의할때는 클래스의 접근 지정자와 다르게 접근 지정자를 지정할 수 있다.

참고자료

Do it! 자바 완전 정복

https://scshim.tistory.com/221

https://doozi0316.tistory.com/entry/JAVA-7%EC%A3%BC%EC%B0%A8-%ED%8C%A8%ED%82%A4%EC%A7%80-package-import-classpath

https://kils-log-of-develop.tistory.com/430#%ED%81%B4%EB%9E%98%EC%8A%A4%ED%8C%A8%EC%8A%A4

https://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

https://velog.io/@codename_hee/JAVA-%EC%8A%A4%ED%84%B0%EB%94%94-5%EC%A3%BC%EC%B0%A8-%ED%81%B4%EB%9E%98%EC%8A%A4

profile
매일 성장하는 개발자

0개의 댓글