# Java로 간단한 작업 처리하기

> Clean Markdown view of GeekNews topic #18346. Use the original source for factual precision when an external source URL is present.

## Metadata

- GeekNews HTML: [https://news.hada.io/topic?id=18346](https://news.hada.io/topic?id=18346)
- GeekNews Markdown: [https://news.hada.io/topic/18346.md](https://news.hada.io/topic/18346.md)
- Type: GN+
- Author: [neo](https://news.hada.io/@neo)
- Published: 2024-12-20T08:35:05+09:00
- Updated: 2024-12-20T08:35:05+09:00
- Original source: [horstmann.com](https://horstmann.com/unblog/2024-12-11/index.html)
- Points: 7
- Comments: 2

## Summary

Java는 대규모, 장기 프로젝트에 적합하다고 알려져 있지만, 작은 작업에도 탁월한 도구가 될 수 있습니다. 정적 타입 검사와 훌륭한 도구 지원이 작은 작업에서도 큰 장점으로 작용합니다. JEP 330과 JEP 458 덕분에 Java 소스 파일을 직접 실행할 수 있으며, JBang을 통해 Maven 의존성을 소스 파일에 직접 추가하여 스크립트를 실행할 수 있습니다. 적절한 도구를 활용하면 Java는 작은 작업을 처리하는 데 매우 효과적인 선택이 될 수 있습니다.

## Topic Body

- Java는 대규모, 장기 프로젝트에 적합하다고 알려져 있지만, **작은 작업**에도 탁월한 도구가 될 수 있음  
- **정적 타입 검사**와 **훌륭한 도구 지원**이 작은 작업에서도 큰 장점으로 작용  
- 최근 언어 개선 사항들이 Java를 더욱 유용하게 만듦  
  
### 컴파일 없이 실행하기  
  
- **JEP 330**과 **JEP 458** 덕분에 Java 소스 파일을 직접 실행 가능:  
  ```bash  
  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는 탐구적 프로그래밍에서도 잠재력을 가지지만, 도구 지원이 개선될 필요가 있음

## Comments



### Comment 32632

- Author: aer0700
- Created: 2024-12-24T04:50:46+09:00
- Points: 1

간단한 스크립팅 용도로 쓸땐 동적 타입을 가진 언어가 워낙 편해서...  
물론 프로토타입을 벗어나면 정적언어를 쓰겠지만요.

### Comment 32549

- Author: neo
- Created: 2024-12-20T08:35:06+09:00
- Points: 1

###### [Hacker News 의견](https://news.ycombinator.com/item?id=42454929) 
- "Hello World" 프로그램을 간단하게 실행할 수 있는 방법을 발견했음. 기존의 복잡한 코드보다 훨씬 간단해졌음.
  - Java 21을 사용하면서 코드가 덜 복잡해졌음을 느꼈음. `var`와 `record`가 특히 유용함.
  - `java myfile.java` 방식으로 AoC 문제를 해결하고 있으며, 자동으로 java.base를 import하는 기능이 유용함.
  
- 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의 지속적인 발전이 만족스러움.
