Quick Syntax
package com.example.app;
import java.util.List;
public class Main {
public static void main(String[] args) {
System.out.println("Hello, Java");
}
}package는 type 이름을 구분하는 namespace이고, import는 그 type을 짧게 쓰는 compile-time 편의입니다. source directory와 package path는 build 도구의 강한 관례이며, 실제 type 검색은 classpath 또는 module path 설정이 결정합니다.
문법
어떤 파일 구조 요소가 있나
| 요소 | 역할 |
|---|---|
package | 이름공간과 폴더 경계 |
import | 다른 패키지 타입을 짧게 사용 |
main 메서드 | 실행 시작점 |
| 완전 수식 이름 | 이름 충돌 회피 |
package: 이름공간과 경계
package는 클래스를 논리적으로 묶는 이름공간입니다. 같은 이름의 클래스가 다른 package에 공존할 수 있게 해 줍니다. source root 아래 package 이름과 directory를 맞추는 것은 Maven/Gradle과 IDE가 따르는 강한 관례이지만, language rule 자체는 package declaration과 type의 이름 해석입니다. classpath 또는 module path와 build configuration이 실제 source/output 위치를 결정합니다.
// 파일 위치: src/com/example/user/Service.java
package com.example.user;
public class Service {
// ...
}import: 다른 패키지 타입 참조
import는 다른 패키지의 타입을 짧은 이름으로 쓸 수 있게 해 줍니다. import 없이도 완전 수식 이름으로 쓸 수 있지만 코드가 길어집니다. 같은 이름의 타입이 여럿 있을 때는 완전 수식 이름을 직접 쓰는 편이 더 명확합니다.
import java.util.List;
import java.util.ArrayList;
// import 없이 완전 수식 이름을 직접 써도 됩니다
java.util.List<String> list = new java.util.ArrayList<>();main 메서드: 프로그램 시작점
public static void main(String[] args)는 Java 애플리케이션의 진입점입니다. java 런처가 이 메서드를 찾아 프로그램 실행을 시작합니다. 이 메서드 시그니처를 그대로 외우기보다, "실행 가능한 클래스의 약속된 시작점"이라는 역할로 이해하면 됩니다.
체크포인트
| 상황 | 적합한 선택 |
|---|---|
| 관련 클래스를 논리적으로 묶기 | package com.example.domain |
| 다른 패키지 타입을 짧게 쓰기 | import java.util.List |
| 프로그램 시작점 정의 | public static void main(String[] args) |
| 같은 이름 타입이 두 패키지에 있을 때 | 완전 수식 이름 직접 사용 |
주의할 점
package declaration은 compilation unit의 첫 선언이어야 합니다. source root와 package path를 다르게 두면 build tool이나 IDE에서 찾지 못할 수 있지만, 물리 directory layout 자체가 Java language의 단독 오류 조건은 아닙니다.
// ❌ 파일은 src/com/example/Main.java인데 package 없음
public class Main { ... }
// — 다른 패키지에서 참조 시 충돌·오류 발생
// ✅ 파일 위치와 package 선언이 일치해야 함
// 파일 위치: src/com/example/Main.java
package com.example;
public class Main { ... }참고 링크
3 sources