Programming/Backend

자바 기초 다지기 - 6 (Thread, Syncronized, Serializable, IO, NIO)

meaningful_life 2021. 9. 13. 23:24
728x90

Thread와 Runnable

Thread는 하나의 프로세스 안에서 여러 개 생성되고 고객이 필요에 따라 이 Thread를 사용하고 작업이 끝날 경우 반납한다고 생각하면 되겠다.

  • Runnable : Thread의 인터페이스
  • Thread Class: Runnable의 구현체

Thread의 실행 방법

  • run() 메소드로 구현이 가능하며
  • start()로 실행이 가능하다.

Thread에 주요 메소드

  • Thread.sleep(1/1000초) : 쓰레드를 잠재운다.
  • Thread.join() : 쓰레드가 끝날 때까지 기다린다.
  • Thread.interrupt() : 쓰레드를 정지 시키고자 할 때 사용하는 메소드로서, 쓰레드가 일시 정지 상태일 경우 에러를 발생시켜 run() 메소드를 정상 종료 시킨다.

Thread Demon 이란?

  • Demon 쓰레드가 계속 실행되고 있어도, 다른 실행중인 일반 쓰레드가 없다면 멈춰버린다.
  • 위 메소드가 존재하는 이유는 예를 들어 별도로 모니터링을 하고 있다가, 주요 쓰레드가 종료될 경우 해당 모니터링도 함께 종료될 때 사용한다

Syncronized(동기화)

  • Thread safe
  • 한 가지의 메소드를 실행함에 있어 Thread 끼리의 간섭이 없도록 한 Thread가 해당 메소드를 사용중이면 대기중이게 만들어 해당 연산이 간섭 없이 올바로 이뤄지도록 하는 방법

Object의 notify(), wait()

주의사항 : synchronized( ) { } 로 감싸야지 사용이 가능하다

  • wait() : notify가 실행되기 전까지 쓰레드를 잠재운다
  • notify() : wait()되어 있는 Thread를 다시 깨워 일하게 만든다.

 

I/O ( Input Output )

파일을 읽거나 저장 할 경우, 다른 서버나 디바이스로 파일을 보낼 일이 있을 때 사용한다.

Byte 데이터 처리방법

  • InputStream : 읽기
  • OuputStream : 쓰기

Char 데이터 처리방법

  • Reader : 읽기
  • Writer : 쓰기

File Class

파일 및 경로 정보를 통제하기 위한 클래스

  • 존재하는가?
  • 파일인가, 경로인가?
  • 읽거나, 쓰거나, 실행할 수 있는가?
  • 언제 수정되었는가?
  • 이름을 바꾸고, 삭제하고, 생성하고, 전체 경로를 확인한다

InputStream, OutputStream ,BufferedReader, BufferedWriter

입력과 출력 자바 스트림으로서 사용할 때 주의사항으로 close()를 반드시 구현해야 한다.

 

Serializable

Serializable 인터페이스를 구현할 경우 JVM에서 해당 객체를 저장하거나 다른 서버로 전송할 수 있도록 한다.

주의사항

  • static final long serialVersionUID = 1L; 를 반드시 구현해야 한다. 없다면 default로 지정된다.
  • serialVersionUID란?
    • 해당 객체의 버전을 명시하는데 사용한다.
    • 전송할 서버와 전송 받을 서버가 같은 객체, 클래스인지 인식하는데 사용한다.
    • UID가 같더라도 변수의 개수나 타입이 다르면 다른 클래스로 인식한다.

구현방법?

  • 파일 쓰기
    • FileOutputStream, ObjectOutputStream
  • 파일 읽기
    • FileInputStream, ObjectInputStream

Transient 예약어

Serializable을 이용해 객체를 저장할 때 변수가 저장되거나 전송된다면 보안상 큰 문제가 발생할 여지가 있을 경우, 해당 예약어가 추가하면 Serializable 대상에서 제외된다.

 

NIO

JDK 1.4부터 추가되었는데, 속도 때문이다.

NIO는 스트림을 사용하지 않고 다음 2가지를 사용한다.

  • 채널(Channel) : 예를들어 도매상을 생각하면 되겠고
  • 버퍼(Buffer) : 예를들어 도매상과 고객의 중간에서 물건을 파는 소매상을 생각하면 된다.
    • 메소드
      1. capacity() : 버퍼에 담을 수 있는 크기 리턴
      2. limit() : 버퍼에서 읽거나 쓸 수 없는 첫 위치 리턴
      3. position() : 현재 버퍼의 위치 리턴
      4. flip() : limit 값을 현재 position으로 지정한 후, position을 0(가장 앞)으로 이동
    • 위치 변경 메소드
      1. get() : 순서대로 값을 가져온다.
      2. mark() : 현재 position을 mark한다
      3. reset() : mark한 위치로 reset한다
      4. rewind() : 현재 버퍼의 position을 0으로 이동
      5. clear() : 버퍼를 지우고 현재 position을 0으로 이동하고, limit 값을 버퍼의 크기로 변경
728x90