Untitled_Blue

[JAVA] package와 import 본문

Programming Language/JAVA

[JAVA] package와 import

Untitled_Blue 2023. 5. 9. 22:15
반응형

안녕하세요. 이번 글은 package와 import에 대한 설명입니다.

- 패키지

  • 패키지 (package) : 클래스의 일부분이며 클래스를 식별하는 용도로 사용하는 문법

package 설정 시 파일 경로 및 소스코드
package 미선언 화면

다음과 같이 패키지는 폴더를 통해 각 파일의 위치를 명시해주는 키워드다. 같은 클래스명이 파일이 2개 이상 존재하더라도 각각 다른 패키지에 소속되어있으면 엄연히 다른 파일로 간주한다.

이때 패키지를 선언하지 않았다는 뜻은 src 폴더 내 어느 패키지 폴더에도 속하지 않는다는 뜻이며 컴파일러에서 자동으로 package default;로 해석한다는 뜻이다. 반면 패키지가 있으면 소소코드의 맨 첫번째 줄에 package 패키지명;이 명시되어 있다는 점을 확인할 수 있다.

패키지를 구분함으로써 얻을 수 있는 장점은 개발 주제에 따라 별도로 구분 가능하며 효율적인 파일관리 및 개발과 유지보수가 가능하다는 점을 대표로 제시할 수 있다. 만약 패키지 명시없이 여러 주제의 파일을 생성한 채 개발하게 되면 어느 파일이 어떤 프로젝트의 파일인지를 찾기 어려울 것이며 추후 불필요한 시간을 소비하게 되면서 효율적인 개발 및 유지보수에 많은 어려움을 경험할 것이다. 이러한 이유가 있어서라도 패키지를 통한 명확하게 파일을 구분하는 것이 좋다.

- import

  • import : 다른 패키지 내 클래스 파일을 사용하기 위한 접근 도구이며 자바에서 제공하는 API를 사용할 때도 활용

이렇게 자바에서 제공하는 기능들을 사용하기 위해서는 API를 가져오는 작업이 필요한데 이때 import 키워드를 사용한다.

일반적으로 패키지 내부에 위치한 클래스만 사용가능하기 때문에 import 없이 속해있는 패키지 외에 다른 클래스를 사용하는 것은 불가능하다. 상단 이미지에서도 별도의 import를 하지 않은 채 외부 클래스 (API)를 사용하려고 하면 에러 출력과 함께 해결(사용)할 수 없다는 알림을 보여준다.

package classes;

import java.util.Scanner;

public class Package_Practice {
    public static void main (String[] args) {
        System.out.println("Hello world in classes Package :)");

        Scanner sc = new Scanner(System.in);

        String input = sc.nextLine();
        System.out.println("입력 결과 : " + input);
    }
}

다음과 같이 import java.util.Scanner를 선언해서 JAVA API에 있는 클래스를 불러와서 사용하도록 구현하였다.

그 결과, Scanner 클래스를 정상적으로 사용할 수 있으며 오류 또한 더 이상 표시하지 않고 있는 점을 확인하였다.

import를 통한 API 호출 후 사용 결과 화면

실행 결과, 문제없이 입력할 수 있는 공간이 제공되고 입력 가능한 것 또한 확인할 수 있다.

+ Oracle 사에서 제공하는 JAVA API 문서 (8 버전 기준) : https://docs.oracle.com/javase/8/docs/api/

 

Java Platform SE 8

 

docs.oracle.com

package classes;

import java.util.Scanner;
import other_pack.NoteBook; // 다른 패키지 내 클래스 파일 호출

public class Package_Practice {
    public static void main (String[] args) {
        System.out.println("Hello world in classes Package :)");

        NoteBook nb = new NoteBook();
        nb.CPU = "i7-7700HQ";
        nb.ram = 16;
        System.out.println(nb.CPU + " " + nb.ram);
    }
}

다음과 같이 다른 소속(다른 패키지에 있는)의 클래스 파일을 사용할 때도 import 키워드를 사용할 수 있다.

사용 방법은 import 패키지명.클래스명;이며 하나의 패키지 내 모든 클래스를 임포트하고 싶다면 클래스명 부분에 *을 사용하면 된다. API를 호출할 때도 같으며 util 패키지 내 모든 클래스를 호출할 때도 *을 입력해주면 된다.

이렇게 하면 컴파일러에서 해당되면 클래스를 찾아서 오류 검사하는데 상대적으로 오래 걸릴 수 있겠으나 다방면으로 사용하는 상황에서는 일일이 사용할 클래스를 import 문을 따로따로 작성하는 것보다 더 간결한 코드를 작성할 수 있다.

추가로 다른 패키지 내 클래스를 임포트하고 사용할 때 임포트되는 클래스의 필드와 메서드 등의 구성 요소가 public이라는 접근 지정자 앞에 명시되어있어야 한다. 이에 대한 설명은 다음 글에서 이어서 진행하겠다.

 

+ 패키지 안에 또 다른 패키지 호출

package classes;

import other_pack.NoteBook; // 다른 패키지 내 클래스 파일 호출
import other_pack.two_pack.Calculator;

public class Package_Practice {
    public static void main (String[] args) {
        System.out.println("Hello world in classes Package :)");

        NoteBook nb = new NoteBook();
        nb.CPU = "i7-7700HQ";
        nb.ram = 16;
        System.out.println(nb.CPU + " " + nb.ram);

        Calculator cal = new Calculator();
        System.out.println(cal.areaCircle(3.14));
    }
}

프로젝트 내 패키지 안에 패키지가 있는 장면 도식화

다음 도식화한 이미지에서 볼 수 있듯 other_pack 패키지 안에 two_pack이라는 또 다른 패키지가 존재한다.

상단 소스코드에서도 two_pack 내 클래스 파일을 임포트해서 클래스를 활용한 코드를 작성한 것을 확인할 수 있다.

이때 코드에서 상위패키지.하위패키지.클래스명 형식으로 클래스를 불러온 것을 확인할 수 있는데 import 상위패키지.* 이렇게 하면 모든 것을 불러올 수 있지만 이는 클래스에만 해당되며 안에 패키지까지는 불러올 수 없다. 그렇기 때문에 하위 클래스를 호출하고자 하면 import.other_pack.two_pack.*; 과 같이 내부에 또 다른 패키지를 명시해야 한다.

 

이렇듯 패키지 안에 또 다른 패키지를 선언하는 것이 가능하며 상위패키지.하위패키지.클래스명(또는 *)을 통해 또 다른 하위 패키지를 해당 클래스를 호출하고 사용하는 것 또한 가능한 점을 확인할 수 있다.

 

다음 글은 접근 지정자와 staic 정적 키워드에 대한 설명입니다.

반응형