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+)🔍 설명
ThreadLocalRandom은 Java 7부터 도입되었으며,Random보다 빠르고 정확한 무작위 수 생성기입니다.병렬 환경에서도 성능 저하 없이 잘 작동하고,
nextInt(n)을 사용하면 편향 없는 정수를 반환합니다.
✅ transferTo() 메서드로 URL 내용 출력 (Java 9+)
transferTo() 메서드로 URL 내용 출력 (Java 9+)🔍 설명
Java 8까지는
BufferedReader와while루프를 써야 했습니다.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+)
코드 길이
길고 복잡함
짧고 명확함
❗ 자주 발생하는 실수
라이브러리를 모르고 직접 구현함
Random을 멀티스레드 환경에서 공유함Java 9+ 기능을 사용하지 않음 (
transferTo)잘못된 무작위 수 생성 코드 (
%연산으로 편향 발생)최신 API 문서 확인을 소홀히 함
💡 핵심 포인트
라이브러리를 익히고 사용하면 이미 검증된 코드를 활용할 수 있음
성능, 안정성, 가독성, 협업 모두에서 직접 구현보다 유리
Random, String, List 등 자주 쓰이는 클래스들의 최신 대안을 항상 파악해 둘 것
✅ 결론
라이브러리는 코드를 짧게 만들기 위한 게 아니라, 정확하고 안전하게 만들기 위한 도구다.
성능, 유지보수, 협업 측면에서도 라이브러리 활용이 더 유리하다.
🎯 느낀점
처음에는 ‘내가 직접 구현하는 게 더 빠르지 않을까?’라고 생각했지만, 예제에서처럼 Random이나 transferTo 같은 기능을 보면서 생각이 바뀌었습니다.
라이브러리는 단순히 편리함을 넘어서 정확함과 안전성을 제공합니다.
특히 무작위 수를 잘못 생성한 예제는 충격이었고,
ThreadLocalRandom의 필요성을 실감했습니다.transferTo()처럼 자바 버전이 올라가면서 유용한 기능이 계속 추가된다는 것도 배웠습니다.앞으로는 기능을 직접 구현하기 전에 "혹시 이거 이미 있는 라이브러리 아닐까"라고 먼저 고민해보려 합니다.
Last updated