7P by GN⁺ | ★ favorite | 댓글 2개
  • Java는 대규모, 장기 프로젝트에 적합하다고 알려져 있지만, 작은 작업에도 탁월한 도구가 될 수 있음
  • 정적 타입 검사훌륭한 도구 지원이 작은 작업에서도 큰 장점으로 작용
  • 최근 언어 개선 사항들이 Java를 더욱 유용하게 만듦

컴파일 없이 실행하기

  • JEP 330JEP 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은 NumPyMatplotlib 같은 라이브러리로 데이터 처리가 용이
    • Java에서는 비슷한 생태계가 아직 부족
  • tablesaw:
    • NumPy 대안으로 사용 가능
    • Plot.ly JavaScript 패키지를 활용한 시각화 지원

JTaccuino 프로젝트

  • JTaccuino:
    • Sven Reimers가 개발 중인 Java 노트북
    • JavaFX 기반의 사용자 친화적인 UI 제공
    • JShell을 백엔드로 사용
    • 초기 단계에 있으나 발전 가능성이 높음

Kotlin 노트북

  • Kotlin 개발자를 위한 Kotlin Notebook IntelliJ 플러그인 제공

결론

  • 적절한 도구를 활용하면 Java는 작은 작업을 처리하는 데 매우 효과적인 선택
  • JBang은 서드파티 라이브러리를 사용하는 스크립트 작성을 쉽게 만듦
  • Java는 탐구적 프로그래밍에서도 잠재력을 가지지만, 도구 지원이 개선될 필요가 있음
GeekNews Weekly에 포함된 글입니다. 에디터 코멘트 보기

댓글과 토론

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

Hacker News 의견
  • "Hello World" 프로그램을 간단하게 실행할 수 있는 방법을 발견했음. 기존의 복잡한 코드보다 훨씬 간단해졌음.

    • Java 21을 사용하면서 코드가 덜 복잡해졌음을 느꼈음. varrecord가 특히 유용함.
    • 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의 지속적인 발전이 만족스러움.