5P by neo 2일전 | favorite | 댓글 1개
  • 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는 탐구적 프로그래밍에서도 잠재력을 가지지만, 도구 지원이 개선될 필요가 있음
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의 지속적인 발전이 만족스러움.