5일차에는 Java에서 가장 기본이 되는 java.lang 패키지와
문자열, Wrapper 클래스, 제네릭, 컬렉션 프레임워크를 함께 정리했다.
“언제, 왜 쓰는지” 중심으로 정리해봤다.
1. java.lang 패키지
java.lang은 자바 프로그램의 기본 클래스 묶음이다.
이 패키지에 속한 클래스들은 import 없이 바로 사용 가능하다.
주요 클래스
- Object
모든 클래스의 최상위 부모 - System
표준 입출력, 시간 측정, JVM 종료 등 - Class
클래스 메타데이터를 표현 - String
문자열 처리 - Wrapper 클래스
기본 타입을 객체로 감싼 클래스 - Math
수학 관련 정적 메서드 제공
2. Object 클래스 핵심 메서드
모든 클래스는 암시적으로 Object를 상속한다.
equals()
- 기본 구현은 ==과 동일 (주소 비교)
- String, Wrapper 등은 값 비교로 오버라이딩됨
String a = new String("hi");
String b = new String("hi");
a.equals(b); // true
a == b; // false
hashCode()
- 객체를 식별하는 정수 값
- equals()를 오버라이딩하면 hashCode()도 반드시 함께 오버라이딩해야 한다
- HashMap, HashSet의 동작 기준
toString()
- 객체를 문자열로 표현
- 기본 구현: 클래스명@해시코드
Object obj = new Object();
System.out.println(obj); // java.lang.Object@6d06d69c
3. System 클래스
System은 JVM을 통해 운영체제의 일부 기능을 사용하게 해준다.
모든 필드와 메서드는 static이다.
System.out.println("출력");
long start = System.currentTimeMillis();
System.exit(0);
4. Class 클래스
클래스 자체의 정보를 다루는 메타 객체다.
Class 객체 얻는 방법
Class c1 = String.class;
Class c2 = Class.forName("java.lang.String");
Class c3 = "abc".getClass();
5. String과 문자열 처리
String의 특징
- immutable(불변) 객체
- 문자열을 수정하면 새 객체 생성
String s = "a";
s = s + "b"; // 새로운 String 객체
String.valueOf()
toString()보다 안전한 문자열 변환 방법이다.
Object obj = null;
String s = String.valueOf(obj); // "null"
6. StringBuilder vs StringBuffer
문자열을 수정하면서 사용할 때 쓰는 클래스다.
StringBuilder sb = new StringBuilder();
sb.append("hello");
sb.append(" world");
String result = sb.toString();
차이점
구분 StringBuilder StringBuffer
| 스레드 안전 | ❌ | ✅ |
| 성능 | 빠름 | 느림 |
| 사용 권장 | ✅ | 거의 없음 |
👉 대부분 StringBuilder 사용
7. Wrapper 클래스
기본 타입을 객체로 감싼 클래스다.
- int → Integer
- double → Double
언제 필요한가?
- 컬렉션 사용 (List<Integer>)
- null 표현 필요할 때
- 객체 메서드 사용 시
Integer n = 10; // 오토 박싱
int x = n; // 오토 언박싱
⚠️ null 언박싱 시 NullPointerException 주의
8. 제네릭(Generic)
제네릭 한 줄 정의
타입을 사용 시점에 결정하도록 미루는 문법
제네릭이 없을 때 문제
Object value = box.get();
String s = (String) value; // 위험
제네릭 사용
class Box<T> {
private T value;
}
Box<String> box = new Box<>();
String s = box.get();
- 컴파일 타임 타입 체크
- 캐스팅 제거
- 코드 의도 명확
제네릭 클래스 vs 메서드
class Box<T> { } // 클래스 단위
static <T> T echo(T v) // 메서드 단위
9. 컬렉션 프레임워크 개요
구조
- List: 순서 O, 중복 O
- Set: 순서 X, 중복 X
- Queue: FIFO
- Map: Key-Value (Key 중복 X)
List
- ArrayList: 조회 빠름
- LinkedList: 삽입/삭제 빠름
Set
- HashSet: 가장 빠름
- LinkedHashSet: 입력 순서 유지
- TreeSet: 자동 정렬
Map
Map<String, Integer> map = new HashMap<>();
map.put("Kim", 25);
map.get("Kim");
10. Stack / Queue / Deque
Stack (LIFO)
- Stack 클래스는 비권장
- Deque 사용 권장
Deque<String> stack = new ArrayDeque<>();
stack.push("A");
stack.pop();
Queue (FIFO)
- Queue 인터페이스의 구현체로 LinkedList를 사용할 수 있다
- 하지만 일반적인 큐 구현에서는 ArrayDeque가 더 권장된다
// 가능하지만 최선은 아님
Queue<String> queue = new LinkedList<>();
queue.offer("A");
queue.poll();
// 권장
Queue<String> queue = new ArrayDeque<>();
queue.offer("A");
queue.poll();
Deque (양방향 큐)
- Stack, Queue 모두 구현 가능
- 실무에서 가장 많이 쓰임
Deque<String> dq = new ArrayDeque<>();
dq.addFirst("A");
dq.addLast("B");
📚 Reference
- 『혼자 공부하는 자바』, 신용권 저
'Learning Log' 카테고리의 다른 글
| [멋사 클라우드 5기] Day 7 - Lambda · Stream 심화 + Optional (0) | 2026.01.30 |
|---|---|
| [멋사 클라우드 5기] Day 6 - 자료구조, Lambda, Stream (0) | 2026.01.29 |
| equals가 있는데 hashCode는 왜 필요할까? (0) | 2026.01.27 |
| abstract vs interface: 비슷한데 왜 굳이 둘 다 있을까? (0) | 2026.01.27 |
| [멋사 클라우드 5기] Day 4 - 상속, 다형성, 그리고 abstract vs interface (0) | 2026.01.27 |
