2020. 10. 21. 10:06ㆍ교육과정/KOSMO
키워드 : 스레드 입출력 복습 / Json / 통신 protocol / 자동연산 프로그램 / 채팅 프로그램 / NCS 평가 / 자바 메일 보내기
****
1. 복습 - 스레드(Thread), 입출력(IO)
※ Thread : 하나의 프로세스에서 여러 작업을 하도록 (multi-tasks)
[스레드 사용 절차]
(1) 스레드 클래스 선언
① Thread / Runnable 상속
② run( ) overriding
(2) 객체 생성
(3) start( ) → run( ) 호출
※ 자바의 입출력 - 표준화
[스트림] : 데이터를 전송하는 가상 통로
(1) 바이트형 스트림 : ~~~OutputStream / ~~~inputStream
- 자바의 자료형을 유지하면서 전송하고자 할 때 (ex. int, double, class 등)
- 스트림에 필터링하여 주로 사용
(*) 직렬화 : 객체가 가상통로를 통과할 수 있게끔 나열하는 작업 / Serializable 구현
(2) 문자형 스트림 : ~~~Writer / ~~~Reader
- 자바와 다른 응용프로그램(ex.메모장)에서도 데이터를 공유
- 양식 : xml 형식 / json 형식 - 보편적으로 사용하기로 약속했다.
ex) xml을 쓰게 된 이유
홍빛나라여자서울대학생
홍빛나 라여자서울대학생
>> 3글자를 이름으로 읽자고 할 경우 이름을 정확히 파악하기 힘들다.
ex) xml 방식에서는 태그를 붙여 파악한다.
>> <name>홍빛나라우리</name> -- 태크를 붙인다
ex) json 방식에서는 괄호를 사용한다. (key value)
{
name : "홍길동",
gender : "남자"
}
(+) RandomAccessFile : Writer + Reader
2. JSON 형태로 파일을 저장하기
※ Json 라이브러리 설정을 먼저 해야 Json 사용이 가능하다.
▶ 좌측 프로젝트명 우클릭 - Properties - Java Build Path - Libraries - Add External JARs
- json-simple-1.1.1.jar 열기 - 좌측에 Referencd Libraris 확인 가능
▶ xml이나 json으로 저장한 파일 내의 데이터를 쪼개기 위해 파싱(구문분석)을 해줘야 한다.
3. 입출력 Quiz
1. DataInputStream 객체를 생성하는 방법으로 맞은 것은?
(1) new DataInputStream(“data.txt”);
(2) new DataInputStream( new File(“data.txt”));
(3) new DataInputStream( new FileReader(“data.txt”) );
(4) new DataInputStream( new InputStream(“data.txt”) );
(5) new DataInputStream( new FileInputStream(“data.txt”) );
▶ 답 : (5)
▷ 해설 : (1) 필터에서 내용물을 바로 읽지 못함
(2) 필터에서 파일 객체를 바로 연결해서 읽지 못함
(3) 바이트형 스트림과 문자형 스트림을 혼용할 수 없음
(4) InputStream이 더 상위 부모 클래스라서 순서가 바꼈음
2. 다음 중 맞는 코드는?
(1) OutputStream out = new FileInputStream(“data.txt”));
(2) OutputStream out = new DataOutputStream( new FileOutputStream(“data.txt”) ) );
(3) OutputStream out = new FileOutputStream(“data.txt”, “rw”);
(4) OutputStream out = new ObjectOutputStream( new FileOutputStream( new File(“data.txt”)) ) );
▶ 답 : (2), (4)
3. 현재 작업 경로가c:\work 인 경우 다음 프로그램을 실행한 출력 결과는?
import java.io.*;
class Test{
public static void main( String a[] args ) throws Exception {
File f = new File (“data.txt” );
System.out.println( f.getAbsolutePath() );
}
}
(1) data.txt (2) work\data.txt
(3) c:\work\data.txt (4) c:\work
▶ 답 : (3)
4. RandomAccessFile 객체를 생성할 때 인자로 적합한것은?
(1) “w” (2) “r” (3) “wr” (4) “rw” (5) “rwx”
▶ 답 : (2), (4)
해설 : 읽기는 r / 쓰기는 rw
RandomAccessFile은 스트림 순서대로가 아닌 임의 순서로 작업 진행
5. RandomAccessFile 객체를 생성할 때 적당한 것은?
(1) new RandomAccessFile(“data.txt”, “r”);
(2) new RandomAccessFile(“r” , “data.txt”);
(3) new RandomAccessFile(“data.txt”, “w”);
(4) new RandomAccessFile(“rw”, “data.txt”);
▶ 답 : (1)
해설 : (2), (4) (String, 모드)로 와야 해서 순서가 틀렸음
6. 자바에서 파일이나 디렉토리를 관리할 수 있는 클래스는?
(1) File (2) Directory (3) FileWriter (4) FileChooser
▶ 답 : (1)
4. 자바에서의 파일탐색기 기능을 File ( ) 메소드를 통해 사용할 수 있다.
- java.io.File
- list ( ) : 폴더 안에 있는 목록을 문자열로 나타낸다.
- delete ( ) : 자바나 다른 응용프로그램에서 파일을 지울 경우 휴지통에도 남지 않기 때문에 주의가 필요하다.
5. 통신
※ 프로토콜(Protocol) : 통신상의 규칙
cf) OSI 7계층
- IP (Internet Protocol)
- TCP(*) / UDP
` TCP : Transfer Control Protocol
: 데이터를 묶어서 보낸다.
확실하게 전송되지만, 나머지 통신이 멈춘다. 기본적으로 많이 사용된다.
` UDP : User Datagram Protocol
: 데이터를 쪼개서 보내되 순서를 명시한다.
속도는 빠르지만 일부가 깨질 염려가 있다.
동영상or 음성 전송시에는 UDP를 사용하지 않는게 좋다.
- http / smpt (메세지전송) / ftp (파일전송) ....
<클라이언트> <서버>
TCP(*)/UDP 결정 TCP(*)/UDP 결정
내 IP 내 IP
내 PORT 내 PORT(*)
상대 IP(*) 상대 IP
상대 PORT(*) 상대 PORT
* 포트번호 : 1~65535
1~1024 번호 : 예약포트
- 웹 : 80
- smpt : 25 (이메일 등)
※ 자바에서의 통신
<클라이언트> <서버>
(1) ServerSocket 생성 (PORT)
(1) Socket 생성(서버IP, 서버PORT) (2) accept( ) : 클라이언트가 올 때까지 기다렸다가
클라이언트 접속시 데이터를 주고 받을 소켓을 생성해줌
Socket s = accept( )
(2) 입출력 스트림 얻어오기 (3) 입출력 스트림 얻어오기
(3) 데이터 전송 (4) 데이터 전송
(4) 스트림과 소켓 닫기 (5) 스트림과 소켓 닫기
▶ 읽고 쓰기가 1번만 되는 상태이므로, (2)~(4)를 반복하되, 제어권을 컨트롤하기 위해 스레드를 사용해준다.
※
UDP 통신을 하고자할 때는 자바에서 datagramSocket 클래스를 사용하면 된다.
일반적으로는 TCP 통신을 하게 된다.
6. 간단한 서버 프로그램 (심심이?)
<서버-클라이언트 통신 결과>
SimpleServer started..
인사말을 입력하세요 = >
안녕하세요.
날이 선선하네요^^
SimpleServer started..
인사말을 입력하세요 = >
안녕
짝꿍님~
7. 자동연산 프로그램
※ 클라이언트에서 데이터 전송 → 서버에서 수신 → 연산 → 클라이언트로 전송 → 클라이언트에서 결과 확인
※ 서버와 클라이언트에서 각각 소켓을 만든다.
클라이언트A는 JuryThreadA와 통신한다.
클라이언트B는 JuryThreadB와 통신한다.
▶ 서버에서 어느 클라이언트와 통신하는지 구별하기 위함
- WriteInt( ) / ReadInt( )
<서버>
<클라이언트>
<결과>
클라이언트 쪽 콘솔에서 연산 결과의 배열이 출력된다.
7. 채팅 프로그램
- ServerSocket( PORT)
- accept ( )
- StringTokenizer( )
- countTokens( )
- BufferedReader
- equalsIgnoreCase( )
- readLine( )
- 오토스크롤
ta.setCaretPosition(ta.getDocument().getLength());
<서버>
<클라이언트>
8. NCS 전공교과 평가
1. 다음의 요구사항을 충족하는 프로그램의 소스코드와 결과화면 스크린 샷을 제출하시오
[요구사항]
가. 자신이 태어난 년도인 숫자를 저장 할 수 있는 변수 year를 선언하고
자신이 태어난 년도를 대입한다.
나. 자신의 나이를 저장할 수 있는 변수 age를 선언하고,
year 변수를 사용하여 자신의 나이를 계산하여 대입한다(공식:현재년도-태어난 년도)
단, 현재 년도는 Calendar클래스를 사용하여 구해야한다
그리고 age 와 year를 출력하여라
2. 1부터 100까지 숫자 중 3의 배수 이거나 5의 배수인 숫자의 합을 구하는
소스코드와 결과화면 스크린 샷을 제출하시오
[요구사항]
가. 단, 3와 5의 공배수인 경우 제외
나. while문 버전과 for문 버전으로 두가지 소스코드를 작성하시오
3. 다음 요구사항을 만족하는 은행 계좌 클래스를 정의하여 소스코드와 결과화면
스크린 샷을 제출하시오
[요구사항]
가. 속성으로 예금주,계좌번호,잔액을 갖는다.
예금주는 String,계좌번호 String,잔액은 int로 정의하여라
나. 메소드로 인출 및 입금 메소드를 갖는다.
인출 메소드는 인자로 인출할 금액을 받고 잔액이 부족시에는
“잔액이 부족합니다”라는 메시지를 잔액이 충분할때는 인출한 금액을 출력하는
메소드이다
입금 메소드는 인자로 입금할 금액을 받고 입금액을 잔액에 더하고
입금한 금액을 출력하는 메소드이다
다. toString()메소드를 오버라이딩하여 계좌정보 즉 얘금주,계좌번호,잔액을
출력하는 메소드를 정의하여라
예) 예금주:자바맨, 계좌번호:123-456, 잔액:1000원
4. 3번에서 정의한 클래스를 사용하여
아래 요구사항을 만족하도록 프로그래밍을 하여 소스코드와 결과화면 스크린 샷을
제출하시오
[요구사항]
가. 은행계좌 클래스를 사용하여 객체를 생성한다
나. 객체의 멤버(예금주,계좌번호,잔액)를 아래처럼 초기화 하여라
예금주: 자바맨
계좌번호: 123-456
잔액:10000
다. 15000원을 입금하도록 메소드를 호출하여라
라. 30000원을 출금하도록 메소드를 호출하여라
5. 구글에서 자바메일 라이브러리를 검색하여 아래 요구사항대로 그 과정을
스크린 샷으로 제출하시오.
[요구사항]
가. 프로젝트안에 lib폴더를 만들고 다운받은 라이브러리를 프로젝트에 Build Path로 추가하시오
나 .mailing패키지를 만들고 그 안에 SendMail이라는 클래스를 만드시오
다. SendMail 클래스를 완성하여 실행하고 실행 결과 화면(콘솔창)을 스크린 샷으로 제출하시오.
- 보내는 사람의 정보로 본인의 네이버 이메일 주소와 패스워드를 작성해야 하는데,
아래처럼 소스에 기술하지 않고 main 함수의 인자로 받아서 처리하시오.
String user = " 본인의 네이버 이메일 주소";
String password = "본인의 패스워드";
- 받는 사람을 “kim.silvina@gmail.com" 으로 하시오.
- 제목에 “홍길동(본인명) 메일 테스트입니다” 라고 작성하시오.
- 내용에는 “홍길동(본인명)의 메일 성공입니다.”라고 작성하시오.