2025-12-06
오늘 배운 것
✅ 1. 문자열(String) 관련 헷갈리는 메서드 정리
✔ 부분 문자열
s.substring(start); // start ~ 끝
s.substring(start, end); // start ~ end-1
✔ 문자열 분리
String[] arr = s.split(" ");
String[] arr = s.split("\\."); // 정규식이라 .은 이렇게 이스케이프
✔ 문자열 합치기
String joined = String.join(",", list);
✔ 문자열 ↔ 숫자
int x = Integer.parseInt("123");
String s = String.valueOf(123);
✅ 2. 정렬(Sort) — 배열 vs 컬렉션 완전 정리
🔹 A) 배열 정렬
✔ 오름차순
Arrays.sort(arr);
✔ 내림차순 (int 배열 직접 불가 → 박싱 필요)
Integer[] arr = {1,2,3};
Arrays.sort(arr, Collections.reverseOrder()); // 내림차순
🔹 B) List 정렬
✔ 오름차순
Collections.sort(list);
✔ 내림차순
list.sort(Collections.reverseOrder());
✔ 사용자 정의 비교
list.sort((a,b) -> a - b); // 오름차순
list.sort((a,b) -> b - a); // 내림차순
🔹 C) 정렬 시 실수하기 쉬운 포인트
Collections.reverseOrder()는 List, Integer[]만 가능- int[]에는 reverseOrder() 못 씀
- int[] → Integer[]로 변환해야 함
✅ 3. Arrays.sort()와 Collections.sort() 차이
| 구분 | Arrays.sort | Collections.sort |
|---|---|---|
| 대상 | 배열 | List |
| 기본 정렬 | Dual-Pivot QuickSort | TimSort |
| 내림차순 | 바로 불가(int) | 가능 |
| 속도 | 배열에 최적화 | 안정적, 실무에서 가장 많이 씀 |
✅ 4. 배열 ↔ 컬렉션 변환
🔹 A) 배열 → List
✔ 1) 문자열/객체 배열
String[] arr = {"a","b"};
List<String> list = Arrays.asList(arr); // 크기 변경 불가 리스트 값변경은 되는데 크기 변경은 안됨
List<String> list2 = new ArrayList<>(Arrays.asList(arr)); // 변경 가능
✔ 2) int[] → List
int[] arr = {1,2,3};
List<Integer> list = Arrays.stream(arr).boxed().toList();
🔹 B) List → 배열
✔ 문자열/객체
String[] arr = list.toArray(new String[0]);
✔ Integer List → int[]
int[] arr = list.stream().mapToInt(i -> i).toArray();
🔹 C) Collection 깊은 복사 / 얕은 복사
✔ List 깊은 복사(원시 타입)
List<Integer> copy = new ArrayList<>(original);
✔ 배열 깊은 복사
int[] copy = Arrays.copyOf(arr, arr.length);
✅ 5. 우선순위 큐(PriorityQueue) 정리
🔹 오름차순 (기본)
PriorityQueue<Integer> pq = new PriorityQueue<>();
🔹 내림차순
PriorityQueue<Integer> pq = new PriorityQueue<>(Collections.reverseOrder());
🔹 사용자 정의 PQ
PriorityQueue<int[]> pq = new PriorityQueue<>(
(a, b) -> a[1] - b[1] // a[1] 기준 오름차순
);
✅ 6. 역순(Reversing) 정리
🔹 A) 배열 역순
Collections.reverse(list); // List만 사용 가능
배열이면:
int[] arr = {1,2,3};
for (int i=0; i<arr.length/2; i++) {
int temp = arr[i];
arr[i] = arr[n-1-i];
arr[n-1-i] = temp;
}
🔹 B) 리스트 역순
Collections.reverse(list);
🔹 C) 역순 정렬 (reverseOrder와 다름!)
- reverseOrder = 정렬 기준의 반대
- reverse = 순서를 뒤집기
둘 완전 다름
혼동하지 말기.
✅ 7. 배열 / 리스트 복사 총정리
| 작업 | 코드 |
|---|---|
| 배열 깊은복사 | Arrays.copyOf(arr, arr.length) |
| 2D 배열 깊은복사 | 반복문으로 row별 copy 필요 |
| List 복사 | new ArrayList<>(original) |
| List 깊은복사(객체) | 각 요소 clone 필요 |
| int[] → List |
Arrays.stream(arr).boxed().toList() |
| List |
list.stream().mapToInt(i->i).toArray() |
✅ 0. 스트림 기본 흐름 (딱 1줄로 끝)
데이터 → stream() → 중간연산(여러 개) → 최종연산(1개)
✅ 1. 스트림 생성
✔ List → Stream
list.stream()
✔ 배열 → Stream
Arrays.stream(arr) // int[], double[], long[] 전용
✔ 범위 Stream
IntStream.range(0, n); // 0~n-1
IntStream.rangeClosed(1, n); // 1~n
✅ 2. 자주 쓰는 중간 연산
✔ map (값 변환)
list.stream().map(x -> x * 2);
✔ filter (조건 필터링)
list.stream().filter(x -> x > 10);
✔ distinct (중복 제거)
list.stream().distinct();
✔ sorted (정렬)
기본 오름차순:
list.stream().sorted();
내림차순:
list.stream().sorted(Comparator.reverseOrder());
✔ limit / skip
stream.limit(5); // 앞 5개만
stream.skip(3); // 앞 3개 건너뛰기
✅ 3. 최종 연산 (반드시 하나만)
✔ forEach
list.stream().forEach(System.out::println);
✔ sum / max / min
int sum = arr.stream().mapToInt(x->x).sum();
int max = arr.stream().mapToInt(x->x).max().orElse(0);
✔ collect List 만들기
List<Integer> result = list.stream().collect(Collectors.toList());
✔ count
long cnt = list.stream().filter(x->x>5).count();
✅ 4. 가장 헷갈리는 “타입 변환”
✔ int[] → List
List<Integer> list = Arrays.stream(arr).boxed().toList();
✔ List → int[]
int[] arr = list.stream().mapToInt(i -> i).toArray();
✔ String[] → List
List<String> list = Arrays.asList(arr);
✔ List → String[]
String[] arr = list.toArray(new String[0]);
✅ 5. 정렬 관련 스트림 패턴
✔ 객체 정렬 (람다)
list.stream()
.sorted((a,b) -> a.age - b.age)
.toList();
✔ 다중 조건 정렬
list.stream()
.sorted(
Comparator.comparing(Person::getAge) // age 오름차순
.thenComparing(Person::getName, Comparator.reverseOrder()) // name 내림차순
)
.toList();
✅ 6. 자주 쓰는 Flatten (2차원 → 1차원)
✔ List<List> → List
list.stream()
.flatMap(inner -> inner.stream())
.toList();
✅ 7. 그룹핑 (코테에서는 가끔 등장)
Map<String, Long> map =
list.stream()
.collect(Collectors.groupingBy(s -> s, Collectors.counting()));
✅ 8. 실전에서 가장 많이 쓰는 패턴 TOP 5
1) max/min 구하기
int max = list.stream().mapToInt(i->i).max().orElse(0);
2) 조건 카운트
long c = list.stream().filter(x->x>10).count();
3) 정렬 후 List로 받기
List<Integer> sorted = list.stream().sorted().toList();
4) 배열 ↔ 리스트 변환
List<Integer> list = Arrays.stream(arr).boxed().toList();
int[] arr = list.stream().mapToInt(i->i).toArray();
5) map 변환
List<String> names = users.stream().map(User::getName).toList();