
Exception 객체인 e가 가진 정보를 터미널(콘솔)에 출력해주는 메서드
주로 try-catch 블록 안에서 예외가 발생했을 때 디버깅용으로 사용됨
| 항목 | synchronized | ReentrantLock + Condition |
|---|---|---|
| 락 획득/해제 | 자동 (synchronized 블록 진입/종료 시) | 수동 (lock() / unlock() 직접 호출) |
| 대기 메서드 | wait() | await() |
| 신호 메서드 | notify() / notifyAll() | signal() / signalAll() |
| 조건 변수 개수 | 1개 (공통 대기방) | 여러 개 가능 (newCondition()으로 분리) |
| 락 상태 확인 | 불가 | isLocked(), isHeldByCurrentThread() 등 제공 |
| 타임아웃 락 | 불가 | tryLock(timeout) 가능 |
| 공정성 설정 (FIFO) | 없음 | 생성 시 new ReentrantLock(true)로 가능 |
| 예외 처리 구조 | try-catch 없어도 안전 | try-finally로 unlock() 보장해야 안전 |
| 조건 변수 분리 사용 | 불가 (wait 모두 공유) | 가능 (예: notFull, notEmpty 각각 따로 만들 수 있음) |
타입을 일반화(generalize)하여, 재사용성과 안정성을 높임.
타입을 정해두지 않아서 어떤 타입이든 받은대로 나감
Null 방지용 안전 래퍼 클래스
Optional 의 메소드에 따라 true/false 출력함
NullPointerException 예방
메서드 리턴값으로 값이 없을 수도 있다"는 걸 명확하게 전달
if문이나 try-catch 없이도 null 체크가 가능
| 메서드 | 설명 | 예시 코드 |
|---|---|---|
of() | null이 아닌 값을 감쌈 (null이면 예외 발생) | Optional.of("값") |
ofNullable() | null일 수도 있는 값을 감쌈 | Optional.ofNullable(name) |
isPresent() | 값이 존재하는지 확인 (true/false 반환) | if (opt.isPresent()) { ... } |
ifPresent() | 값이 있을 때만 실행 | opt.ifPresent(val -> System.out.println(val)) |
orElse() | 값이 없을 때 기본값 반환 | opt.orElse("기본") |
orElseThrow() | 값이 없으면 예외 던짐 | opt.orElseThrow(() -> new IllegalArgumentException()) |
새로운 집합을 생성하는 자료구조
중복을 허락하지 않는 집합
key와 value를 가지고 있는 집합
Keys는 중복 안되나 value 중복은 가능함
| 자료구조 | 집합? | 특징 | 중복 허용 | 순서 보장 |
|---|---|---|---|---|
int[], String[] (배열) | ✅ | 고정 크기, 빠른 인덱스 접근 | ✅ | ✅ |
List<String> (예: ArrayList) | ✅ | 크기 유동적, 인덱스 기반 | ✅ | ✅ |
Set<String> | ✅ | 중복 자동 제거 | ❌ | ❌ (HashSet), ✅ (LinkedHashSet) |
Map<String, Integer> | ✅ (Key-Value 구조) | Key로 값에 접근, 빠른 조회 | Key ❌ / Value ⭕ | ❌ (HashMap), ✅ (LinkedHashMap) |
두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.
입력은 여러 개의 테스트 케이스로 이루어져 있다.
각 테스트 케이스는 한 줄로 이루어져 있으며, 각 줄에 A와 B가 주어진다. (0 < A, B < 10)
각 테스트 케이스마다 A+B를 출력한다.
1 1
2 3
3 4
9 8
5 2
2
5
7
17
7
package loop;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class BOJ_10951_APlusB5 {
public static void main(String[] args)throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String line;
while((line= br.readLine()) != null){
StringTokenizer st = new StringTokenizer(line);
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
System.out.println(a+b);
}
}
}
입력이 없으면 시스템 종료(EOF) Scanner가 아닌 BufferedReader 사용으로 입력 값이 많아 졌을때 처리 속도 증가
총 N개의 정수가 주어졌을 때, 정수 v가 몇 개인지 구하는 프로그램을 작성하시오.
첫째 줄에 정수의 개수 N(1 ≤ N ≤ 100)이 주어진다. 둘째 줄에는 정수가 공백으로 구분되어져있다. 셋째 줄에는 찾으려고 하는 정수 v가 주어진다. 입력으로 주어지는 정수와 v는 -100보다 크거나 같으며, 100보다 작거나 같다.
첫째 줄에 입력으로 주어진 N개의 정수 중에 v가 몇 개인지 출력한다.
11
1 4 1 2 4 2 4 2 3 4 4
2
3
11
1 4 1 2 4 2 4 2 3 4 4
5
0
package array;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Count {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
int [] arr = new int [n];
StringTokenizer st = new StringTokenizer(br.readLine());
for (int i =0;i<n;i++){
arr[i] = Integer.parseInt(st.nextToken());
}
int v = Integer.parseInt(br.readLine());
int count = 0;
for (int i =0;i<n;i++){
if (arr[i]==v){
count++;
}
}
System.out.println(count);
}
}
배열에 입력된 정수 특정 값 몇갠인지 세기 배열의 사이즈를 입력값으로 맞추는게 중요
정수 N개로 이루어진 수열 A와 정수 X가 주어진다. 이때, A에서 X보다 작은 수를 모두 출력하는 프로그램을 작성하시오.
첫째 줄에 N과 X가 주어진다. (1 ≤ N, X ≤ 10,000)
둘째 줄에 수열 A를 이루는 정수 N개가 주어진다. 주어지는 정수는 모두 1보다 크거나 같고, 10,000보다 작거나 같은 정수이다.
X보다 작은 수를 입력받은 순서대로 공백으로 구분해 출력한다. X보다 작은 수는 적어도 하나 존재한다.
10 5
1 10 4 9 2 3 8 5 7 6
1 4 2 3
package array;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.StringTokenizer;
public class BOJ_10871_LessThanX {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken());
int x = Integer.parseInt(st.nextToken());
st = new StringTokenizer(br.readLine());
int [] arr = new int[n];
for(int i = 0;i<n;i++){
arr[i] = Integer.parseInt(st.nextToken());
}
for(int i = 0;i<n;i++){
if(arr[i]<x){
System.out.print(arr[i]+" ");
}
}
}
}
조건 분기 + 반복 출력 훈련 배열에서 조건(값 < X)에 맞는 값만 필터링해서 출력
N개의 정수가 주어진다. 이때, 최솟값과 최댓값을 구하는 프로그램을 작성하시오.
첫째 줄에 정수의 개수 N (1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄에는 N개의 정수를 공백으로 구분해서 주어진다. 모든 정수는 -1,000,000보다 크거나 같고, 1,000,000보다 작거나 같은 정수이다.
첫째 줄에 주어진 정수 N개의 최솟값과 최댓값을 공백으로 구분해 출력한다.
5
20 10 35 30 7
7 35
package array;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.io.IOException;
import java.util.StringTokenizer;
public class BOJ_10818_MinMax{
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
StringTokenizer st = new StringTokenizer(br.readLine());
int [] arr = new int[n];
for (int i = 0; i < n; i++) {
arr[i] = Integer.parseInt(st.nextToken());
}
int min = arr[0];
int max = arr[0];
for(int i = 0; i < n; i++) {
if(arr[i]>min){
max = arr[i];
}
if (arr[i] < min) {
min = arr[i];
}
}
System.out.println(min + " " +max);
}
}
package array;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.io.IOException;
import java.util.StringTokenizer;
public class BOJ_10818_MinMax{
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
StringTokenizer st = new StringTokenizer(br.readLine());
int [] arr = new int[n];
for (int i = 0; i < n; i++) {
arr[i] = Integer.parseInt(st.nextToken());
}
int min = Arrays.stream(arr).min().getAsInt();
int max = Arrays.stream(arr).max().getAsInt();
System.out.println(min + " " +max);
}
}
데이터를 함수형 스타일로 처리할 수 있게 해주는 도구
마치 데이터의 흐름을 따라가며 필터링, 매핑, 집계 등 작업을 함
| 메서드 | 역할 | 예시 코드 |
|---|---|---|
filter(Predicate) | 조건에 맞는 값만 통과 | filter(x -> x > 5) |
map(Function) | 값을 변형 | map(x -> x * 2) |
forEach(Consumer) | 하나씩 처리 (출력 등) | forEach(System.out::println) |
sum() | 합계 계산 (IntStream 등에서 사용) | Arrays.stream(arr).sum() |
min().getAsInt() | 최솟값 구하기 | Arrays.stream(arr).min().getAsInt() |
max().getAsInt() | 최댓값 구하기 | Arrays.stream(arr).max().getAsInt() |
count() | 개수 세기 (long 반환) | filter(x -> x > 5).count() |
배열에서 최솟값과 최댓값을 찾기 배열 순회 중 조건에 따라 값 갱신하는 패턴 연습
9개의 서로 다른 자연수가 주어질 때, 이들 중 최댓값을 찾고 그 최댓값이 몇 번째 수인지를 구하는 프로그램을 작성하시오.
예를 들어, 서로 다른 9개의 자연수
3, 29, 38, 12, 57, 74, 40, 85, 61
이 주어지면, 이들 중 최댓값은 85이고, 이 값은 8번째 수이다.
첫째 줄부터 아홉 번째 줄까지 한 줄에 하나의 자연수가 주어진다. 주어지는 자연수는 100 보다 작다.
첫째 줄에 최댓값을 출력하고, 둘째 줄에 최댓값이 몇 번째 수인지를 출력한다.
3
29
38
12
57
74
40
85
61
85
8
package array;
import java.util.Scanner;
public class BOJ_2562_MaxValueAndIndex {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int max = 0;
int index =0;
for(int i =0;i<9;i++){
int num = sc.nextInt();
if(num>max){
max = num;
index = i+1;
}
}
System.out.println(max);
System.out.println(index);
}
}
index를 만들어서 위치까지 저장하게 만드는게 키 포인트
여러개의 Stream 메소드를 줄줄히 연결하여 데이터를 흐름처럼 정리하는 방식
list.stream()
.filter(x -> 조건)
.map(x -> 변형)
.collect(Collectors.toList());
JAVA의 Stream API는 다음같이 .으로 이어지느 방식으로 여러 작업을 연속해서 적용할수 있음
마치 체인처럼 연결되어 있어서 메서드 체이닝이라고 부름 Stream API는 이방식으로 처리하는걸 Stream체이닝이라고 부름
Stream 생성: list.stream()
중간 연산들 연결: .filter(), .map(), .sorted() …
최종 연산으로 마무리: .collect(), .forEach(), .count()
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6);
List<Integer> result = numbers.stream()
.filter(n -> n % 2 == 0) // 짝수만 통과
.map(n -> n * n) // 제곱으로 변형
.collect(Collectors.toList()); // 리스트로 수집
System.out.println(result); // [4, 16, 36]
코드가 간결, 가독성 좋음, 반복문 없이 처리 가능
사람이 똑같은 실수를 반복한다고 … 어제 결국 새벽 4시에 자버려서 오전 다 날려버리고
오후에 애기보고 네… 뭐 핑계를 대니 결국 목표로 한건 다 못했습니다
지금 큰일 났습니다 이번주에 목표로 해논게 참많은데… 정신 차리고 해야할거같습니다
그래서 오늘 백준 5문제를 풀어봣는데 좀 재미있는거 같아요 알고리즘이라는게
잠깐 읽었던것도 좀 떠오르고 그러네요
스트림 체이닝이라는걸 공부해봤는데 확실히 좀 코드가 간결해서 내일 한번 사용해보겠습니다
내일은 진짜 더 열심히 해보겠습니다 화이팅!