59. 라이브러리를 익히고 사용하라

✅ 핵심 요약

직접 구현하려 하지 말고, 이미 존재하는 고품질의 라이브러리를 우선 활용하자. 표준 라이브러리나 잘 검증된 서드파티 라이브러리는 안정성, 성능, 유지보수 측면에서 대부분의 경우 우월하다.

📚 필수 개념 요약

개념
설명

표준 라이브러리

자바 JDK에 기본 포함된 기능 모음 (java.util, java.lang, java.io 등)

서드파티 라이브러리

외부에서 배포되는 라이브러리 (예: Guava, Apache Commons)

Random

전통적인 의사난수 생성기. 멀티스레드 환경에서 성능 및 편향 이슈 존재

ThreadLocalRandom

Java 7+에서 도입된 빠르고 안전한 난수 생성기

transferTo

Java 9+에서 InputStream의 데이터를 다른 출력 스트림에 직접 복사하는 메서드


⚔️ Random vs ThreadLocalRandom

항목

Random

ThreadLocalRandom

버전

Java 1.0

Java 7 이후

쓰레드 안전성

멀티스레드 환경에서 성능 저하 발생

각 쓰레드에 독립된 인스턴스 제공 → 빠름

편향성

Math.abs(random.nextInt()) % n 사용 시 편향 발생

nextInt(n) 메서드로 정확한 균등 분포

사용 예

단일 스레드 기반, 간단한 작업

멀티스레드 or 고성능 필요 시 우선 사용


❌ 잘못된 무작위 수 생성 방식 (편향 발생 가능)

🔍 설명

  • Math.abs(rnd.nextInt()) % n은 직관적이지만 무작위성이 왜곡될 수 있는 매우 위험한 코드입니다.

  • 특히 Integer.MIN_VALUE는 절대값이 자기 자신이므로 음수 결과도 나올 수 있어 의도치 않은 동작이 발생합니다.


✅ 권장 방식: ThreadLocalRandom 사용 (Java 7+)

🔍 설명

  • ThreadLocalRandom은 Java 7부터 도입되었으며, Random보다 빠르고 정확한 무작위 수 생성기입니다.

  • 병렬 환경에서도 성능 저하 없이 잘 작동하고, nextInt(n)을 사용하면 편향 없는 정수를 반환합니다.


transferTo() 메서드로 URL 내용 출력 (Java 9+)

🔍 설명

  • Java 8까지는 BufferedReaderwhile 루프를 써야 했습니다.

  • Java 9부터는 InputStream.transferTo(OutputStream)을 쓰면 코드 한 줄로 전체 데이터를 복사할 수 있어 더 간단하고 빠릅니다.

  • 입력: URL → 출력: System.out으로 직접 연결


💡 예제 핵심 요약

항목
잘못된 예제
올바른 예제

무작위 수 생성

Math.abs(rnd.nextInt()) % n

ThreadLocalRandom.current().nextInt(n)

문제점

편향, 음수, 반복되는 수열

안전하고 빠른 무작위 수 생성

I/O 스트림 처리

BufferedReader, while 반복

InputStream.transferTo() (Java 9+)

코드 길이

길고 복잡함

짧고 명확함


❗ 자주 발생하는 실수

  1. 라이브러리를 모르고 직접 구현함

  2. Random을 멀티스레드 환경에서 공유함

  3. Java 9+ 기능을 사용하지 않음 (transferTo)

  4. 잘못된 무작위 수 생성 코드 (% 연산으로 편향 발생)

  5. 최신 API 문서 확인을 소홀히 함


💡 핵심 포인트

  • 라이브러리를 익히고 사용하면 이미 검증된 코드를 활용할 수 있음

  • 성능, 안정성, 가독성, 협업 모두에서 직접 구현보다 유리

  • Random, String, List 등 자주 쓰이는 클래스들의 최신 대안을 항상 파악해 둘 것


✅ 결론

  • 라이브러리는 코드를 짧게 만들기 위한 게 아니라, 정확하고 안전하게 만들기 위한 도구다.

  • 성능, 유지보수, 협업 측면에서도 라이브러리 활용이 더 유리하다.


🎯 느낀점

처음에는 ‘내가 직접 구현하는 게 더 빠르지 않을까?’라고 생각했지만, 예제에서처럼 Random이나 transferTo 같은 기능을 보면서 생각이 바뀌었습니다.

  • 라이브러리는 단순히 편리함을 넘어서 정확함과 안전성을 제공합니다.

  • 특히 무작위 수를 잘못 생성한 예제는 충격이었고, ThreadLocalRandom의 필요성을 실감했습니다.

  • transferTo()처럼 자바 버전이 올라가면서 유용한 기능이 계속 추가된다는 것도 배웠습니다.

    앞으로는 기능을 직접 구현하기 전에 "혹시 이거 이미 있는 라이브러리 아닐까"라고 먼저 고민해보려 합니다.

Last updated