개발자의 오르막

SW 심화교육 8일차 본문

교육과정 ( SW 개발자 심화과정 )/Java

SW 심화교육 8일차

계단 2019. 7. 22. 12:37

# java API 다운로드

- 'jdk-6u30-apidocs.zip' 설치

- C:\apidocs\jdk-6u30-apidocs.zip\docs\api\index.html 파일 열어주고
   라이브러리 참조

 

# Import

 

 

- package - import - class 선언 식으로 온다.

- javac -d . Test076.java  → 현재 디렉토리에 패키지 생성
  java - classpath . temp.Test076  → import 참조 실행

 

- import의 단위는 클래스이다.

- import는 언제 하냐?  다른 패키지에 있는 클래스들을 가져다 쓸 때

- import는 왼쪽 (조상) , 오른쪽 (자손) 의 관계일 때 인스턴스 생성 (상속관계확인)

- abstract 여부 확인

 

- 오류가 났을 때 try/catch 문으로 처리 할 수 있는 구문을 설명해줘야 함.

 

 

- 왜 try ... catch 안쓰면 에러가 나나?

  throws XXXException 형태로 선언된 함수는 XXXException 이 깐깐할 경우에 해당 예외를

  처리할 수 있는 try catch 영역 안에서 사용해야 한다.

- Exception이 더 깐깐하다 : Exception에서 걸리는 부분은 컴파일 부분에서부터 에러가 난다.
  다른 에러 함수는 컴파일은 되지만, 실행 부분에서 에러가 난다.

 

- FileNotFoundException 부분을 IOException 으로 바꿔도 에러가 안남.

  →  IOException 이 FileNotFoundException 의 조상이기 때문
      자손이 에러를 잡는 부분을 부모가 다 잡을 수 있음

- 조상의 포인터로 자손의 인스턴스를 가리킬 수 있어서 됨

 

- try/catch 문이 아닌 에러 잡는 법 

 

 

- 1. 에러는 발생시에 잡아주면 애러 에러 발생 안된걸로 한다. 

- 2. 에러가 발생할 수 있으면 그 사실을 명시하면 된다.

- try/catch 문은 생성자를 생성한 부분에서 에러가 났을 때 책임을 지지만

  throws를 명시하면 main을 호출한 쪽이 처리한다.

  (아래 경우는 생성자 호출한 쪽이 아니라 main을 호출한 쪽이 처리 한다.

 사원이 사고치는데 대린느 그 책임을 부장에게 넘기고, 부장이 처리한다.)

- main 함수를 호출한 쪽(JVM)이 책임을 진다 == 죽는다.

 

 

 

 

- throw e; 를 선언한 순간, 에러를 발생시켜 main 함수 호출한 쪽에서 책임을 지게 한다.

 

 

# OutputStream (파일을 저장하는 방법)

 

 

 

→ 출력

 

 

- FileOutputStream : 파일에 저장하는 방법을 제공한다.

  OutputStream : 내보내는 방법을 추상화 한 클래스

- 이걸 상속받은 클래스는, 이걸로 가리킬 수 있고, 이것에 선언된거만 쓴다

- 정보는 각 인스턴스에 저장된 것이기 때문에, 유지보수 용이

-  write : 한 번에 1 바이트를 사용하여 정보 저장, a.dat 파일 생성

   API 보니까 조상은 abstract하게 선언되었고, 자손에서는 오버라이딩 된 함수 존재

  오버라이딩 된 write 는 매개변수의 값을 a.dat 파일에 저장하게 된다.

- close(); 를 통해 파일을 닫고, 뒤처리를 해준다.

 

- 정보를 저장하는 단계는 메소드를 재정의했을 때 경우에 따라서 다르게 한다.

  FileOutputStream은 실제로 close를 호출할 때 정보를 메모리에 저장

  다른 경우에는 Buffer에 바로바로 저장

 

 

 

- read()는 정보를 1바이트씩 읽어온다.

- 조상에서 선언된 것만 호출 가능하고, 자손에서 오버라이딩 된 메소드가 호출

- read() 는 오버라이딩된 코드일까? 오버라이딩 되지 않은 코드일까?

  InputStream 은 여러 클래스들에게 상속받는 존재

  read() 함수를 오버라이딩 된 메소드라면 메소드를 읽는 방법이 각각 다른 코드가 들어간다.

  ??

 

- d는 data에 더이상 읽을 수 있는 값이 없음으로 -1 출력

 

# Stream ( Input/Output ) 개념

- byte 단위로 전송한다.

- 저장된 순서대로 읽고, 순서대로 내보낸다.

- 중간부분만 따로 읽고 내보내는 건 없다. 무조건 처음부터 끝까지

- 다 썼으면 반드시 close() 함수를 호출해 주어야 한다.

 

 

 

- 보통 연 순서의 역순으로 close를 선언한다.

 

# 향상된 Stream 1 (while 문 활용)

 

 

# 향상된 Stream 2  (많은 용량을 빠르게 전송할 수 있음)

 

 

- Buffer 로 한번에 전송할 수 있는 양을 설정할 수 있다.

- Write(buf, 0, r)

- Write( 정보를 옳길 데 필요한 그릇(용기 최대값) , 시작위치 ,

                                                   read를 통해 읽은 개수 (변하는값 ))

- int read (byte[] buf) : Buf가 감당 가능한 만큼 읽고, 읽은 데이터 갯수 리턴
  Buf 에 있는 내용을 내보낸다. 

 

# socket

 

-ipconfig 를 통해 ip주소 검사

 

- Test083C : 클라이언트 (소켓 송신용)

 

 

- Test083S : 서버(서버 대기용)

 

 

 

- 대기하는 쪽 :  서버, 찾아가는 쪽 :  클라이언트

- 1. 먼저 서버가 구동한다. - 포트을 물고 구동해야 한다. (1123)

  2. accept : 대기하다가 클라이언트가 찾아오면 소켓을 생성해서 리턴

 

  1. 클라이언트가 찾아가기 위해 알아야 하는 정보 : IP, Port 번호

  2. 연결되면 Socket이 생성된다.

 

- 접속 성공 시 양쪽에서는 Socket이 생성되고 이 둘은 통신이 가능하다. 

 

# 단어 보내기

 

- Test083C : 클라이언트 (소켓 송신용)

 

 

 

- Test083S : 서버(서버 대기용)

 

 

- 소리바다 만들기

1. 서버가 대기, 

2. 클라이언트가 송신

3. 서버가 accept를 해주고

4. 서버가 정보를 전송하고

5. 클라이언트가 정보를 전부 받고

6. 복사를 한다.

 

- Server

 

 

-Client

 

 

 

# Buffered 활용한 소캣 통신  (IO 패키지와 데코레이션 패턴의 예제)

 

 

 

- java.io 패키지가 데코레이턴 패턴이라는 설계기법으로 구현되었따.
  HelloGreet MerciGreet StarDeco SharpDeco : 데코레이션 패턴의 예제
  1바이트씩 복사하는 코드를 쓰세요

 

- 위 코드의 out, in은 BufferedOutputStream, BufferedInputStream, 을 가리키는 참조형 변수이다.

 

- write() 를 호출하면, Buffer 에다가 정보를 쌓은 다음에, 그 인스턴스자체를 한번에 보냄.

- 1바이트씩 하나, 하나 보냄 → 덩어리에 쌓아서 한번에 보냄

 

- out.write(..) 를 호출했을 때 대상은 FileOutputStream 에서 지정한다.

  내보내는 방법은 BufferedOutputStream에서 버퍼링을 제공한다.

- 두 클래스가 결합한 결과를 만드는데 사용자는 OutputStream 에서 지정하는 함수만 사용하면 된다.

- 이 두개는 실제로 같은 설계기법으로 구현된 코드이다.

 

# 소캣 전송 자료의 크기

 

 

- byte를 보내기 때문에, 한번의 전송에 8byte만 보낸다.
- 이게 왜 깨지는지 ? 4바이트 다 보내는게 아니더라.. 

 

 

 

- 데코레이터 패턴으로 이해하면 Out이 가리키는 대상은 FileOutputStream(d.dat)에

  저장하되, ObjectOutputStream 에서 제공하는 방법을 사용하게 된다.

ObjectOutputStream 에서는 wirteInt, writeDouble, writeUTF 등을 제공한다.

  전송시에 안 깨진다.

 

# writeUTF 

 

 

# Write, Reader

- close를 해서 저장을 해주고 넘어가야 한다.

 

 

#유니코드- 글자를 입력했는데, 깨지지 않는다.
- OutputStream InputStream : 전송단위가 Byte
- Reader, Write : 전송단위 char : 문자로 된 데이터 전송용
- char 는 2바이트이고, 유니코드를 지원한다.
- 완성형은 가 -> 1비트 등으로 정의해서 함. 
- 조합형은 556, 으로 나눠서 총 16바이트로 한 글자를 만드는 것
- 유니코드는 모든 글자를 다 포용하지 못한다. (6만자 제한)
- 웬만한 글자는 포용한다. 한글 + 영문 + 중국어 + 아랍어 + 일본어 +...

- 확장 가능한 가변 길이를 가지는 문자체제를 도입 : UTF-8 (웹 표준)

 

# Writer/Reader 는 OutputStream/InputStream 과 상속관계가 아님.

  - 외국의 코드를 합했을 때, 한글이 깨지는 경우가 다수

  - OutputStreamWriter / InputStreamReader 을 통해 char 입출력을 byte 입출력로 전환

    (어댑터의 기능 수행)

 

 

 

 

'교육과정 ( SW 개발자 심화과정 ) > Java' 카테고리의 다른 글

SW 심화과정 D-9  (0) 2019.07.24
SW 심화교육 9일차  (0) 2019.07.23
SW 심화과정 교육 5일차  (0) 2019.07.19
SW 심화과정 D-4  (0) 2019.07.18
SW 제주 심화 교육 - 코드 패턴  (0) 2019.07.18
Comments