GN⁺: Java로 간단한 작업 처리하기
(horstmann.com)- Java는 대규모, 장기 프로젝트에 적합하다고 알려져 있지만, 작은 작업에도 탁월한 도구가 될 수 있음
- 정적 타입 검사와 훌륭한 도구 지원이 작은 작업에서도 큰 장점으로 작용
- 최근 언어 개선 사항들이 Java를 더욱 유용하게 만듦
컴파일 없이 실행하기
-
JEP 330과 JEP 458 덕분에 Java 소스 파일을 직접 실행 가능:
java RandomFiles.java 10 /home/cay/data
- 실행 시마다 자동으로 컴파일되어 개발 및 테스트에 유용
- Graal을 사용해 네이티브 실행 파일로 변환 가능하지만 대부분의 경우 성능 차이는 미미
간결한 문법: 인스턴스 메인 메서드와 암묵적 클래스
- JEP 477: 작은 프로그램과 스크립트 작성을 간소화
- 기존의 번거로운 문법(public static void main) 제거:
var someVariable = initialValue;
String helper(int param) { ... }
void main(String[] args) {
...
}
- java.base 모듈 자동 임포트로 편리성 증가
- println, print, readln 메서드도 자동 임포트
Records와 Enums
- Records: Python의 딕셔너리 대신 구조화된 데이터 표현
record Window(int id, int desktop, int x, int y, int width, int height, String title) {}
- Enums: Python보다 직관적인 열거형 표현
enum Direction { NORTH, EAST, SOUTH, WEST };
유용한 언어 및 API 기능
- var 활용: 스크립트에서 타입 선언 없이 변수 사용 가능
- static import: 간결한 수학 계산 가능
import static java.lang.Math.*;
var diagonal = sqrt(pow(width, 2) + pow(height, 2));
- 텍스트 블록: 코드와 데이터를 함께 유지하며 가독성 개선
- 강력한 문자열, 정규 표현식, 컬렉션, 날짜/시간 라이브러리
- 파일 읽기:
var content = Files.readString(Path.of(filename));
- 외부 프로세스 실행:
String run(String... cmd) throws Exception {
var process = new ProcessBuilder(cmd).redirectErrorStream(true).start();
process.waitFor();
return new String(process.getInputStream().readAllBytes());
}
의존성 처리와 JBang
- JBang: Maven 의존성을 소스 파일에 직접 추가 가능
//DEPS org.eclipse.angus:jakarta.mail:2.0.3
- 그러면 이렇게 실행가능
jbang MailMerge.java
- 스크립트를 실행 파일로 변환:
///usr/bin/env jbang "$0" "$@" ; exit $?
노트북 환경
노트북의 장점
- 탐구적 프로그래밍: 데이터를 다루며 일회성 또는 소규모 코드 실행에 적합
-
코드와 텍스트 셀 구성:
- 코드 셀 실행 결과는 텍스트, 테이블, 이미지, 오디오, 또는 비디오로 표시
- 시도와 실패 과정을 반복하며 원하는 결과를 얻은 후 주석 추가 가능
-
JShell보다 우수:
- 셀 단위 작업이 더 쉬움
- 데이터 표와 그래프를 시각적으로 확인 가능
- 저장 및 공유가 간단
Jupyter와 Java 노트북
-
Jupyter 노트북: Python 데이터 과학자들에게 널리 사용되는 도구
- 로컬 또는 클라우드(예: Google Colab)에서 실행 가능
-
Jupyter 기술은 언어 독립적:
- 다양한 언어 커널 설치 가능 (예: IJava, JJava, Ganymede, Rapaio)
- Jupyter Java Anywhere: JBang을 활용해 Java 커널 설치를 단순화
-
한계점:
- 각 커널마다 의존성 처리와 비텍스트 결과 표시 방식이 상이
- IJava 커널은 의존성 해결에 몇 가지 문제가 있음
- Oracle이나 주요 벤더가 Java 전용 Colab 서비스 제공 필요
Java의 데이터 처리와 시각화
- Python은 NumPy와 Matplotlib 같은 라이브러리로 데이터 처리가 용이
- Java에서는 비슷한 생태계가 아직 부족
-
tablesaw:
- NumPy 대안으로 사용 가능
- Plot.ly JavaScript 패키지를 활용한 시각화 지원
JTaccuino 프로젝트
-
JTaccuino:
- Sven Reimers가 개발 중인 Java 노트북
- JavaFX 기반의 사용자 친화적인 UI 제공
- JShell을 백엔드로 사용
- 초기 단계에 있으나 발전 가능성이 높음
Kotlin 노트북
- Kotlin 개발자를 위한 Kotlin Notebook IntelliJ 플러그인 제공
결론
- 적절한 도구를 활용하면 Java는 작은 작업을 처리하는 데 매우 효과적인 선택
- JBang은 서드파티 라이브러리를 사용하는 스크립트 작성을 쉽게 만듦
- Java는 탐구적 프로그래밍에서도 잠재력을 가지지만, 도구 지원이 개선될 필요가 있음
Hacker News 의견
-
"Hello World" 프로그램을 간단하게 실행할 수 있는 방법을 발견했음. 기존의 복잡한 코드보다 훨씬 간단해졌음.
- Java 21을 사용하면서 코드가 덜 복잡해졌음을 느꼈음.
var
와record
가 특히 유용함. -
java myfile.java
방식으로 AoC 문제를 해결하고 있으며, 자동으로 java.base를 import하는 기능이 유용함.
- Java 21을 사용하면서 코드가 덜 복잡해졌음을 느꼈음.
-
Java, JavaScript, TypeScript를 사용하지만, 스크립팅은 .NET과 LINQPad를 사용함. LINQ 덕분에 스크립팅이 쉬워짐.
- Python은 존경하지만 읽기 어려움. PHP와 Python의 문법이 익숙하지 않음.
-
JDK 1.1 개발 당시, 테스트 스위트에 대한 합의가 없었음. Mark Reinhold가 JCK 형태의 테스트를 거부하고, 간단한 테스트 하네스를 작성했음.
- Java 프로그래머에게 가장 유용한 기능은 디버거 핫 리로드임. 코드 작성이 훨씬 쉬워짐.
-
언어는 시간이 지나면서 발전함. Java는 이제 빠르고, 제네릭과 간단한 타입 추론 기능이 추가되어 보일러플레이트 코드가 줄어듦.
-
PHP도 유용한 언어임. 많은 *nix 시스템에 사전 설치되어 있으며, 파일, JSON, 네트워크 요청 처리에 유용한 표준 라이브러리가 있음.
-
Java 23에서는
java.io.IO
의 세 가지 메서드가 자동으로 import됨. 이는 새로운 타입으로, --enable-preview 옵션으로 사용 가능함. -
Hacker Rank에서 "단일 파일 Java" 코딩을 배웠으며, 화이트보드 코딩 문제 해결에 유용함.
-
간단한 메인 메서드의 이유를 알고 싶다면 JEP 495를 참고할 만함. JDK 24에 포함될 예정임.
-
Java를 모든 코딩 스크립트나 작업에 사용하며, 5년 이상 회사에서 사용해 왔음. Java의 지속적인 발전이 만족스러움.