패키지 구조

지금까지 우리는 하나의 파일 안에서 모든 코드를 작성했습니다. 하지만 실제 프로그램은 수백, 수천 개의 파일로 이루어져 있습니다. 이 파일들을 체계적으로 정리하는 방법, 그것이 바로 **패키지(Package)**입니다.

자바에서 패키지는 단순한 폴더 정리가 아닙니다. 자바라는 언어의 핵심 설계 철학 그 자체입니다.


패키지란?

패키지는 관련된 클래스(파일)들을 하나의 폴더에 모아 정리하는 방법입니다.

src/
└── com/
    └── myapp/
        ├── Main.java
        ├── Calculator.java
        └── utils/
            └── Helper.java

각 자바 파일의 맨 윗줄에는 반드시 자신이 어느 패키지에 속하는지를 선언해야 합니다:

package com.myapp;

void main() {
    System.out.println("Hello!");
}

package com.myapp;은 “이 파일은 com/myapp 폴더에 있습니다”라고 자바에게 알려주는 것입니다.


왜 패키지를 써야 할까요?

1. 정리가 됩니다

파일이 100개가 넘어가면 한 폴더에 다 넣을 수 없습니다. 역할별로 분류해야 합니다.

2. 이름 충돌을 방지합니다

만약 두 사람이 모두 User.java라는 파일을 만들었다면? 패키지가 다르면 문제없습니다:

  • com.myapp.model.User
  • com.myapp.admin.User

같은 이름이지만 주소(패키지)가 다르기 때문에 구분할 수 있습니다.


다른 패키지의 클래스 사용하기

다른 패키지에 있는 클래스를 사용하려면 import를 사용합니다:

package com.myapp;

import com.myapp.utils.Helper;

void main() {
    Helper.doSomething();
}

import는 “이 클래스를 가져다 쓰겠습니다”라는 뜻입니다.

IntelliJ에서는 다른 패키지의 클래스를 사용하면 자동으로 import를 추가해주니, 너무 걱정하지 않아도 됩니다!


자바의 표준 패키지

우리가 이미 사용해왔던 System.out.println()도 사실 java.lang 패키지에 들어있는 것입니다. java.lang 패키지만 특별하게 import 없이 쓸 수 있게 해준 것이죠.

자주 사용되는 표준 패키지들:

패키지설명
java.lang기본 중의 기본 (String, System 등) - import 불필요
java.util리스트, 맵 등 자료구조 모음
java.io파일 읽기/쓰기
java.math수학 관련 기능
import java.util.ArrayList;
import java.util.HashMap;

이렇게 필요한 도구를 꺼내 쓰는 겁니다.


실제 프로젝트는 이렇게 생겼습니다

src/
└── com/
    └── myapp/
        ├── Main.java               ← 프로그램 시작점
        ├── model/                   ← 데이터를 담는 클래스들
        │   ├── User.java
        │   └── Product.java
        ├── service/                 ← 비즈니스 로직
        │   ├── UserService.java
        │   └── ProductService.java
        └── util/                    ← 도구 모음
            └── StringHelper.java

이렇게 역할별로 패키지를 나누면, “유저 관련 로직은 service 패키지에, 데이터 구조는 model 패키지에 있겠구나!” 하고 바로 찾을 수 있습니다.


void main()과 System.out.println()의 비밀

우리가 처음부터 써왔던 코드에 대해서 이제 제대로 이야기할 수 있습니다.

void main()

void main() {
    System.out.println("Hello!");
}
  • void: “이 코드는 결과를 돌려주지 않습니다”라는 뜻입니다. 나중에 함수를 더 배우면, intString 같은 결과를 돌려주는 함수도 만들게 됩니다.
  • main: 자바가 프로그램을 시작할 때 가장 먼저 찾는 이름입니다. 프로그램의 “정문”이라고 생각하면 됩니다.

자바는 항상 main이라는 이름의 문을 찾아서 그 안의 코드를 실행합니다. 그래서 모든 자바 프로그램에는 반드시 main이 있어야 합니다.

System.out.println()

이 긴 코드도 이제 패키지 개념으로 이해할 수 있습니다:

System.out.println("Hello!");
  • System: java.lang 패키지에 들어있는 클래스입니다. 컴퓨터 시스템과 대화하기 위한 도구죠.
  • out: System 안에 있는 “출력 담당” 도구입니다.
  • println(): out에게 “이걸 출력하고 줄을 바꿔”라고 명령하는 함수입니다.

즉, System.out.println("Hello!")는 “시스템의 출력 도구를 사용해서 Hello!를 출력하고 줄을 바꿔라”라는 뜻입니다.

다른 언어들은 print("Hello!") 이렇게 간단한데, 자바는 왜 이렇게 길까요? 자바는 모든 것을 패키지와 클래스로 체계적으로 정리하는 언어이기 때문입니다. 처음에는 귀찮지만, 프로그램이 커질수록 이 체계가 빛을 발합니다.


정리하자면:

  • 패키지 = 관련된 자바 파일들을 정리하는 폴더
  • package 선언 = 이 파일이 어디에 속하는지 알려주기
  • import = 다른 패키지의 클래스를 가져다 쓰기
  • 표준 패키지 = 자바가 미리 만들어 놓은 도구 모음

자바에서 패키지는 선택이 아닌 필수입니다. 코드를 잘 정리하는 습관이 곧 좋은 자바 개발자의 시작입니다!