26. 라이브러리(Library)

박은서's avatar
Jan 04, 2026
26. 라이브러리(Library)

1. 자바 라이브러리(Java Library)

1️⃣ 자바 라이브러리란?

미리 만들어진 클래스와 메소드들의 모음
“자주 쓰는 기능을 이미 구현해 둔 코드 묶음”
  • 문자열 처리
  • 날짜 계산
  • 파일 입출력
  • 네트워크 통신
➡️ 위와 같은 걸 처음부터 만들 필요 없이 가져다 씀

2️⃣ JDK, JRE, 자바 라이브러리 관계

1) 구성 관계

JDK ├─ JRE │ ├─ JVM │ └─ Java Standard Library

2) 정리

  • JDK : 개발 도구 + 라이브러리
  • JRE : 실행 환경 + 라이브러리
  • Java Standard Library : 자바 기본 라이브러리
➡️ 우리가 말하는 “자바 라이브러리”는 보통 Java Standard Library를 의미함

3️⃣ 자바 표준 라이브러리(Standard Library)

자바 설치하면 기본으로 제공되는 라이브러리

1) 특징

  • java.lang, java.util 같은 패키지
  • 별도 설치 ❌
  • import 해서 바로 사용 가능

4️⃣ 주요 패키지별 설명 ⭐

1) java.lang

가장 기본 패키지 (import 필요 없음)
클래스
역할
Object
모든 클래스의 부모
String
문자열
Math
수학 연산
System
입출력, 시스템
Integer
래퍼 클래스
String s = "hello"; int n = Integer.parseInt("10");

2) java.util

자료구조 & 유틸리티
클래스
역할
ArrayList
동적 배열
HashMap
Key-Value
HashSet
중복 제거
Scanner
입력
Random
난수
List<String> list = new ArrayList<>(); Map<String, Integer> map = new HashMap<>();

3) java.io

입출력 (파일, 스트림)
클래스
역할
File
파일 정보
FileInputStream
파일 읽기
BufferedReader
문자 입력
PrintWriter
출력
BufferedReader br = new BufferedReader(new FileReader("a.txt"));

4) java.time (Java 8+)

날짜/시간 처리 (중요)
클래스
설명
LocalDate
날짜
LocalTime
시간
LocalDateTime
날짜+시간
Duration
시간 차
LocalDate today = LocalDate.now();

5) java.net

네트워크 통신
클래스
설명
URL
웹 주소
Socket
소켓 통신

6) java.sql

DB 연동 (JDBC)
클래스
설명
Connection
DB 연결
PreparedStatement
SQL 실행
ResultSet
결과

5️⃣ import란?

라이브러리의 클래스를 쓰려면 import 필요
import java.util.ArrayList;
또는
import java.util.*;
⚠️ java.lang만 예외 (자동 import)

6️⃣ 외부 라이브러리 (Third-party Library)

자바 기본 라이브러리 ❌
개발자가 추가로 설치해서 쓰는 라이브러리

1) 예시

라이브러리
용도
Jackson
JSON 처리
Gson
JSON 처리
Lombok
코드 자동 생성
Spring
웹/서버
JUnit
테스트

7️⃣ 라이브러리 관리 방법

1) Maven / Gradle

  • 의존성 관리 도구
  • 라이브러리 자동 다운로드
<dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <version>2.10</version> </dependency>

8️⃣ 라이브러리 vs 프레임워크

구분
라이브러리
프레임워크
제어 흐름
내가 호출
프레임워크가 호출
예시
java.util
Spring
개념
도구
뼈대
➡️ 라이브러리 = 도와주는 도구
➡️ 프레임워크 = 프로그램 구조 자체
 

2. euqals() 메소드

교재 p.338-339 / 8.6 Object 클래스

1️⃣ equals() 메소드란?

1) 개념

모든 클래스의 최상위 클래스인 Object 클래스에 정의된 메소드
Java에서 “두 객체가 논리적으로 같은가?”를 비교하기 위한 메소드
public boolean equals(Object obj)

2) 목적

“이 객체와 다른 객체가 같은 의미의 객체인가?”

2️⃣ ==equals()의 차이 (핵심 ⭐)

1) == 연산자

  • 참조(주소) 비교
  • 두 변수가 같은 객체를 가리키는지 확인
String a = new String("hello"); String b = new String("hello"); System.out.println(a == b); // false

2) equals() 메소드

  • 내용(논리적 동등성) 비교
  • 클래스가 정의한 기준으로 같으면 true
System.out.println(a.equals(b)); // true

3️⃣ Object 클래스의 기본 equals()

Object의 기본 구현은 사실상 == 과 동일함
public boolean equals(Object obj) { return (this == obj); }
➡️ 즉, 오버라이딩하지 않으면 주소 비교만 함

4️⃣ String의 equals() (대표적인 예)

String 클래스는 equals()이미 오버라이딩해두었어.
String s1 = "java"; String s2 = "java"; System.out.println(s1.equals(s2)); // true
➡️ 문자열의 내용이 같으면 true

5️⃣ 교재 실습

1) == 연산자

package ex08; class Circle{ int radius; public Circle(int radius){ this.radius = radius; } } public class CircleTest2 { public static void main(String[] args) { Circle obj1 = new Circle(10); Circle obj2 = new Circle(10); if(obj1 == obj2){ System.out.println("2개의 원은 같습니다."); } else { System.out.println("2개의 원은 같지 않습니다."); } } }
notion image

2) equals() 메소드

package ex08; class Circle3{ int radius; public Circle3(int radius){ this.radius = radius; } public boolean equals(Circle3 c1){ if(radius == c1.radius) { return true; } else { return false; } } } public class CircleTest3 { public static void main(String[] args) { Circle3 obj1 = new Circle3(10); Circle3 obj2 = new Circle3(10); if(obj1.equals(obj2)){ System.out.println("2개의 원은 같습니다."); } else { System.out.println("2개의 원은 같지 않습니다."); } } }
notion image
 

3. 랩퍼 클래스(Wrapper Class)

교재 p.340-342 / 8.7 랩퍼 클래스

1️⃣ 랩퍼 클래스란?

기본 자료형을 감싸는(wrapper) 객체 클래스
자바에서 기본 자료형(primitive type)을 객체(Object)처럼 다루기 위해 만든 클래스
컬렉션, 제네릭, equals 비교 같은 곳에서 필수 개념
기본형
랩퍼 클래스
int
Integer
long
Long
double
Double
float
Float
boolean
Boolean
char
Character
byte
Byte
short
Short

2️⃣ 랩퍼 클래스의 필요성

1) 기본형의 한계

  • 객체가 아님
  • 메소드 없음
  • null 불가능
  • 제네릭 사용 불가
List<int> list; // 컴파일 에러 ❌

2) ✅ 랩퍼 클래스의 장점

  • 객체로 사용 가능
  • 메소드 제공
  • null 가능
  • 컬렉션, 제네릭 사용 가능
List<Integer> list = new ArrayList<>();

3️⃣ 랩퍼 클래스 생성 방법

1) 생성자 (비권장 ❌)

Integer a = new Integer(10); // deprecated

2) valueOf() (권장 ✅)

Integer a = Integer.valueOf(10);

3) 오토 박싱 (Auto Boxing)

Integer a = 10; // int → Integer 자동 변환

4️⃣ 언박싱(Unboxing)

Integer a = 10; int b = a; // 자동 언박싱
용어
의미
Boxing
기본형 → 랩퍼
Unboxing
랩퍼 → 기본형
Auto
컴파일러 자동 처리

5️⃣ 랩퍼 클래스의 주요 메소드

1) 문자열 → 숫자 변환

int n = Integer.parseInt("123");

2) 타입 정보

Integer.MAX_VALUE; Integer.MIN_VALUE;

3) 비교

Integer a = 100; Integer b = 100; System.out.println(a.equals(b)); // true
⚠️ == 비교 주의
Integer a = 100; Integer b = 100; System.out.println(a == b); // true (캐시 때문) Integer x = 200; Integer y = 200; System.out.println(x == y); // false
➡️ 항상 equals() 사용 권장

6️⃣ Integer 캐시 (중요 ⭐)

자바는 성능 최적화를 위해
  • 128 ~ 127 범위의 Integer 객체를 캐싱
Integer a = 127; Integer b = 127; // 같은 객체
Integer a = 128; Integer b = 128; // 다른 객체

7️⃣ null과 언박싱 주의 ⚠️

Integer a = null; int b = a; // NullPointerException ❌
➡️ 언박싱 시 null 체크 필수

8️⃣ 랩퍼 클래스와 equals()

Integer a = 10; Integer b = 10; a.equals(b); // true
➡️ 값 비교는 항상 equals()

9️⃣ 언제 랩퍼 클래스를 써야 할까?

  • 컬렉션 (List, Map)
  • 제네릭
  • null 표현 필요할 때
  • 값 비교(equals)
  • DB 값 매핑
 

4. String 클래스

교재 p.343-347 / 8.8 String 클래스

1️⃣ String 클래스란?

String문자열을 표현하는 클래스야.
String s="hello";
String은 객체이고, 불변(immutable)이다

2️⃣ String은 객체다

String a = "java"; // 많이 사용되는 방법 String b = new String("java"); // 원칙
  • 둘 다 String 객체
  • == 비교하면 결과 다름 → 올바르지 않은 방법!
a == b; // false a.equals(b); // true

3️⃣ String 불변성(Immutable) ⭐⭐⭐

1) 의미

한 번 만들어진 String 객체의 값은 절대 바뀌지 않는다
String s = "hello"; s = s + " world";

2) 실제로 일어나는 일

"hello" → 기존 객체 "hello world" → 새 객체 생성
➡️ 기존 객체는 그대로 있고, 새 객체를 가리키게 됨

4️⃣ String 주요 메소드 ⭐

1) 길이

String s = "Hello World!"; // 객체 생성 s.length(); // 12가 반환됨

2) 문자 추출

String s = "Hello World!"; // 객체 생성 s.charAt(0); // 'H'가 반환됨

3) 부분 문자열

String s = "Hello World!"; // 객체 생성 s.substring(0,3); // 'hel'이 반환됨
  • substring(int beginIndex, int endIndex)
    • ➡️ beginIndex : 시작 인덱스 번호 (포함)
      ➡️ endIndex : 끝 인덱스 번호 (미포함)

4) 비교

s.equals("abc"); / == 연산자는 올바르지 않은 방법 s.equalsIgnoreCase("ABC");

5) 검색

s.contains("he"); // 단어의 포함 여부를 true/false로 반환 s.indexOf("l"); // 단어의 시작 위치 반환

6) 변환

s.toUpperCase(); s.toLowerCase(); s.trim(); s.replace("a","b");

7) 분리

String[] tokens = "I am a boy".split(" "); for (String token : tokens) System.out.println(token);
I am a boy.

7️⃣ String + 연산의 함정 ⚠️

Strings = ""; for (int i=0; i < 10000; i++) { s += i; }

문제

  • 반복할 때마다 새 String 객체 생성
  • 성능 저하 + 메모리 낭비

해결책 : StringBuilder / StringBuffer

StringBuilder sb = new StringBuilder(); for (int i=0; i < 10000; i++) { sb.append(i); } String result = sb.toString();

8️⃣ StringBuffer

1) StringBuffer 란?

문자열을 “변경 가능(mutable)”하게 다룰 수 있는 클래스
StringBuffer sb = new StringBuffer("hello"); sb.append(" world"); System.out.println(sb); // hello world

2) StringBuffer가 필요한 이유

  • String불변(immutable)
    • → 문자열을 바꿀 때마다 새 객체 생성 ❌
  • StringBuffer같은 객체 안에서 문자열 수정 가능

3) 핵심 특징 3가지 ⭐

① mutable (값 변경 가능)
sb.append("!"); sb.insert(0,"Hi ");
② thread-safe (동기화 지원)
  • 내부 메소드에 synchronized 적용
  • 멀티스레드 환경에서 안전
③ StringBuilder와의 차이
구분
StringBuffer
StringBuilder
변경 가능
O
O
동기화
O
X
성능
느림
빠름
사용처
멀티스레드
일반(단일 스레드)
➡️ 99%는 StringBuilder

4) 자주 쓰는 메소드

sb.append("a");// 추가 sb.insert(1,"b");// 삽입 sb.delete(0,1);// 삭제 sb.reverse();// 뒤집기 sb.toString();// String 변환

5) 언제 쓰면 될까?

  • 멀티스레드 환경에서 문자열 수정
  • 동기화가 꼭 필요할 때
➡️ 그 외에는 대부분 StringBuilder 사용
 

5. 기타 유용한 클래스

교재 p.348-350 / 8.9 기타 유용한 클래스

1️⃣ Math 클래스

1) Math 클래스란?

자바가 기본으로 제공하는 수학 관련 기능을 모아둔 유틸리티 클래
java.lang 패키지에 포함되어 있으며 객체 생성 없이 바로 사용할 수 있음
inta= Math.abs(-10); // -10의 절댓값 = 10

2) 주요 특징

① 정적(static) 메서드로 구성
Math의 모든 메서드는 static이어서 인스턴스를 만들 필요가 없음
doubler= Math.sqrt(16); // 결과: 4.0
② 오버플로 없는 정밀 계산
기본 연산보다 정확한 산술 처리를 제공
③ 난수 생성 기능 내장
Math.random()을 통해 0.0 이상 1.0 미만 난수 생성 가능
(고급 난수는 java.util.Random 또는 java.security.SecureRandom 추천)

3) 자주 쓰는 메서드

① 절대값, 최대/최소
Math.abs(-5); // 5 Math.max(3,10); // 10 Math.min(3,10); // 3
② 제곱/제곱근/지수/로그
Math.pow(2,3); // 8.0 Math.sqrt(25); // 5.0 Math.exp(1); // e ≈ 2.718 Math.log(10); // 자연로그 ln(10)
③ 반올림 계열
Math.round(3.6); // 4 -> 반올림 Math.floor(3.6); // 3.0 -> 내림 Math.ceil(3.1); // 4.0 -> 올림
④ 난수
doubler = Math.random(); // 0.0 <= r < 1.0 intdice = (int)(Math.random() *6) +1; // 1~6 주사위
⑤ 삼각함수
모두 라디안(radian) 기준입니다.
Math.sin(Math.PI /2); // 1.0 Math.cos(0); // 1.0 Math.tan(Math.PI /4); // 1.0

4) Math 클래스의 상수

✔ 기본 제공 상수
Math.PI // 원주율 3.141592... Math.E // 자연상수 2.718281...

5) 한계 및 팁

  • Math.random()은 단순한 난수 → 시드 제어 어렵고 예측 가능
    • → 필요하면 Random, 예측 불가 난수는 SecureRandom 사용
  • 고정밀 계산 필요 시 BigDecimal 활용

6) 정리

기능
메서드
절대값/최대/최소
abs(), max(), min()
지수/제곱/루트
pow(), sqrt(), exp()
반올림 계열
round(), floor(), ceil()
난수
random()
삼각함수
sin(), cos(), tan()
상수
PI, E

2️⃣ Random 클래스

1) Random 클래스란?

의사난수(난수처럼 보이는 값) 를 생성하는 도구
Math.random()과 달리 객체를 생성해서 사용하며, 원하면 seed(시드) 값을 지정해 동일한 난수를 재현할 수 있음
Random rand = new Random();

2) 주요 특징

① 객체 기반 난수 생성
Math.random()과 달리 매번 객체를 만들 수 있음 ➡️ 독립된 랜덤 스트림 가능
② 시드(seed) 설정 가능
같은 시드를 주면 항상 같은 난수 순서가 생성됩니다.
Random r1 = new Random(100); Random r2 = new Random(100); // r1과 r2는 같은 순서의 난수를 생성

3) 자주 쓰는 메서드

① 정수 난수
rand.nextInt(); // int 전체 범위 (-2^31 ~ 2^31-1) rand.nextInt(10); // 0 ~ 9
② 특정 범위 정수
int dice = rand.nextInt(6) +1; // 1~6
③ 실수 난수
rand.nextDouble(); // 0.0 <= < 1.0 rand.nextFloat(); // 0.0f <= < 1.0f
④ 논리값
rand.nextBoolean(); // true 또는 false
⑤ 기타 타입도 제공
rand.nextLong(); // Long 범위 rand.nextGaussian(); // 평균 0, 표준편차 1의 정규분포 값

4) Seed(시드) 이해하기

구분
특징
시드 미지정
현재 시간 기반 → 실행 때마다 값이 달라짐
시드 지정
같은 난수 순서 재현 가능 → 테스트, 시뮬레이션에 유용

5) Math.random() 과 차이

비교 항목
Random 클래스
Math.random()
사용 방식
객체 기반
static
시드 제공
가능
불가
독립 난수 스트림
여러 인스턴스 가능
단일 내부 스트림
커스터마이징
다양한 형식 제공
double 하나만

6) 참고 : 보안 난수는 SecureRandom

  • Random예측 가능한 난수
  • 보안 필요한 경우(패스워드, 토큰, 암호화 키 등)
    • java.security.SecureRandom 사용 권장

7) 요약

  • 난수를 생성하는 객체 기반 클래스
  • 다양한 자료형 난수 제공 (nextInt, nextBoolean, nextDouble 등)
  • 시드를 지정하면 동일한 난수 재현 가능
  • 보안 목적이라면 SecureRandom 추천

3️⃣ Arrays 클래스

1) Arrays 클래스란?

배열을 다루기 위한 유틸리티 메서드 모음
배열의 정렬, 검색, 비교, 채우기, 출력 등을 편리하게 처리할 수 있음
import java.util.Arrays;
실제 배열은 객체지만 기능이 부족하기 때문에 Arrays 클래스가 지원 도구 역할을 합니다.

2) 주요 기능 요약

기능
메서드
출력
toString(), deepToString()
정렬
sort()
검색
binarySearch()
복사
copyOf(), copyOfRange()
비교
equals(), deepEquals()
채우기
fill()
스트림 변환
stream()

3) 자주 쓰는 메서드

① 배열 출력
  • 1차원 배열
int[] arr = {1,2,3}; System.out.println(Arrays.toString(arr)); // [1, 2, 3]
✔ 다차원 배열
int[][] arr2 = {{1,2},{3,4}}; System.out.println(Arrays.deepToString(arr2)); // [[1, 2], [3, 4]]
② 정렬
int[] nums = {5,2,8,1}; Arrays.sort(nums); // {1,2,5,8}
③ 이진 탐색 (binarySearch)
⚠️ 배열이 정렬되어 있어야 정확히 동작
int index = Arrays.binarySearch(nums,5); // 결과: 2
④ 복사
int[] copy = Arrays.copyOf(nums,3); // 길이 3만 복사 int[] range = Arrays.copyOfRange(nums,1,3); // 인덱스 1~2 복사
⑤ 비교
Arrays.equals(a, b); // 1차원 배열 비교 Arrays.deepEquals(a2, b2); // 2차원 이상 비교
⑥ 채우기 (fill)
int[] data = new int[5]; Arrays.fill(data,7); // {7,7,7,7,7}
⑦ Stream 변환
Java 8 이상
int sum = Arrays.stream(nums).sum();

4) Arrays는 어떤 때 쓸까?

  • 배열의 내용을 쉽게 출력하고 싶을 때
  • 데이터를 정렬하거나 검색할 때
  • 배열을 부분 복사, 확장해야 할 때
  • 다차원 배열을 비교/출력해야 할 때
  • Stream API로 계산을 하고 싶을 때

5) Arrays vs Collections

항목
Arrays
Collections
대상
배열
리스트·맵·셋 등 컬렉션
메서드
정적(static)
대부분 객체 메서드
변경
배열 크기 고정
크기 자유 변경

6) 정리

  • 배열을 다루는 필수 유틸리티 클래스
  • 정렬, 검색, 복사, 비교, 채우기, 출력 기능 제공
  • Collections는 컬렉션용, Arrays는 배열용

4️⃣ Calendar 클래스

1) Calendar 클래스란?

날짜와 시간을 다루기 위한 추상 클래스
연도, 월, 일, 시각 등을 읽고 바꾸는 기능을 제공
⚠️ 단, Java 8 이후에는 java.time 패키지(특히 LocalDate, LocalDateTime) 사용이 권장됨

2) 생성 방법

Calendar는 추상 클래스이므로 직접 new로 생성할 수 없음
대신 getInstance()를 사용
Calendar cal = Calendar.getInstance();
기본적으로 현재 시스템 시간을 기준으로 초기화

3) 사용 방법

① 날짜·시간 가져오기
int year = cal.get(Calendar.YEAR); int month = cal.get(Calendar.MONTH) +1; // 0~11이므로 +1 필요 int day = cal.get(Calendar.DAY_OF_MONTH); int hour = cal.get(Calendar.HOUR_OF_DAY);
② 날짜·시간 설정하기
cal.set(Calendar.YEAR,2025); cal.set(2025, Calendar.JUNE,15); // 2025년 6월 15일
③ 날짜 계산하기(add)
cal.add(Calendar.DATE,7); // 7일 더하기 cal.add(Calendar.MONTH, -1); // 1개월 빼기
④ Roll 메서드(add 와의 차이)
roll()높은 단위에 영향을 주지 않음
cal.roll(Calendar.DATE,10); // 해당 달 안에서만 이동
⑤ Calendar의 대표 필드들
Calendar.YEAR // 연도 Calendar.MONTH // 월 (0~11) Calendar.DATE // 일 Calendar.HOUR // 시 (12시간제) Calendar.HOUR_OF_DAY // 시 (24시간제) Calendar.MINUTE // 분 Calendar.SECOND // 초 Calendar.DAY_OF_WEEK // 요일(1=일요일, 7=토요일)
⑥ 요일 확인 예
int dow = cal.get(Calendar.DAY_OF_WEEK); String[] week = {"일","월","화","수","목","금","토"}; System.out.println(week[dow-1] +"요일");

4) Calendar의 한계

  • 월이 0~11이라 직관적이지 않음
  • 스레드 안전(thread-safe)하지 않음
  • 코드가 다소 복잡하다
➡️ 그래서 Java 8 이후에는 대체 API 사용을 추천합니다:
  • LocalDate
  • LocalDateTime
  • ZonedDateTime

5) 정리

항목
Calendar
목적
날짜/시간 계산, 값 읽기·설정
생성 방식
Calendar.getInstance()
주요 기능
get(), set(), add(), roll()
주의점
월(month)가 0부터 시작, 직관성이 낮음
권장 대안
java.time API (LocalDate 등)
Share article