개발자의 오르막
SW 심화교육 8일차 본문
# 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 |