Today I Learned
(24.04.24)[2주차] Java문법 종합반 강의(예외처리, 제네릭 / 쓰레드, 람다, 스트림, Optional)
진짜 아침 일찍 캠프 시작하기 전부터 계속 들으면서 한번 정리를 하려고 했는데도 벌써 시간을 다 쓸 수 밖에 없을 정도로 양이 많은 듯 했다.
개인적으로 한번 복습하면서 넘어가는 시간까지 포함해서 하루종일이 걸렸는데, 완전 처음부터 시작하는 인원에 관해서는 단 일주일 안에 모든 것을 익숙해지게 하기 위해서 힘들듯
나 역시 예비 기간동안 끙끙대면서 공부했던 시간때문에 반은 이해할 수 있었지만, 역시 좀더 Java 코드에 익숙해지지 않아서 더 익숙해지는 연습을 해야할 것
Java문법 종합반 강의 간단정리
마지막 스트림까지 전부 Java의 기초를 훝었는데 끝으로 갈 수록 간단한 정의만 알려주고 강의가 마쳤기 때문에 반드시 이번주 개인 과제를 종료한 뒤 개인 공부를 추가로 진행해야할 것 같다.
오늘도 역시 거의 정의를 1~3줄 정도로 줄여서 정리를 했지만 그 양이 막대해서 접은글로 정리를 했고,
추가로 예비 사전 캠프 때부터 공부했던 내용을 DB화 했던 Notion에도 추가로 수정, 업데이트하면서 가벼운 정리를 할 ㅜ수 있었다.
예외처리, 제네릭
더보기
오류 vs 예외
오류 error
- 회복이 불가한 문제
- 환경적인 요소로 인해 여려운 작동
예외 Exception
- 회복 가능
- 코드레벨에서 처리할 수 있는 대응
종류
- 컴파일 예외 : java를 class 파일로 컴파일 시 문법 오류로 인한 발생 예외
- 런타임 예외 : 문법적인 오류가 아닌 프로그램 실행 도중의 일종의 예외
- Checked Exception : 컴파일 시점에서 확인 예외, 주의, 반드시 처리 필요
- 우리가 미리 알고 있는 Exception
- Unchecked Exception : 반드시 예외처리할 필요가 없는 예외
예외 클래스
- Object클래스 자손중 Throwable 클래스의 자손클래스라는 점 기억
예외 발생 흐름
1. 예외 정의
2. 예외 던지기 (발생 무시, 예외 발생)
- throw
- throws
3. 예외 발생 안내, 예외 처리 : Exception Handling
- try-catch 문
try-catch, finally 문
try{
//실행할 코드
} catch (Exception1 e1) {
// Exception1l 발생한 경우, 이를 처리하기 위한 문장
} catch (Exception2 e2) {
// Exception2 발생한 경우, 이를 처리하기 위한 문장
} catch (Exception3 e3) {
// Exception3 발생한 경우, 이를 처리하기 위한 문장
} finally {
// 반드시 실행되어야하는 문장들
}
- 모든 예외를 쓰고 싶다면, Exception 이라고적기
Chained Exception 연결된 예외
- 예외의 원인 예외를 지정하여 래핑하는 예외
- initCause()
- 지정한 예외를 원인 예외로 등록
- getCause()
- 원인 예외를 반환하는 메소드
예외 복구
- try-catch문을 사용하지만, 문제가 있는 상황이기 때문에 많이 쓰이지 않음
예외 처리 회피
- throws 를 통해 떠넘기면서 무시
예외 전환
- catch문에서 새로운 throw new 예외이름 을 사요애해서 새롭게 전환
- 회피 보다는 처리를 위해 처리하는 일종의 단계
Generic
- 자바의 타입 언어에서 필요 없는 코드를 제외시켜주는 역할
- 타입을 무조건 정해줘야하는 Java에서 타입을 지정해주는 역할
- 타입 안정성 제공
- 형변환 생략의 가능
Generic 문법
- 클래스 메서드 에 <> 안에 타입을 지정해선 선언 뒤에 지정
- 작업자 컨벤션을 위해 <T> , U V로 확장 가능
- 타입변수를 따로 지정해줄 수 있음
- 타입 변수는 인스턴스 변수로 사용
- 다수의 타입을 받을 수 있음
- 다형성, 상속 관계를 그대로 가져갈 수 있음
- extends를 통해서
- 와일드 카드
- <? extends T> : T와 그 자손들만 사용 가능
- <? super T> : T와 그 조상들만 가능
- <?> : 제한 없음
쓰레드, 람다, 스트림, Optional
더보기
프로세스와 쓰레드
프로세스
- OS에서 자원을 받아 작업을 하는 하나하나의 단위
Code
- Java Main 메소드 같은 코드
Data
- 전역변수, 정적 변수(static), 배열 등 초기화된 데이터 저장공간
Memory
- Stack 지역변수 매개변수 등 리턴변수
- Heap 필요한 변수를 저장하는 공간
쓰레드
- 실질적으론 프로세스에서 자원을 받아선 실행을 하는 단위
생성
- 프로세스가 실행 요청→명려이처리
자원
- 프로세스 안에 있는 주소공간, Heap공간을 공유
- Stack 메모리공간도 각 명령처리를 위해 할당 받기도 함
- Java는 JVM 프로세스에서 실행되는 모든 쓰레드를 흔히 으미
- Java 프로그램을 실행하면 JVM에서 실행되면선 쓰레드 같이 실행 가능
싱글 쓰레드
- main메서드에서만 실행되는 것
- JVM이 종료되면 같이 종료
멀티 쓰레드
- main메서드 외에 다른 여러 메서드를 동시에 작업
- 다수의 패키지에서 동시에 실행되는 것으로 보이지만 사실 빠르게 번갈아가면서 작업
- 단점
- 동기화 문제 발생
- Dead-Lock 발생 : 서로 무한히 데이터를 받기 위해 기다리는 현상
Thread & Runnable
- 쓰레드 구현
Thread
- Thread 클래스를 extends 로 상속받은 클래스의 run()메서드를 Main에서 사용
Runnable
- 클래스에 implements 시키는 인터페이스가 구현이 되어 run()메서드를 Main에서 사용
Runnable run = new TestRunnable();
//TestRunnable은 Runnable이 구현된 클래스
Thread thread = new Thread(run); // 쓰레드 생성
- 위와같이 Main게 구현해서 사용
- Runnable 객체를 Thread안에 넣어서사용
람다식
public class Main {
public static void main(String[] args) {
Runnable task = () -> {
int sum = 0;
for (int i = 0; i < 50; i++) {
sum += i;
System.out.println(sum);
}
System.out.println(Thread.currentThread().getName() + " 최종 합 : " + sum);
};
Thread thread1 = new Thread(task);
thread1.setName("thread1");
Thread thread2 = new Thread(task);
thread2.setName("thread2");
thread1.start();
thread2.start();
}
}
- 쓰레드를 사용하기 위해서 위의간단히 람다식 포멧을 많이 사용
- 위의 코드는 쓰레드 2개가 병렬로 실행
- Main내 Runnable이 람다식이 추가할 수록 병렬로 진행
데몬 쓰레드 & 사용자 쓰레드
데몬 쓰레드
**Runnable demon = () -> {…}**
- background에서 실행되는 낮은 우선순위의 쓰레드
- Garbage Collector GC 등
- demon 패키지를 만들어서 설정 가능
- 상대적으로 적은 리소스할당으로 느리게 작동
쓰레드 우선순위 & 쓰레드 그룹
쓰레드 우선순위
- 작업 중요도에 따라 부여해서 더많은 작업 시간과 리소스를 정해지게 됨
- 무거운 작업일수록 필수
나누는 방법
- 1~10으로 설정 가능
- 최대 우선순위 (MAX_PRIORITY) = 10
- 보통 우선순위 (NROM_PRIORITY) = 5 기본적인 우선순위
- 최소 우선순위 (MIN_PRIORITY) = 1
쓰레드 그룹
**ThreadGroup 참조변수= new ThreadGroup(”그룹이름”);**
- 모든 쓰레드는 하나의 그룹에 포함
- JVM 내 모든 쓰레드는 기본적으로 system 그룹
- 메인 쓰레드는 system 하위 main 그룹에 포함
- 그룹을 한꺼번에 interrupt 시키는 등 제어가 가능
쓰레드 상태 & 제어
쓰레드 상태
- 쓰레드는 메서드를 통해서 상태를 제어 가능
- 객체생성 ↔ 실행대기 ↔ 일시정지 ↔ 종료 의 상태가 존재
객체생성 NEW
- 쓰레드 객체 생성, 아직 start() 메서드 호출 전의 상태
실행대기 RUNNABLE
- 실행 상태로 언제든지 갈 수 있는 상태
일시정지 WAITING
- 다른 쓰레드가 통지(notify) 할 때까지 기다리는 상태
일시정지 TIMED_WAITING
- 주어진 시간 동안 기다리는 상태
일시정지 BLOCKED
- 사용하고자 하는 객체의 Lock이 풀릴 때까지 기다리는 상태
종료 TERMINATED
- 쓰레드의 작업이 종료된 상태
쓰레드 제어
- static 메서드 활용해서 제어하는
sleep()
- 지금 쓰레드를 () 시간동안 멈추게 하는 것
- 1초는 1000
- InterruptedException 예외 사항이 interrupt에 의해 방해될 수 있기때문에 처리를 해줘야함
interrupt()
- 일시적으로 대기 상태 전환
- start() 되어 NEW → RUNNABLE 쓰레드가 만나면 상태가 true로 바뀌면서 WAITING
join()
- () 시간 동안 쓰레드가 작업을 기다리고 없을경우 끝날때까지 기다리고 작업을 마저 수행
- sleep처럼 대기 이기 때문에 IntteruptedException 예외처리 필수
yield()
- 작업을 끝내고 다른 쓰레드에게 양보를 하고 대기상태로 돌아가는 메서드
synchronized()
- 교착 상태나 같은 리소스를 가지고 가려는 충돌을 방지
- 조건절 무시하고 실행을 해버릴 수 있음
- 임계영역 : 작업중인 영역을 다른 쓰레드가 접근하지 못하게 하는 영역을 지정하여 동기화 가능
- () 안에 있는 메서드끼리 서로의 작업을 임계영역으로 지정 관여를 할 수 없게 됨
wait()
- 모든 작업이 끝나고 다시 어떤 waiting pool에서 후의 notify를 기다리게 하는 메서드
- 단, 조건에 만족되어 쓰레드가 wait()에 들어가고, notify()를 해줄 작업도 wait()상태로 들어가버리면 무한으로 쓰레드들은 돌아가고 락이 걸려 아무것도 안한 상태로 진입하는 것을 유의
notify()
- waiting pool에 있는 쓰레드를 깨워서 다시 실행하게 함
- 특정 쓰레드를 깨울수는 없음
Lock 클래스
- synchronized에서 자동으로 걸리긴 하지만, 같은 메서드 내에서만 진행이 되기 때문에 ReentrantLock을 사용
- ReentrantLock : 재진입 Lock , 조건에 의해서 Lock을 풀고 나중에 다시 Lock을 하는 Lock
- ReentrantReadWriteLock : 읽는 Lock과 쓰기 Lock 각각 침법하지 않은 권한 내애세서 각각 기능을 할 수 있는 Lock
Condition 클래스
- notify 에서 조건에 맞는 쓰레드만 깨울 수 없는 한계의 대안
- ReentrantLock과 함께 사용
- . await() 으로 미리 선언한 컨디션을 메서드가 기다리게 하는 형식
- 마지막에 Lock.unlock 해서 풀면 모든 쓰레드의 일이 완료할 수 있게 한것
함수 프로그래밍
- 함수형을 사용한다는 새로운 Java 의 기능
- 쉬운 검증
- 성능 최적화
- 데이터의 값을 변경하지 않는 동시성
- 함수를 일급값, 변수 처럼 사용한다는 의미
- 인자로 값을 넘기는 것
함수형 인터페이스
람다
- 익명함수
스트림
- 컬렉션의 반복을 처리하는 일종의 기능
- 데이터를 변경하지 않음
Optional
- T타입 객체를 감싸는 일종의 Wrapper 클래스, Optional<T>객체에 담아서 반환
- java.util.Optional 을 사용해야
- 반환 결과가 null 경우를 대비해서 예외발생을 하지 않고도 if 문 없이 연산을 하고 생성***
내용
'Today I Learned' 카테고리의 다른 글
(24.04.26)[2주차] 알고리즘 심화 세션 정리, 과제 이슈 정리 (1) | 2024.04.26 |
---|---|
(24.04.25)[2주차] 알고리즘 세션+개인과제 (1) | 2024.04.25 |
(24.04.23)[2주차] Java문법 종합반 강의(컬렉션, 클래스, 상속, 인터페이스 + 실습 문제 풀이) (0) | 2024.04.23 |
(24.04.22)[2주차] Java문법 종합반 강의(Java입문, 변수/상수, 연산자, 조건문/반복문, 배열) (0) | 2024.04.22 |
(24.04.20)[1주차] WIL (1) | 2024.04.20 |