Contents
1. 자바 라이브러리(Java Library)1️⃣ 자바 라이브러리란?2️⃣ JDK, JRE, 자바 라이브러리 관계3️⃣ 자바 표준 라이브러리(Standard Library)4️⃣ 주요 패키지별 설명 ⭐5️⃣ import란?6️⃣ 외부 라이브러리 (Third-party Library)7️⃣ 라이브러리 관리 방법8️⃣ 라이브러리 vs 프레임워크2. euqals() 메소드1️⃣ equals() 메소드란?2️⃣ == 와 equals()의 차이 (핵심 ⭐)3️⃣ Object 클래스의 기본 equals()4️⃣ String의 equals() (대표적인 예)5️⃣ 교재 실습3. 랩퍼 클래스(Wrapper Class)1️⃣ 랩퍼 클래스란?2️⃣ 랩퍼 클래스의 필요성3️⃣ 랩퍼 클래스 생성 방법4️⃣ 언박싱(Unboxing)5️⃣ 랩퍼 클래스의 주요 메소드6️⃣ Integer 캐시 (중요 ⭐)7️⃣ null과 언박싱 주의 ⚠️8️⃣ 랩퍼 클래스와 equals()9️⃣ 언제 랩퍼 클래스를 써야 할까?4. String 클래스1️⃣ String 클래스란?2️⃣ String은 객체다3️⃣ String 불변성(Immutable) ⭐⭐⭐4️⃣ String 주요 메소드 ⭐7️⃣ String + 연산의 함정 ⚠️8️⃣ StringBuffer5. 기타 유용한 클래스1️⃣ Math 클래스2️⃣ Random 클래스3️⃣ Arrays 클래스4️⃣ Calendar 클래스1. 자바 라이브러리(Java Library)
1️⃣ 자바 라이브러리란?
미리 만들어진 클래스와 메소드들의 모음
“자주 쓰는 기능을 이미 구현해 둔 코드 묶음”
- 문자열 처리
- 날짜 계산
- 파일 입출력
- 네트워크 통신
➡️ 위와 같은 걸 처음부터 만들 필요 없이 가져다 씀
2️⃣ JDK, JRE, 자바 라이브러리 관계
1) 구성 관계
JDK
├─ JRE
│ ├─ JVM
│ └─ Java Standard Library2) 정리
- 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); // false2) equals() 메소드
- 내용(논리적 동등성) 비교
- 클래스가 정의한 기준으로 같으면
true
System.out.println(a.equals(b)); // true3️⃣ 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개의 원은 같지 않습니다.");
}
}
}
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개의 원은 같지 않습니다.");
}
}
}
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); // deprecated2) 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); // true3️⃣ 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 world2) 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의 절댓값 = 102) 주요 특징
① 정적(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.04) 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