2015년 1월 14일 수요일

자바 예제 200 172~189

172. 디렉토리에서 파일 찾기

   File형 객체 생성 -> File 메서드 사용 (IOException을 던져야함)


173. 파일의 최근 수정일 바꾸기
174. System.in.을 이용한 문자 입력받기

   System.in.read(b)는 키보드에서 입력받은 문자를 byte배열 b에 대입한다. read가 IOException을 던지므로 예외처리가 필요하다.


175. BufferedReader를 이용한 문자 입력받기

   Stream은 연속적인 데이터의 흐름이다. 스트림이 들어오고 나가는 것과 관련된 것을 IO라 한다. java.io 패키지의 여러 클래스에서 이 기능을 제공한다. 스트림이 시작하는 부분을 소스라고 하고, 목표 지점을 싱크라고 한다. 데이터는 소스에서 싱크까지 한 방향으로 전달되고, 실에 꿰인 구슬 목걸이처럼 흩어지지 않으며 일정한 순서도 있다.

입력을 위한 장치(System.in , Socket)나 기본이 되는 단위(Byte, Char, String, File, Piped)를 노드라고 한다. 노드 이외의 것을 필터라고 한다. 노드 System.in을 감싸는 InputStreamReader 필터는 입력을 편리하게 한다.


176. LineNumberReader를 이용한 문자 입력받기

    IO의 3대 관점
  1. 노드와 필터 구분
 구분법: 노드는 Byte, Char, String, File, Piped 나 System.in, Socket, URL로 시작하며 기본 장치 또는 기본 단위이다.

  2. 소스 스트림과 싱크 스트림 구분
구분법: 화면 모니터로 스트림을 가져오면 소스 스트림이고, 모니터에서 외부로 스트림을 보내면 싱크 스트림이다.

  3. 바이트(8비트) 단위로 입출력하는 바이트 스트림인지 문자(16비트) 단위로 입출력하는 캐릭터 스트림인지 구분한다.
구분법: 바이트 ~Stream으로 끝나고, 캐릭터 스트림은 ~er로 끝난다.


177. FileReader를 이용한 파일 읽기


178. BufferedReader, PrintWriter를 이용한 파일 읽고 쓰기


InputStream, OutputStream 계층도
Reader, Writer 계층도


179. 데이터 주고받기(DataOutputStream)


180. 직렬화 이용하기
  
   직렬화: JVM 힙 영역에 존재하는 객체를 한 줄로 늘어선 바이트의 형태로 만드는 것을 객체의 직렬화라고 하고, 객체의 형태로 복원하는 작업을 역직렬화라고 한다.

java.io.Serializable 인터페이스에 메서드가 없는 이유: 
Serializable 인터페이스를 구현한 구현체가 직렬화 대상이다라는 것을 JVM에게 알려주는 역할만 하기 때문에

serialVersionIUID가 필요한 이유: 직렬화 과정에서 serialVersionUID의 버전이 포함되게 되고, 역직렬화 과정에서 java class에 선언 되어 있는 serialVersionUID의 버전과 서로 동일한지 체크를 하게 된다. 


181. ObjectOutputStream을 이용하여 객체를 파일에 저장하기


182. 쓰레드 사용하기

    프로세스는 실행되고 있는 프로그램이다. 쓰레드는 독립된 작은 실행 단위로 프로세스를 구성한다. 보통 한 프로세스에 여러 개의 쓰레드가 있는데, 두 개 이상일 경우 멀티쓰레드 프로그램이라고 한다.

쓰레드를 만드는 방법: 1. java.lang.Runnable을 구현(implements)
                                    =>Runnable을 구현한 객체의 레퍼런스를 대입하여 Thread 클래스                                           의 객체를 생성한다.
                                        ex)
                                        MyRun mr1=new MyRun();
                        Thread t1=new Thread(mr1);
                             
                                2. java.lang.Thread를 상속
                                    => 자신이 쓰레드이다.
                                        ex)
                                        MyThread t2=new MyThread();


183. 쓰레드의 기본 메서드와 특징 확인하기
 
 
쓰레드는 멤버 필드와 스태틱 필드를 공유한다.


쓰레드 순서
1)쓰레드를 만드는 방법 2가지 - 쓰레드를 상속하거나 Runnable을 구한다./
2)쓰레드의 주요 메서드(run, sleep)
3)쓰레드의 우선순위 변경
4)쓰레드의 자원공유와 동기화
5)쓰레드 사이의 통신(wait, notifyall)
6)채팅을 통한 쓰레드 확인


184. 쓰레드와 자원 공유 - 멤버필드

    자원을 공유하는 경우
      1. 여러 개의 쓰레드에서 한 객체의 멤버 필드를 사용하려는 경우
      2. 여러 개의 쓰레드에서 동일 타입으로 생성된 객체의 스태틱 필드를 사용하려는 경우

 자원 공유 예시
  80만원이 든 내 계좌(멤버필드)에서 여러 가지 방법(쓰레드)으로 돈을 지불할 수 있다.(자원 공유). 인터넷 쇼핑을 하다가 인터넷 뱅킹으로 40만원을 지불하고 나머지는 직불카드로 찾아 쓸 수 있다. 하지만, 두 방법으로 동시에 접근하여 인터넷 뱅킹으로 80만원을 지불하면서 직불카드로 80만원을 지불하면서 직불카드로 80만원을 찾으려할 때 이런 문제를 막을 수 있는 조치(동기화)가 없다면 160만원이 인출되는 사고가 발생할 수 있다.


185. 쓰레드와 자원 공유 - 동기화

 
동기화를 하는 경우 한 쓰레드에서 작업이 끝날 때까지
다른 쓰레드에서의 작업을 막는다

선언 방법
1) synchronized(클래스 이름.class)
2) 메서드에 synchronized 키워드 붙이기 => public synchronized void show()


186. 쓰레드와 sleep 메서드

 .sleep(time): time/1000초 만큼 멈춘다.
 .setPriority(우선순위): 1~10중에서 우선순위를 준다(클 수록 우선순위가 높다)


187. 쓰레드와 wait, notifyAll 메서드 이해하기 // 쓰레드 간의 통신할 때 사용
   
  데이터의 신뢰성이 훼손되는 경우
1. 여러 쓰레드에서 동시에 같은 데이터에 접근할 경우
2. 동일 데이터를 사용하는 한 작업 단위가 종료되지 않은 상태에서 다른 작업단위가 시작됨

==> 동기화 시킨다(Why? 신뢰성을 지키기위해)
==> 공유된 데이터는 한 쓰레드에서만 사용할 수 있는 락(lock)상태가 된다.
==> 한 쓰레드가 락이 걸린 데이터를 처리하는 도중 다른 쓰레드에서 이 데이터를 사용하려면 쓰레드 간 통신이 필요하다.
==> 동기화된 쓰레드가 wait 메서드를 호출하여 락이 걸린 데이터를 더 이상 사용하지 않고  동기화된 다른 쓰레드에게 넘긴다.
==> 다른 쓰레드에서 작업이 끝나 원래의 쓰레드에게 작업을 시키려면 notifyAll 메서드를 호출한다.
   

188. 1초 간격으로 현재 시간 출력하기

      util 라이브러리의 Timer 객체 생성


189. 5초동안 1초간격으로 현재시간 출력하기  -> SKIP


댓글 없음:

댓글 쓰기