본문 바로가기
자바/Do it! 자바 완전 정복

Do it! 자바 완전 정복: 8장 클래스 외부 구성 요소

by limdae94 2025. 1. 31.
 
Do it! 자바 완전 정복
프로그래밍 초심자들이 어려워하는 프로그램의 동작을 컴퓨터의 두뇌를 사진 찍듯 그림과 함께 설명한 구성이 눈에 띈다. 단기 코딩 학원에서는 다루지 않는 원리와 배경지식까지 배우며 정통 프로그래머로 거듭나는 뿌듯함을 느껴 보자. 여기에 400여 개의 프로그래밍 문제가 들어 있어 시험과 취업 면접도 대비할 수 있다. 컴퓨터공학과 1학년생부터 실무에서 자바를 쓰는 현직 개발자까지, 자바로 코딩하는 사람이라면 반드시 갖춰야 할 기본기를 이 책과 함께 ‘완전 정복’ 해보자
저자
김동형
출판
이지스퍼블리싱
출판일
2021.09.01

7장에서는 클래스 내부에 포함되는 4개의 요소 중 이너 클래스를 제외한 3가지를 알아봤다. 8장에서는 클래스의 외부에 위치할 수 있는 3가지 외부 구성 요소인 패키지, 임포트, 외부 클래스를 알아본다.

  • 8.1 패키지와 임포트
  • 8.2 외부 클래스

8.1 패키지와 임포트

8.1.1 패키지

패키지(Package)는 비슷한 목적으로 생성된 클래스 파일들을 한 곳에 모아 둔 폴더를 의미한다. 동일한 목적으로 만들어진 클래스들을 1개의 공간(폴더)에 묶어 관리하기 위해 사용하는 것이 바로 '패키지'이다. 1개의 프로젝트에 1개의 패키지를 생성할 수도 있고, 여러 개의 패키지를 생성할 수도 있다. 패키지를 아예 생성하지 않더라도 문법적으로는 전혀 문제가 없다. 생성된 패키지를 폴더의 구조상으로 보면 src 폴더의 하위 폴더에 위치한다. 컴파일이 수행되면 바이트 코드가 저장되는 bin 폴더에도 동일한 하위 폴더가 생성된다.

 

자바 제공 API의 대표적인 패키지에는 기본 클래스들을 묶어 놓은 java.lang, 유용한 확장 클래스들을 묶어 놓은 java.util, 자바 그래픽과 관련된 클래스들을 묶어 놓은 java.swing과 javafx 그리고 자바의 입출력 클래스들을 묶어 놓은 java.io와 java.nio 패키지 등이 있다.

패키지를 지정하지 않으면 src 폴더 아래에 소스 파일이 바로 위치한다. 반면 패키지를 지정하면 지정된 패키지 폴더가 src 폴더 아래에 생성되며, 그 아래에 소스 파일이 위치한다. 패키지를 생성하지 않았을 때 클래스의 외부 요소인 package 구문은 포함되지 않으며, 패키지가 있을 때는 소스 코드의 첫 번째 줄에 반드시 'package 패키지명'이 명시돼 있어야 한다.

패키지 사용으로 얻을 수 있는 장점은 클래스가 저장되는 공간이 분리돼 클래스명의 충돌을 방지할 수 있다. 서로 다른 패키지를 사용하면 그 안에 있는 클래스명이 같더라도 경로가 다르므로 충돌 문제가 발생하지 않는다.

8.1.2 임포트

임포트는 다른 패키지 내에 클래스를 사용하기 위한 문법 요소로, 소스 코드상에서 패키지 구문의 다음 줄에 위치한다. 프로그램이 동작할 때는 일반적으로 자신의 패키지 내부에 위치한 클래스만 사용할 수 있다. 자바가 제공하는 API 혹은 다른 개발자가 만든 패키지에 위치한 클래스를 사용하고자 할 때는 어떻게 해야 할까? 다른 패키지의 클래스는 크게 2가지 방법으로 사용할 수 있다.

 

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

다른 패키지의 클래스를 사용하는 첫 번째 방법은 클래스의 풀네임(Fullname)을 사용하는 것이다. 클래스의 풀네임은 '패키지명.클래스명'이다.

 

방법 2. 임포트 사용

다른 패키지의 클래스를 사용하는 첫 번째 방법을 보면 미련하다. 필요할 때마다 클래스의 풀네임을 표현하는 것은 비효율적이다. 이때 사용하는 방법이 바로 '임포트'이다. 방법 1.과 동일한 예제에서 'import 패키지명.클래스명', 즉 import sec01_packageimport.common.A를 표기해 놓으면 이후 A a = new A()와 같이 클래스명만 사용해도 sec01_packageimport.common.A를 의미하게 된다. 만일 패키지 내의 모든 클래스를 임포트하고 싶다면 *를 사용해 sec01_packageimport.common.*와 같이 표현할 수 있다.

 

* 기호로 임포트할 때 주의할 점

실제로 임포트되는 대상은 소스 코드(.java)가 아닌 bin 폴더에 위치한 컴파일이 완료된 바이트 코드(.class)다. 다음과 같은 구조의 패키지를 살펴보자. pack1 패키지 내부에는 2개의 클래스 파일(A.class, B.class)과 1개의 하위 패키지(pack2)가 있다. pack2 패키지 내부에는 다시 2개의 클래스 파일(C.class, D.class)이 있다. 이때 * 기호를 사용해 다음과 같이 임포트하면 하위 폴더는 임포트되지 않으며, 클래스 파일들만 임포트된다. 따라서 4개 클래스를 모두 임포트하기 위해서는 다음과 같이 작성해야 한다.

import pack1.*; // A, B 클래스 임포트
import pack1.pack2.*; // C, D 클래스 임포트

8.2 외부 클래스

외부 클래스(External Class)는 public 클래스의 외부에 추가로 정의한 클래스를 말한다. 1개의 자바 소스 파일에는 최대 1개의 public 클래스만 존재할 수 있고, 그 클래스명은 파일명과 일치해야 한다. 즉, 1개의 소스 파일 안에서 public 클래스를 제외한 모든 클래스는 외부 클래스이다. public 클래스가 아니면 다른 패키지에서 임포트할 수 없으므로 외부 클래스는 같은 패키지 안에서만 사용할 수 있다. 다음 예를 살펴보자.

 

BCD.java 소스 파일에는 2개의 클래스(ABC, BCD)가 있다. 소스 파일명이 BCD이므로 public을 붙일 수 있는 자격이 있는 클래스는 BCD뿐이다. ABC는 외부 클래스로서 public을 붙일 수 없기 때문에 다른 패키지에서는 임포트 자체를 할 수 없게 된다. 만일 다른 패키지에서도 이 클래스를 사용하려면 새로운 자바 소스 파일 ABC.java를 생성 후 public을 붙여서 작성해야 한다.