자바프로그래밍실습 기말 프로젝트 보고서JAVA를 이용한 채팅 프로그램학번이름학교이름 전공1. 서 론저는 JAVA를 토대로 GUI를 함께 구현한 채팅 프로그램을 만들어 보았습니다. 클라이언트 클래스와 핸들러 클래스 그리고 서버 클래스 즉 3가지 클래스가 각각 따로 한 개의 JAVA 프로그램에 들어가며 실행시키면 각각의 채팅들이 1대1 채팅 또는 1대2, 1대3으로 등 다중 채팅도 가능한 프로그램입니다. 채팅을 시작하기 위해 서버 아이디와 포트 그리고 상대방 아이디를 입력하여 채팅을 주고받을 수 있습니다.2. 관련 연구자바의 배열은 고정 길이를 사용한다. 즉, 배열이 한 번 생성되면 배열의 길이를 증가하거나 감소할 수 없다. Vector는 서로 다른 타입을 가지는 참조형 데이터를 저장하는 가변 길이의 배열이다. Vector에는 기본형 데이터를 저장할 수 없다. 정수나 실수 형태 같은 기본 데이터형을 저장하기 위해서는 기본형 데이터를 Wrapper 클래스 타입의 객체로 생성해야 한다.Vector 클래스의 생성자??설명?Vector()?10개의 데이터를 저장할 수 있는 길이의 객체를 생성한다.??저장 공간이 부족한 경우 10개씩 증가한다.??Vector(int size)??size 개의 데이터를 저장할 수 있는 길이의 객체를 생성한다.??저장공간이 부족할 경우 size개씩 증가한다.??Vector(int size, int incr)??size 개의 데이터를 저장할 수 있는 길이의 객체를 생성한다.??저장 공간이 부족한 경우 incr 개씩 증가한다.자바에서는 스레드를 동기화 하기 위해서 synchronized를 제공한다. 여기서 스레드는 synchronized 메소드에 들어가기 위해 락(lock)을 얻고 메소드가 끝이 나면 락을 반환한다. 어떠한 스레드가 락을 얻어 synchronized 메소드를 사용중이면 다른 메소드는 락이 없으므로 synchronized에 접근할 수 없고, 다른 스레드가 락을 반환 할 때까지 기다려야 한다.예를 들어 설명하면 synchronized는 계속하여 루프를 돌면서 새로운 연결을 기다리게 된다.5. 프로그램의 동작과 결과프로그램을 실행시켰을 때 처음 나타나는 화면6. 결과 분석 및 토의5에서 본 바로 처음 시작 화면은 채팅을 시작할 사람의 컴퓨터 IP주소와 상대방 컴퓨터의 IP 주소, 그리고 포트번호를 묻는 것 이고 그것을 알아야 채팅을 할 수 있다는 점에서 조금 불편한 채팅 프로그램이지 않나 생각하였다. 소스코드와 클라이언트 서버는 모두 정상적이다.7. 결론평소 프로그래밍을 어렵다고 느끼는 찰나에 자바라는 프로그램 과목을 배우는데 솔직하게 이해력이 많이 받쳐주질 않았다. 그렇지만 GUI라는 파트를 배울 때 만 큼은 흥미와 재미를 가지고 코딩하고 배울 수 있는 시간 이였다. 그것을 토대로 우연히 어느 날 채팅프로그램을 만들어 보자하고 막상 만들려니 생각이 많아지고 막막하고 답답하였다. 하지만 선배님과 그리고 인터넷, 문헌 서적, 등을 찾아보며 자바라는 프로그램이 어떤 건지 알게 되었고, 일상생활에서 사용하는 음악프로그램, 게임, 등 자바가 지배하고 있었다. 처음 소스를 참조하여 만들었을 때는 실행이 되지 않았다. 온통 빨간색으로 클래스가 없다 메인 함수가 올바르지 않다 등 여러 가지 오류가 많이 나타났다. 그래서 어떻게 수정해야 하나 많은 고민을 하며 서버와 클라이언트를 다르게 해줘야 한다는 것을 알게 되었고, 이 부분이 제일 어려웠다. 또한 포트번호를 찾는 방법을 알게 되어서 뿌듯했다. 작년에 배웠던 C언어 텀 프로젝트에서 만들었던 프로젝트보다는 좀 더 상위호환이지 않았나 싶다. 이런 채팅 프로그램 뿐만 아니라 GUI를 활용한 프로그램들은 어려가지가 있다. 따라서 그런 프로그램들을 만든 개발자들의 고생들을 이번 기회에 다시금 깨닫게 되었다.8. 참고문헌[1] 황기태, 김효수, “명품 JAVA Programming”, 생능출판사[2] Java API, http://docs.oracle.com/javase/7/docs/api/[3] http://www.dsun.kr/8[4] 대구가톨릭대학교 컴퓨터;}protected DataInputStream dataIn;protected DataOutputStream dataOut;protected Thread listener;/*** 메소드 : start()* start()는 입력/출력 스트림을 연다. 버퍼링 데이터 스트림을 사용하여,* String을 주고받을 수 있는 기능을 제공한다.* 클라이언트 처리용 쓰레드인 listener를 새로 만들어 시작한다.*/public synchronized void start() {if(listener == null) {try{dataIn = new DataInputStream(new BufferedInputStream(socket.getInputStream()));dataOut = new DataOutputStream(new BufferedOutputStream(socket.getOutputStream()));listener = new Thread(this);listener.start();}catch(IOException ignored) {}}}/*** 메소드 : stop()* listener 쓰레드에 인터럽트를 걸고 dataOut 스트림을 닫는다.*/public synchronized void stop() {if(listener != null) {try{if(listener != Thread.currentThread())listener.interrupt();listener = null;dataOut.close();}catch(IOException ignored) {}}}protected static Vector handlers = new Vector();protected String myname;/*** 메소드 : run()* 쓰레드의 실행이 가장 먼저 시작되는 부분.* 만들어진 쓰레드를 ChatHandler 객체를 넣는 벡터인 handlers에 추가한다.* 이벡터는 현재 동작중인 모든 핸들러(쓰레드)를 리스트로 유지한다.*/public void run() {try{hand}}2) 클라이언트 프로그램/** ChatClient.java*/import java.awt.*;import java.awt.event.*;import java.io.*;import java.net.*;/*** class : ChatClient* Runnable 클래스와 ActionListener 클래스를 implements해서* 스레드를 구현하고 이벤트를 핸들링한다.*/public class ChatClient implements Runnable, ActionListener {private Frame frame;private Button button1;private TextArea textArea1;private Label label1;private TextField textField1;private Panel panel2;private Button button2;private Panel panel1;private TextField textField2;private Label label2;private TextField textField3;private Label label3;private TextField textField4;protected String host;protected int port;protected String id;/*** 생성자 : ChatClient()* 기본적인 화면 구성을 한다.*/public ChatClient() {frame = new Frame ();panel1 = new Panel();label1 = new Label();textField1 = new TextField();label2 = new Label();textField2 = new TextField();label3 = new Label();textField3 = new TextField();button1 = new Button();button2 = new Button();panel2 = new Panel();textArea1 = new TextArea();textFid(panel1, BorderLayout.NORTH);panel2.setLayout(new BorderLayout());panel2.add(textArea1, BorderLayout.CENTER);panel2.add(textField4, BorderLayout.SOUTH);frame.add(panel2, BorderLayout.CENTER);frame.pack();frame.setVisible (true);}//protected DataInputStream dataIn;protected DataOutputStream dataOut;protected Thread listener;/*** 메소드 :start()* 채팅 서버에 대해 Socket으로 연결.* 버퍼링 스트림인 dataIn과 dataOut를 뽑아낸다.* 스레드 listener를 가동하여 서버로부터의 메시지를 받게한다.*/public synchronized void start() throws IOException {if(listener == null) {Socket socket = new Socket(host, port);try{dataIn = new DataInputStream(new BufferedInputStream(socket.getInputStream()));dataOut = new DataOutputStream(new BufferedOutputStream(socket.getOutputStream()));dataOut.writeUTF("##name##" + id);dataOut.flush();}catch(IOException ie) {socket.close();throw ie;}listener = new Thread(this);listener.start();}}/*** 메소드 : stop()* listener 스레드의 실행중에 인터럽트를 걸고 ,* 네트워크 연결을 닫는다.*/public synchronized void stop() throws IOException {if(listener != nuF()를
1장 연습문제 알기 쉬운 알고리즘 step-by-step으로 알고리즘 완전이해목차1번부터 15번까지의 풀이+24번 풀이자세한풀이1. 다음의 괄호 안에 알맞은 단어를 채워 넣어라.(1) 주어진 순서에 따라 차례로 탐색하는 알고리즘을 ( 순차탐색) (이)라고 한다.(2) 이진탐색은(정렬된) 항목들에 대해서 (중간)에 있는 항목을 비교하여 그 결과에 따라 (같으면) 탐색을 마치고, 다르면작은 항복들이 있는 부분 또는 큰 항목들이 있는 부분을 같은 방식으로 탐색한다.(3) 동전 거스름돈 문제에서는 (액면가가 큰) 동전을 항상 서택 한다. 이는(그리디) 알고리즘의 일종이다.(4) 한붓그리기 문제를 해결하는 알고리즘의 핵심은 현재 점에서 다음으로 이동 가능한 점을 선택할 때에는 반드시 현재 점으로 돌아오는 (사이클)이 존재하여야 한다는 것이다.(5) 가짜 동전 찾기에서 동전 더미를 (반)으로 분할하여 저울에 달고, 가짜 동전이 있는 더미를 계속해서 (반)으로 나누어 저울에 단다.이는(분할정복) 알고리즘의 일종이다.2. 다음에 주어진 숫자들을 순차적으로 검색하여 85와 35를 찾는데 각각 몇 번 을 비교해야 하는가?답: 3번 6 7풀이 : 순차적 검색은 차례로 하나씩 몇 개 있는지 세어 보는 것인데 85는 6번째 있고 35는 7번째있다.3. 다음에 주어진 숫자들 중에서 가장 큰 수와 가장 작은 수를 동시에 찾으려면 최소 몇 번의 숫자 비교가 필요한가?답: 3번 6풀이:45와 66 비교 1번째 45 66 90 2066과 90 비교 2번째 45 66 90 2090과 20 비교 90이 20보다 더크기 때문에 교환 3~4번째 45 66 20 9020과 66 비교 66이 20보다 더크기 때문에 교환 5번째 45 20 66 9020과 45 비교 45가 20보다 더크기 때문에 교환 6번째 20 45 66 90정렬이 됐기 때문에 큰 수와 작은 수를 찾을 수 있다.4. 다음과 같이 숫자들이 정렬되었을 때 이진탐색으로 10을 찾으려면 몇 번의 비교를 해야 10이 숫자들 중에 없는 것을 알 수 있나?답: 2번 4풀이:15 20 25 30 40 55 65 80중간 숫자를 40으로 //10이 더 작으니 왼쪽으로15 20 25 30중간 숫자 25 // 25보다 10이 더 작으니 왼쪽으로15 20중간 숫자 20 // 더 작으니 왼쪽으로1510이 아니니 종료총 4번5. 다음과 같은 동전 시스템에 대해 19원을 거슬러 받으려 할 때 가장 작은 동전수는?답: 4번 4풀이:8+8+2+16. 다음과 같은 동전 시스템에 대해 19원을 거슬러 받으려 할 때 가장 작은 동전 수는?답:1번 2풀이:10+10(답이 16+1+1+1+1인 줄 알았지만 그리디는 최적의 수를 찾아내는 것이기 때문에2번이 맞음)7.동전 64개 중에 약간 가벼운 가짜 동전 1개가 섞여 있을 때 양팔 저울로 몇번을 달아야 가짜 동전을 찾을까?단 1.6절에서 설명한대로 문제풀이를 하시오.답: 2번1번째 저울 32 322번째 저울 16 163번째 저울 8 84번째 저울 4 45번째 저울 2 26번째 저울 1 18. 동전6개중 가짜 동전 1개가 섞여 있을 때 저울을 몇번 달아야 가짜 동전을 찾을까?(1.6x)답: 1번21번째 저울2 저울2 나머지2이렇게 두개씩 비교를 했을때 기울거나 기울지 않으면2개씩만 비교하면 된다2번째 저울1 19.동전 7개ㆍㆍ위에 문제 동일(1.6x)답: 1번 21번째 저울3 저울3 나머지12번째 저울1 저울1 나머지110. 1.1절에서 설명된 최대 숫자 찾기 문제에 대한 알고리즘과 다른 알고리즘을 생각해 보자.답:1. 순차 탐색2. 토너먼트 트리3. 선택 알고리즘12. 보간탐색이 어떤 방식의 탐색인지를 조사해보자.답:이진 탐색은 정렬된 대상을 기반하여 중앙에 위치한 데이터를 탐색한 후, 이를 기준으로 탐색 기준을 반으로 줄여나가면서 탐색을 진행함.이러한 방식은, 달라지는 탐색 대상에 관계없이 항상 중앙에 위치한 데이터를 기준으로 탐색을 시작한다.이러한 방식에서 발생할 수 있는 비효율을 줄이기 위한 보완책으로 보간탐색이 등장하였다.정렬된 데이터가 배열에 저장되어 있을 때, 선형 보간법 (linear interpolation)으로 탐색 space (배열내의 제일 작은 수에서 제일 큰 수의 집합) 내의 어느 부분쯤에 찾고자하는 숫자가 있을지를 예측하여 그 숫자와 비교한다. 그 결과에 따라서 같은 방법으로 계속 탐색한다.13. 다음의 숫자들에 대해 35를 이진탐색으로 찾는 과정을 보이라.답:10,20,25,35,45,55,60,75,80,90,95중간 숫자인 55를 기준으로 35는 더작기 때문에 왼쪽으로 이동10 20 25 35 4525를 기준으로 35는 크기때문에 오른쪽으로 이동