본문 바로가기
Today I Learned 2024. 4. 24.

(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 문 없이 연산을 하고 생성***

 

 


내용