플레이데이터 - 17일차 자바 공부

Kim Hyen Su·2023년 7월 23일

입출력 IO

🐽 표준입출력

  • 콘솔(console, 도스창)을 통한 데이터 입출력을 의미한다.
  • System.in : 콘솔로부터 데이터를 입력받는데 사용.
    • InputStream 클래스 타입의 멤버 변수
    • 주의할 점
      • 콘솔창 Enter키 = \r + \n
        • 입력 종료 시에는 Ctrl + z 키를 누르면 EOF를 java에 알린다.
  • System.out : 콘솔로 데이터를 출력하는데 사용.
  • System.err : 콘솔로 데이터를 출력하는데 사용.

🐽 File

  • 파일은 기본적으로 많이 사용되는 입출력 대상이므로 중요하다.
  • 자바에서 File 클래스는 파일과 디렉토리를 다룰 수 있도록 해준다.

👉 절대 경로와 정규 경로

  • 절대 경로 : 파일 시스템의 루트로 부터 시작하는 파일의 전체 경로.
  • 정규 경로 : 기호나 링크를 포함하지 않은 유일한 경로.(하나의 경로)

🐽 직렬화

  • 객체 데이터를 입출력하기 위해 객체 내 변수를 연속적인 데이터로 변환하는 것.
  • 객체를 읽어와 다시 객체로 변환하여 받는 것을 역직렬화라고 한다.
  • 구현 클래스
    • ObjectInputStream / ObjectOutputStream
  • writeObject(Object obj)를 사용하여 객체를 출력하면, 객체가 파일에 직렬화되어 저장된다.
  • 역직렬화된 객체는 Object 타입이므로, 객체의 원래 타입으로 형변환 해줘야 한다.

👉 직렬화가 가능한 클래스 만들기

  • java.io.Serializable 인터페이스 구현.
  • 직렬화를 고려하여 작성된 클래스인지 구분하는 기준이되는 인터페이스.
  • 상속관계에서 상위 클래스가 Serializable 인터페이스를 구현한 경우 하위 클래스는 구현하지 않아도 직렬화가 가능하다.

👉 transient

  • 해당 예약어가 붙어 있는 멤버 변수는 직렬화 대상에서 제외되며, 해당 변수는 기본값으로 직렬화 된다.
  • 보안상 비밀번호와 같은 값들은 직렬화 대상에서 제외하는 경우가 많다.

👉 버전 관리

  • 자바 내에서 직렬화된 객체를 역직렬화 시 직렬화할 때와 같은 버전의 클래스를 사용해야 한다.
  • 클래스명이 같아도 클래스 내부 코드가 변경된 경우 다른 버전으로 인식하여 역질렬화 실패 및 예외가 발생하게 된다.
  • 따라서 내부적으로 객체가 직렬화 시 serialVersionUID 라는 고유 버전을 수동으로 생성하여 직렬화 내용에 포함하도록 해준다.

스레드

🐽 프로세스와 스레드

  • 프로세스는 실행 상태의 프로그램을 말한다.
  • 스레드는 프로세스의 자원을 공유하여 실제 작업을 수행하는 작업 단위를 말한다.
  • 따라서 프로세스는 최소 하나의 스레드를 가지고 있어야 한다.
  • 스레드는 main() 메서드와 호출스택으로 구성되어 있다.

🐽 멀티태스킹과 멀티스레딩

  • 멀티태스킹은 하나의 CPU에서 여러개의 프로세스를 동시에 실행하는 것.
  • 멀티스레딩은 하나의 프로세스 내에서 여러 스레드가 동시에 작업을 처리하는 것.
  • 스레드의 갯수 제한은 없으나 작업 시 호출스택을 필요로 하기 떄문에 프로세스의 메모리 한계에 따라 실행 가능 갯수가 결정된다.
  • 멀티 태스킹 또는 멀티스레딩은 실제 동시에 작업을 처리하는 것이 아니라 시분할 방식을 통해 시간 단위로 쪼개어 빠른 속도로 작업을 번갈아가며 수행함으로서 동시에 처리하는 것처럼 보이는 것이다.
  • 이처럼 시분할 방식으로 작업 시, 작업을 번갈아가며 수행하게 되므로 중간마다 작업을 전환하는 context switching 시간이 추가로 발생하게 된다.

🐽 멀티스레딩의 장단점

  • 장점
    -
    • CPU 사용률 향상
    • 자원을 효율적 사용
    • 사용자에 대한 응답성 향상
  • 단점
    - 하나의 프로세스 내에서 여러 스레드가 자원을 공유하여 사용하므로 동기화 및 교착상태와 같은 문제가 발생.
    - 두 스레드가 자원을 공유한 상태에서 서로 다른쪽에서 자원을 사용하는 것을 기다리느라 대기하는 상태를 말한다.

🐽 스레드 구현과 실행

👉 구현 방법

  1. Runnable 인터페이스 구현
  • run() 메서드 구현.
  1. Thread 클래스 상속
  • run() 메서드 구현.

👉 스레드 실행

  • start() : 스레드를 실행하기 위해 호출하는 메서드로서, 호출 스택을 생성 후 스택에 run()을 호출하는 메서드이다.
  • 모든 스레드는 독립적인 호출 스택이 필요하기 땜누에 새로운 스레드 생성 후 실행 시마다 새로운 호출스택이 생성된다.
  • 스레드 종료 시 작업에 사용되었던 스택은 소멸된다.

🐽 싱글스레드와 멀티스레드

👉 싱글스레드

  • 하나의 스레드로 작업을 처리하는 것.
  • 단순한 계산 작업의 경우 멀티스레드로 구현 시, 작업 전환 시간 때문에 싱글 스레드로 구현하는 것이 더 효율적이다.
  • 하지만, 외부 기기와 입출력 작업 시에는 싱글 스레드로 구현 시 시간 지연이 발생하게 된다.

👉 멀티스레드

  • 외부 기기와 입출력 시 멀티스레드로 프로그래밍 하는 것이 더 효율적이다.

🐽 데몬스레드

  • 다른 스레드의 작업을 돕는 보조적인 역할을 수행하는 스레드
  • 일반 스레드가 모두 종료 시 데몬 스레드는 강제적으로 자동 종료된다.
  • 대표 예시
    • 워드 프로세서의 자동 저장 기능.
    • 자바 가비지컬렉터.

👉 데몬스레드 생성

  • 스레드의 작성 및 실행 방법은 같으나, 스레드를 생성 후 start() 호출 전에 setDaemon(true)를 호출한다. 전에 호출하지 않으면, IllegalThreadStateException 예외가 발생한다.

🐽 스레드의 실행제어

👉 스레드의 상태

스레드

  • NEW : 스레드 생성 후 start() 호출 전.
  • RUNNABLE : start() 호출 후 스레드 실행 대기 상태.
  • BLOCKED : 동기화블록에 의해서 일시정지된 상태.
  • WAITING : 일시정지 상태.
  • TIMED_WAITING : 일시정지 시간이 지정된 일시정지 상태.(sleep)
  • TERMINATED : 스레드 작업이 종료된 상태.

interrupt() 와 interrupted()

  • 실행중인 스레드의 작업이 끝나기 전에 작업을 취소 시켜야 하는 경우, 스레드에게 작업을 정지하라는 요청을 위해 사용하는 메서드 interrupt().
  • interrupt() 메서드는 스레드의 멤버 변수인 interrupted를 fales에서 true로 변환해준다.
  • interrupted() 메서드는 현재 interrupted 멤버 변수 상태를 확인하는 메서드로, 호출 후 interrupted 값을 false로 초기화 해준다.
  • isInterrupted() 메서드는 현재 interrupted 멤버 변수 상태를 확인하는 메서드.(interrupted 값 변화 X)
  • 스레드가 sleep(), join(), wait()에 의해 일시정지 상태에서 interrupt() 호출 시 InterruptedException 발생 및 스레드의 interrupted 멤버 변수 상태가 false로 초기화 된다.

🐽 스레드의 동기화

  • 한 스레드가 진행중인 작업을 다른 스레드가 간섭하지 못하도록 막는 것.
  • 이를 위해 도입된 개념이 '임계영역'과 '잠금' 개념이다.
  • 공유 데이터를 사용하는 코드 영역을 임계영역으로 지정 후 공유 데이터가 가지고 있는 작믕을 호기은한 하나의 스레드만 임계영역 내 코드를 수행할 수 있도록 한다.

👉 synchronized를 이용한 동기화

  • synchronized 예약어는 임계영역 설정 시 사용된다.

    1. 메서드 전체를 임계영역으로 지정
    pulbic synchronized void method(){
        //...
    }
    
    2. 특정한 영역을 임계영역으로 지정
    synchronized(객체의 참조변수){
        //...
    }
  • 임계영역은 최소화 하는 것이 효율적이므로, 메서드 내 일부 코드만 동기화시킬 경우 2번으로 특정 코드를 임계영역으로 지정해준다. 일반적으로 객체의 참조변수인 this를 많이 지정한다.

profile
백엔드 서버 엔지니어

0개의 댓글