Java 포맷 도구
Java 포맷이란?
Java 포맷은 복잡한 Java 코드를 표준화된 읽기 쉬운 형식으로 정리하는 과정입니다. 적절한 코드 포맷은 가독성을 높이고, 디버깅을 쉽게 하며, 오류를 줄입니다. 포맷에는 일관된 들여쓰기, 적절한 줄바꿈, 연산자 공백, 괄호 정렬이 포함됩니다. 압축은 모든 공백과 주석을 제거하여 파일 크기를 크게 줄입니다. 자동 서식 정리는 코드 스타일을 맞추는 데 유용하지만 컴파일 오류나 로직 문제를 해결하지는 않습니다. 적용 후에는 프로젝트의 빌드, 테스트, 팀 코드 규칙과 함께 확인해야 합니다.
사용 방법
사용 방법
- 왼쪽 입력란에 Java 코드를 붙여넣거나 입력하세요
- 들여쓰기 크기를 선택하세요 (2 spaces, 4 spaces 또는 Tab)
- '포맷'을 클릭하여 코드를 보기 좋게 정리하고, '축소'를 클릭하여 압축하세요
- 오른쪽에서 결과를 확인하세요 (구문 강조 포함)
- '복사'를 클릭하여 클립보드에 복사하세요
옵션 설명
코드 팁
- 포맷팅은 가독성을 향상시키지만 Java 코드를 컴파일하거나 타입 검사를 하지 않으므로 편집 후 일반적인 빌드 또는 IDE 검사를 실행하세요.
- Java 소스를 축소하는 것은 프로덕션 빌드에서 거의 유용하지 않습니다. 리뷰, 스택 트레이스, 향후 유지 관리를 위해 읽기 쉬운 포맷을 유지하세요.
활용 사례
기술 원리
Java 포맷팅은 어휘 분석과 AST 구축을 기반으로 합니다. 렉서는 소스를 문자 단위로 스캔하여 토큰을 생성합니다. 키워드(class, public, static 및 기타 예약어), 식별자(변수 및 클래스 이름), 리터럴(숫자, 문자열, 문자), 연산자(+, -, ==, && 등), 구분자({ } ( ) ; ,), 주석(//, /* */) 등입니다. 파서는 Java 언어 명세(JLS)에 따라 토큰 스트림을 추상 구문 트리(AST)로 변환하여 클래스 정의, 메서드 본문, 문장 블록, 제어 흐름 구조, 어노테이션 및 기타 구문 단위를 인식합니다. 포맷터는 AST를 순회하며 Google Java Style 같은 스타일 가이드에 따라 코드를 재생성합니다. 블록 깊이에 따라 들여쓰기가 증가하고, 줄 너비는 100열로 제한되며, 연산자 양쪽에 공백이 오고, 쉼표 뒤에 공백이 오며, 여는 중괄호는 같은 줄에 위치합니다(K&R 스타일). 어노테이션 처리는 Java 포맷팅의 특수한 경우입니다. 단일 어노테이션은 메서드와 같은 줄에 머물고, 더 긴 어노테이션 목록은 파라미터에 맞춰 줄바꿈되어 각 어노테이션이 독립된 줄에 위치합니다.
- 어휘 분석: 50개의 Java 키워드, 식별자, 리터럴, 연산자, 주석을 인식하고 토큰 스트림을 출력합니다.
- AST 구축: JLS 규칙에 따라 AST를 구축하고, 클래스, 메서드, 제어 흐름, 람다, try-with-resources를 올바르게 처리합니다.
- 들여쓰기 규칙: Google 스타일은 기본적으로 레벨당 4칸을 사용하며, 100열 줄 너비를 적용합니다. 제한을 초과하는 줄은 자동으로 줄바뀝니다.
- 줄바꿈 전략: 긴 메서드 체인, 파라미터 목록, 어노테이션은 쉼표나 점에서 줄바꿈되며, 연속 줄은 이전 줄의 첫 문자에 맞춰 정렬됩니다.
- 어노테이션 처리: 단일 어노테이션은 같은 줄에 머물고, 여러 어노테이션은 길이와 파라미터 정렬 규칙에 따라 한 줄 또는 줄당 하나로 결정됩니다.
- 주석 보존: //와 /* */ 주석을 원래 위치에 유지하며, 압축 시 제거가 선택 사항입니다.
예시
클래스 정의 포맷팅
입력: public class User{private Long id;private String name;public User(Long id,String name){this.id=id;this.name=name;}}
출력:
public class User {
private Long id;
private String name;
public User(Long id, String name) {
this.id = id;
this.name = name;
}
}메서드 체인 포맷팅
입력: List<String> result=list.stream().filter(s->s.startsWith("a")).map(String::toUpperCase).sorted().collect(Collectors.toList());
출력:
List<String> result = list.stream()
.filter(s -> s.startsWith("a"))
.map(String::toUpperCase)
.sorted()
.collect(Collectors.toList());어노테이션 줄바꿈
입력: @Override public ResponseEntity<User> getUser(@PathVariable Long id,@RequestParam(defaultValue="10") int size){...}
출력:
@Override
public ResponseEntity<User> getUser(
@PathVariable Long id,
@RequestParam(defaultValue = "10") int size) {
...
}자주 묻는 질문
어떤 Java 스타일을 사용하나요?
기본값은 보통 Google Java Style 또는 Sun/Oracle 관례입니다. 4칸 들여쓰기, K&R 중괄호 스타일, 100자 줄 폭이 일반적입니다. 일부 빌드는 스타일 전환 옵션을 제공합니다. 어떤 스타일 가이드든 세부 규칙은 미묘하므로, 포매터를 실행하고 결과를 확인한 뒤 설정을 고정하세요.
최신 Java 문법도 인식하나요?
파서 버전에 따라 다릅니다. record, sealed 클래스, switch 표현식, 텍스트 블록, 패턴 매칭은 비교적 최근에 추가된 기능이라 구버전 파서는 처리하지 못할 수 있습니다. 코드를 짧게 시도해 보세요. 깔끔하게 포매팅되면 문제없고, 오류가 나면 파서 버전을 확인하면 됩니다.
import 정리나 미사용 변수 제거도 해주나요?
아니요. 포매팅은 공백과 중괄호 위치만 변경합니다. import 정리, 미사용 항목 제거 같은 정적 분석은 실제 IDE나 google-java-format(--skip-removing-unused-imports를 끈 상태)과 같은 도구가 필요합니다.
소스 코드가 업로드되나요?
아니요. 포매팅은 JS 기반 Java 파서를 통해 브라우저에서 실행되며 코드는 전송되지 않습니다. 다만 사내 보안 정책상 어떤 웹 도구에도 코드를 노출할 수 없다면 비공개 코드는 붙여 넣지 마세요.
결과가 IntelliJ나 Eclipse와 동일한가요?
정확히 일치하지 않을 가능성이 큽니다. 각 IDE는 수천 개의 옵션을 가진 자체 포매터를 사용합니다. 이 도구는 임시 포매팅용이며, 팀 전체의 일관성을 원한다면 빌드에 연결된 google-java-format이나 Spotless 같은 CI 강제 도구를 사용하세요.
Java 코드를 압축(minify)할 수 있나요?
Java는 컴파일 언어이므로 JS와 같은 의미의 minification은 적용되지 않습니다. 클래스 파일 최적화는 빌드 시 컴파일러나 ProGuard가 담당합니다. 본 페이지는 소스 수준 포매팅 전용입니다.
코드에 빈 줄이 추가되는 이유는 뭔가요?
많은 스타일 가이드는 클래스 멤버 사이나 메서드 사이에 빈 줄을 요구합니다. 포매터가 이 규칙을 따르려고 빈 줄을 삽입하는 것입니다. 더 압축된 코드를 원한다면 해당 스타일 옵션을 직접 조정하세요.