1.(1) 문제 : 다음 프로그램에 대하여 다음 기능을 추가하시오. (6점)1) 그림을 지우는 기능을 추가하시오.2) 타원과 직선, 사각형 중 하나를 선택하여 그리는 라디오 버튼을 추가하시오.(사각형과 원은 클릭한 위치부터 놓은 위치를 대각선으로 하는 사각형 안에들어가는 도형을 그리며, 드래그 하는 동안 중간 결과를 보여준다.)3) 이전에 그린 것이 모두 유지되도록 수정하시오.(2) 소스코드import java.awt.*;import javax.swing.*;import java.awt.event.*;import java.io.Serializable;import java.util.ArrayList;public class Lab8_3 {public static void main(String[] args) {JFrame frame = new JFrame("Drawing Board");frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);DrawPanel tp = new DrawPanel();frame.getContentPane().add(tp);frame.pack();frame.setVisible(true);}}class DrawPanel extends JPanel {CenterPanel p;JButton b;public DrawPanel() {setLayout(new BorderLayout());b = new JButton("clear");p = new CenterPanel();p.setBackground(Color.yellow);add(p, BorderLayout.CENTER);add(b, BorderLayout.SOUTH);}private class CenterPanel extends JPanel implements MouseListener,MouseMotionListener, ActionListener, ItemListener {int rx, ry, rx2 = -1, ry2;Color back = Color.yell);radiobutton = new JRadioButton[도형.length];for (int i = 0; i < radiobutton.length; i++) {radiobutton[i] = new JRadioButton(도형[i]);buttons.add(radiobutton[i]);add(radiobutton[i]);radiobutton[i].setBackground(Color.yellow);radiobutton[i].addItemListener(this);}}public void actionPerformed(ActionEvent e) {clear();}public void itemStateChanged(ItemEvent event) {JRadioButton source = (JRadioButton) event.getSource();if (event.getStateChange() == ItemEvent.SELECTED)a = String.valueOf(source.getText());}public void mousePressed(MouseEvent e) {rx = e.getX();ry = e.getY();}public void mouseReleased(MouseEvent e) {}public void mouseEntered(MouseEvent e) {}public void mouseExited(MouseEvent e) {}public void mouseClicked(MouseEvent e) {}public void mouseDragged(MouseEvent e) {rx2 = e.getX();ry2 = e.getY();repaint();// p2 객체에 띠어진 좌표 저장}public void mouseMoved(MouseEvent e) {}public void paintComponent(Graphics g) {super.paintComponent(g);if (CLEAR) {g.setColor(back);g.fillRect(0, 0, getSize().width 하였다.(4) 고찰라디오 버튼 생성, 클리어 버튼에 삭제 기능 추가는 생각 보다 쉽게 적용 할 수 있었다. 하지만 마지막으로 3번의 경우 super.paintComponent()로 항상 초기화 되는 바람에, 그림을 그릴 때 마다 새로 초기화 되는 현상이 발생했다. 초기화를 하지 않아 보기도 했지만, 그럴 경우 드래그 할 때 그 순간 순간 도형 모양이 모두 패널 위에 남아 있는 현상이 나타났다.2.(1) 문제 : 다음과 같은 두 개의 파일(infile, TestIO.java)을 작성하고 아래 물음에 답하시오. (5점)1) 컴파일을 수행한다. 결과는 ?메인메소드에서 실행한 readfile 메소드에서 에러가 발생하며, 이는 FileNotFoundException 타입의 예외와 IOException 타입의 예외를 처리 할 수 없다는 문구가 발생한다.2) http://java.sun.com/javase/7/docs/api/index.html에 가서 FileReader 클래스의 생성자(constructor)에 대한 정의를 찾는다. 어떤 예외 상황을 발생시키는가 ? 또한 read와 close는 어떤 예외상황을 발생시키는가? (constructor detail에 보면 나와 있음)readcloseread의 정의는 위의 보는 바와 같이 “ Reads a single character, Reads characters into a portion of an array”로 나와 있으며 문자를 읽어 들이거나 배열의 성분들을 읽을 수 있는 메소드로 정의되어있다. read와 close는 IOException은 발생시킬 수 있으며, 실패하거나 인터럽트된 입출력 연산에 의해 발생한다.close의 정의는 스트림 그리고 이와 관련된 모든 시스템 리소스를 닫는다. 한번 스트림이 일단 close메소드가 호출 되면 이후에 read(),ready(),reset(),skip() 등의 메소드는 실행은IOException으로 처리 될 것이다.FileReader는 위의 나온 설명과 같이 파일을 읽어들일 때 사ile();}static void readfile() throws IOException {char[] b = new char[30];FileReader in = null; // 화일 리더 클래스는 화일을 문자로 읽는 스트림을 정의한다.in = new FileReader("infile"); // 화일 리드 클래스의 객체 생성in.read(b); // 화일스트림 in으로부터 문자들을 읽어들여 문자 배열 b에 저장한다.in.close(); // 화일스트림 in을 닫는다.for (int i = 0; i < b.length; i++)System.out.println(b[i]);}}예상했던 것과 같이 파일을 찾을 수 없기 때문에 이에 대한 예외가 발생한다.4) 3)번의 결과 프로그램에 대하여 다음과 같이 고쳐서 컴파일하고 실행해 보시오.4-1. 만약 main의 throws 선언에서 throws하는 예외 상황을 Exception으로 고치면 어떻게 되는가 ? 그 이유는 ?위 그림에서 보는 바 와 같이 IOException의 예외의 상위클래스는 Exception이다.따라서 Exception 으로 고칠 경우 마찬가지의 예외가 발생하게 된다.4-2 만약 readfile의 throws 선언에서 throws되는 예외 상황을 Exception으로 고치면 어떻게 되는가 ? 그 이유는 ?위의 이유와 마찬가지인 결과를 나타낸다.5) 3)번 결과에 대하여 프로그램 내의 in = new FileReader ("infile"); 문장을 in = new FileReader ("nofile");로 바꾸고 다시 컴파일 후 수행하시오. 어떻게 되는가 ?FileReader로 읽을 파일 명만 바뀌었을 뿐, 역시 파일을 찾을 수 없다는 예외를 나타낸다. FileReadr메소드에서 지정하는 파일명이 존재 하지 않는 한 어떤 이름으로 바꾸어도 같은 결과를 나타낼 것이다.6) 프로그램 내에서 IOException을 핸들하기 위하여, main 메쏘드 내에서 readfile()을 호출하는 부분을 try, catch문rows IOException {char[] b = new char[30];FileReader in = null; // 화일 리더 클래스는 화일을 문자로 읽는 스트림을 정의한다.in = new FileReader("infile"); // 화일 리드 클래스의 객체 생성in.read(b); // 화일스트림 in으로부터 문자들을 읽어들여 문자 배열 b에 저장한다.in.close(); // 화일스트림 in을 닫는다.for (int i = 0; i < b.length; i++)System.out.println(b[i]);}}e.getMessage()를 통하여 파일을 찾을 수 없다는 예외처리 문구를 출력하였다.7) 예외 상황을 main 메쏘드에서 처리하지 않고 readfile 메쏘드 내에서 처리하도록 try, catch문을 사용하여 3)번 프로그램을 고치시오.(컴파일하고 수행)import java.io.*;class Exa {public static void main(String[] args) throws IOException {readfile();}static void readfile() throws IOException {char[] b = new char[30];FileReader in = null; // 화일 리더 클래스는 화일을 문자로 읽는 스트림을 정의한다.try {in = new FileReader("infile"); // 화일 리드 클래스의 객체 생성in.read(b); // 화일스트림 in으로부터 문자들을 읽어들여 문자 배열 b에 저장한다.in.close(); // 화일스트림 in을 닫는다.for (int i = 0; i < b.length; i++)System.out.println(b[i]);} catch (FileNotFoundException e) {System.out.println(e.getMessage());}}}6번과 마찬가지로 e.getMessage()를 통하여 파일을 찾을 수 없다는 예외처리 문구를 출력하였다.(3) 고찰이번 과제는 예외처리겠다.
1.(1) 문제 : 체질량지수(BMI: body mass index)를 계산하여 이에 따라 비만 여부를 판별하는GUI 프로그램을 작성하라. 체질량 지수는 다음 공식에 의해 계산한다.BMI(몸무게, 키) = 몸무게 / (키 * 키)작성되는 프로그램은 몸무게(kg)와 키(m) 입력을 위한 두개의 텍스트필드와 계산버튼, 채질량지수 및 비만도평가를 보여주는 레이블을 포함한다. (텍스트필드 의미를 알려주는 레이블도 사용한다.) 버튼에는 적절한 이름을 부여하시오.비만 판정 기준은 다음과 같다.15.0미만병적인 저체중15.0이상 18.5미만저체중18.5이상 23.0미만정상23.0이상 27.5이하과체중27.5초과 40.0이하비만40.0초과병적인 비만(2) 소스코드import java.awt.*;import java.awt.event.*;import java.text.DecimalFormat;import javax.swing.*;public class BMI {public static void main(String[] args) {JFrame frame = new JFrame("BMI 계산");frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.getContentPane();frame.add(new BMICalcul());frame.pack();frame.setVisible(true);}}class BMICalcul extends JPanel { //BMICalcul 클래스를 JPanel 확장private JLabel BodyLabel1, 키Label2, OutputLabel3, OutputLabel4;private JTextField bodyMassField, 키Field, BMIField;public BMICalcul() {JButton 계산 = new JButton("BMI 계산"); //BMI 계산버튼BodyLabel1 = new JLabel("몸무게 입력(Kg) : "); // 몸무게 입력 문구키Label2 = nalListener클래스 호출add(BodyLabel1);add(bodyMassField);add(키Label2);add(키Field);add(OutputLabel3);add(BMIField);add(계산);add(OutputLabel4);// 위에서 선언한 각종 문구 또는 버튼을 추가setPreferredSize(new Dimension(150, 350));// 패널 사이즈 150,350 크기로 설정}private class CalListener implements ActionListener { //CalListener 클래스 선언, 버튼 클릭 시 실행 할 내용public void actionPerformed(ActionEvent event) {double bodyMass, 키, BMI; /DecimalFormat fmt = new DecimalFormat("0.##"); //소수점 둘째짜리 까지 표현 메소드String text = bodyMassField.getText(); //입력 받은 몸무게를 String타입으로 읽음String text1 = 키Field.getText(); //입력받은 키를 String 타입으로 읽음bodyMass = Double.parseDouble(text);키 = Double.parseDouble(text1);//String 타입으로 읽어드린 키와, 몸무게를 Double 타입으로 변환BMI = bodyMass / (키 * 키); //BMI계산BMIField.setText(fmt.format(BMI)); //BMI계산한 결과를 소수점 둘째짜리까지 표현하여 출력if (BMI < 15.0)OutputLabel4.setText("병적인 저체중");else if (BMI < 18.5)OutputLabel4.setText("저체중");else if (BMI < 23.0)OutputLabel4.setText("정상");else if (BMI < 27.5)OutputLabel4.setText("과체중");else if (BMI < 40.0)OuDouble형으로 변환하여 계산을 할 수 있었다. Main 클래스 에서는 GUI의 기본적인 내용인 타이틀, 종료, 부문을 설정하였고, JPanel을 확장한 BMICalcul 클래스를 사용하여, 프로그램을 만들기 위한 각종 Label , JTextField, JButton을 추가하고 실행 하였을지 초기 화면 창 사이즈를 결정하였다. ActionListener를 통하여 클릭 후 동작할 내용을 inner class를 활용하여 작성 할 수 있었다. BMI를 계산하는 부분은 단순 반복문 활용이라 쉽게 구현 할 수 있었으며, 문제를 해결하면서 두 가지 정도의 문제 때문에 고생하였다. 순조롭게 프로그램의 문구 출력, 버튼 누름시 작동 까지는 무난하게 구현하였으나, 계산결과의 상이, 비만도 문구 미출력의 문제점에 봉착하였으나, BMICalcul 메소드에서 add를 이용하여 계산결과를 출력하는 계산결과를 출력하는 변수 OutLabel4를 선언하지 않았던 문제였다. 두 번째로는 많은 변수에 따른 혼동으로, 키Field와 bodyMassField 변수를 혼동 하여 소스를 작성하는 바람에 예상과는 상이한 결과를 나타나게 되었다. 두 문제에 대한 고민을 제외한 나머지 부분은 쉽게 해결 할 수 있었던 문제였다.2.(1) 문제 : 강의자료 28~29페이지의 프로그램에 텍스트를 모두 지우는 버튼을 아래쪽에 추가하시오.(2) 소스코드import java.awt.*;import javax.swing.*;import java.awt.event.*;public class Lab8_2 {public static void main(String[] args){JFrame frame = new JFrame();JPanel panel = new TextAreaPanel();frame.getContentPane();frame.add(panel);frame.setTitle("텍스트 영역 데모"); //GUI 프로그램 타이틀 제목frame.setDefaultCloseOperation(JFrame.EXIT_ON;setLayout(new FlowLayout());add(scrollArea,BorderLayout.CENTER); //스크롤 버튼 추가add(btn,new FlowLayout());btn.addActionListener(new Clear()); //Clear 버튼을 누를 시 행동할 내용}private class Clear implements ActionListener // Clear 버튼을 누를 시 작동할 내용 클래스{public void actionPerformed(ActionEvent e){textArea.setText("텍스트를 입력하시오"); // 기존 문구를 setText를 이용한 호출}}}(3) 실행 스크린샷(4) 고찰이번 GUI프로그램은 기존에 있던 텍스트 입력 프로그램에 버튼을 누르면 삭제되는 프로그램을 만드는 것 이였다. 처음에 생각 한 바로 Clear버튼을 JButton 타입으로 Main 클래스 부분에 추가하였으나, 이는 Clear버튼이 Panel위를 전부 차지하며, 다른 문제로는 이미 소스코드에서 JPanel 위에 text영역이 만들어졌으므로 TextAreaPanel 부분에 Clear 버튼을 작성하였다. 이번 수행과제를 해결 하면서 클리어버튼 생성 원리는 버튼을 클릭할 경우 ActionLitener를 상속한 Clear 클래스가 호출 되면서 actionPerformed 메소드를 실행한다. actionPerformed 메소드가 실행이 되면서 새로운 textArea가 호출되므로써 기존의 내용이 지워지는 것 처럼 보이는 원리이다. 잘 생각해보면 기존의 내용을 삭제한다는 개념보다는 그 위에 일정한 문구 또는 아무것도 없는 textArea를 호출 함으로써 기존의 입력한 텍스트가 지워지는 것 처럼 보이는 원리였다.3.(1) 문제 : 생년월일을 세개의 콤보박스로 입력받아, 만으로 나이를 계산하여 보여주는 GUI 프로그램을 작성하시오. (예: 당신은 만 5살입니다.) 현재의 년월일은 다음과 같이 알아낼 수 있다.Calendar rightNow = Cal 출력frame.getContentPane();frame.add(new age()); //age클래스 호출frame.setPreferredSize(new Dimension(500, 100)); // 초기 사이즈 선언frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.pack();frame.setVisible(true);}}class age extends JPanel {private JComboBox Year = new JComboBox(); //년 선택 콤보박스private JComboBox Month = new JComboBox(); // 월 선택 콤보박스private JComboBox Day = new JComboBox(); //일 선택 콤보박스private JLabel birthYear = new JLabel("년"); // 년 문구 출력private JLabel birthMonth = new JLabel("월"); // 월 문구 출력private JLabel birthDay = new JLabel("일"); //일 문구 출력private JLabel result = new JLabel(); // 나이계산 결과 문구 출력Calendar rightNow = Calendar.getInstance();int nowyear = rightNow.get(Calendar.YEAR);int nowmonth = rightNow.get(Calendar.MONTH)+1; //0~11까지 이므로 1을 더해주어 1~12까지로 바로잡음int nowday = rightNow.get(Calendar.DAY_OF_MONTH);// 현재 년월일 을 계산하여 int 타입으로 각 변수에 저장함.public age() {for (int i = 2014; i >= 1900; i--) {Year.addItem(i);} //1900년부터 2014년까지 콤보 박스 생성add(Year); //년 콤보박스 추가add(birthYear); //년 문구
1.(1) 문제 : 1. meat, rice, milk로 이루어진 enumeration type인 Food를 정의하여, 각각의 칼로리를 출력하는 프로그램을 완성하시오. 각각의 칼로리는 enumeration class 내에서 정의된다.(3점)public class Main {public static void main(String[] args) {int total = 0;for(Food food : Food.values()) {System.out.println(food + "t" + food.getCalory());total += food.getCalory();}System.out.println ("Total Calory is "+total);}}meat 200rice 50milk 70Total Calory is 320(2) 소스코드public class New1 {public static void main(String[] args) {int total = 0;for(Food food : Food.values()) {System.out.println(food + "t" + food.getCalory());total += food.getCalory();}System.out.println ("Total Calory is "+total);}}enum Food{meat(200),rice(50),milk(70) ; //enum type 선언private int calory; //enum type 필드Food(int calory1){ //enum 타입 변수의 정보값을 새로운 필드에 assigncalory = calory1;}int getCalory() //enum 에 저장되어있는 음식 칼로리 출력 메소드{return calory;}}(3) 실행 스크린샷(4) 고찰이번 과제는 enum type을 선언하여 활용하는 것이 목표이며, 간단하지만 enum이 어떠한 구조를 가지고 있는지 알 수 있는 실습 이였다. 열거형 Food 타입의 meat, rice , milk는 인스턴스로 볼 수 있었던 기회였던 것 같다.2.(1) 문제 : HauStudent와 HauLecturer를 작성하고 CanIntro 인터페이스를 정의하여 다음 프로그램이 실행되도록 하시오.(3점)class Main {public static void main(String[] args) {CanIntro[] intro = new CanIntro[2];HauStudent s = new HauStudent("GongBoo","Kim");HauLecturer l = new HauLecturer("Joonseon","Ahn");intro[0] = s;intro[1] = l;for (CanIntro i:intro)i.introduce();}}I am GongBoo Kim.I am Prof Ahn.(2) 소스코드class New1 {public static void main(String[] args) {CanIntro[] intro = new CanIntro[2];HauStudent s = new HauStudent("GongBoo", "Kim");HauLecturer l = new HauLecturer("Joonseon", "Ahn");intro[0] = s;intro[1] = l;for (CanIntro i:intro)i.introduce();}}interface CanIntro //interface 구현{public void introduce(); // HauStudent 클래스와 HauLecturer 클래스의 공통 메소드를 //선언}class HauStudent implements CanIntro //implements 를 이용해 HauStudent의 interface 구현{String name;String First;HauStudent(String n, String f){this.name =n;this.First=f;}public void introduce() //introduce 메소드{System.out.println("I am "+name+First);}}class 기 때문이다. 자바에서 “인터페이스는 사용자 접속을 기술하는 방법으로 메소드들을 선언하고 필요한 상수들을 정의한 프로그래밍의 단위이다.” 이러한 차용한 문구를 다시 해석 해보면 상수와 구현되지 않은 메소들만을 갖고 있는 순수한 설계도라고 할 수 있다는 것이다. 처음엔 interface를 구현 하면서 잘 이해 되지 않는 부분이 많았다. 오히려 이러한 간단한 소스를 보다 보니 구지 이렇게까지 할 필요가 있나 싶었다. 하지만 아직 깊게 배우지는 않았지만, 코드의 수정, 재사용, 유지, 보수에 유리한 이유로 interface를 구현 하는 것을 알게 되었다.3.(1) 문제 : 3. 다음 Queue 인터페이스를 구현하는 클래스를 ArrayList 클래스를 확장하여 구현하고, 이를 테스트 하는 프로그램을 작성하시오.interface Queue { // first in first out을 구현함Object get();void put(Object);boolean isEmpty();}(2) 소스코드import java.util.Scanner;interface Queue { //interface 구현boolean isEmpty();void put(Object O);Object get();}class MyQueue implements Queue {private int rear = 0, front = 0;private Object arr[]; //object 타입 배열선언public static int count = 0; //static 변수 선언, 큐에 저장된 원소 개수 저장 변수public void MyQueue(int h) {arr = new Object[h]; //Object 타입의 h크기만큼의 배열 생성(큐의 크기)}public boolean isEmpty() {if (count == 0) //큐의 남은 원소를 카운트하는 변수 count가 0이면return true; //true를 리턴elsereturn false;//그렇지 않으면 false 리턴}public void pu)System.out.println("=====Queue is Empty====");return 0;}else {Object out = arr[front]; //front변수는 0으로 선언하였으므로// 제일 처음에 저장된 값을 출력 할 수 있음.System.out.println(arr[front] + " Output : " + "the Number "+ count); //큐의 원소 출력상태 출력front++; //front변수를 1증가 함으로써 다음 큐의 저장공간으로 //넘어감count--; // 남은 원소 개수 하나씩 빼줌return out;}}}public class Lab7_3 {public static void main(String args[]) {Object O; //Object 타입 변수 선언int size; // 큐의 크기 변수Scanner s = new Scanner(System.in);Scanner ss = new Scanner(System.in);System.out.println("Input Array Size");size = s.nextInt(); // 큐의 사이즈 입력System.out.println("Input number or character");MyQueue mq = new MyQueue(); //MyQueue 클래스를 참조하는 참조변수 mqmq.MyQueue(size); //MyQueue클래스를 이용해 입력 받은 size만큼 큐를 생성for (int i = 0; i < size + 1; i++) { //큐의 크기만큼 반복하여 Object //type의 변수를 입력 받으며, put() 메소드에 인자를 전달O = ss.nextLine();mq.put(O);}for (int i = 0; i < size + 1; i++) {//큐의 크기만큼 반복하여 큐에 저장된 //원소를 출력mq.get();}}}(3) 실행 스크린샷결과 출력화면 해석 : 큐의 사이즈를 입력 받고 그 후에 큐에 넣을 원소들을 입력, 큐의 사이즈만큼 꽉 찬다면 ‘Queue 타입을 직접 활용하여 true와 false를 어떻게 활용 할 수 있을지에 대한 결론도 내릴 수 있었다. 물론 쉽지 많은 않았지만, interface 구현에서 주어진 메소드들을 보며 Hint를 찾을 수 있었다. 뿐만 아니라 지금까지 배웠던 것들을 종합하여 확인 해 볼 수 있는 기회도 되었던 것 같아서 의미 있었던 내용이라 생각된다.4.(1) 문제 : 다음 가변길이 매개변수 리스트를 사용한 함수를 추가하여 다음 프로그램을 완성하시오.class Main {public static void main(String[] args) {System.out.println("maximum of 21, 23: "+max(21,23));System.out.println("maximum of 21, 23, 11: "+max(21,23,11));System.out.println("maximum of 21, 23, 11,4: "+max(21,23,11,4));System.out.println("maximum of 21, 23, 11, 4, 18: "+max(21,23,11,4, 18));}// max 함수 추가}(2) 소스코드class New1{public static void main(String[] args) {System.out.println("maximum of 21, 23: "+max(21,23));System.out.println("maximum of 21, 23, 11: "+max(21,23,11));System.out.println("maximum of 21, 23, 11,4: "+max(21,23,11,4));System.out.println("maximum of 21, 23, 11, 4, 18: "+max(21,23,11,4,18));}public static int max(int...a) // 가변길이 매개변수 리스트 선언{int temp=a[0];//배열의 첫번째 인덱스 값을 temp 에 assignfor(int i=1;ia[i]) //첫번째 인덱스 와 비교retu같다.
1.(1) 문제 : 다음 그림판 프로그램은 선을 그리는 기능을 가지고 있다. 그린 그림을 저장하거나 저장된 그림을 다시 읽어들이는 기능을 추가하시오. 텍스트필드는 파일 이름을 기입하는데 사용된다. (5점)(2) 소스코드import java.awt.*;import javax.swing.*;import java.awt.event.*;import java.util.ArrayList;import java.util.Iterator;import java.io.*;public class Lab10_1{public static void main(String[] args) {JFrame frame = new JFrame("Drawing Board");frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);DrawPanel tp = new DrawPanel();frame.getContentPane().add(tp);frame.pack();frame.setVisible(true);}}class DrawPanel extends JPanel {private static final long serialVersionUID = 1L;CenterPanel p;JButton b, b1, b2;JTextField t;ArrayList lines;JFileChooser fileChooser = new JFileChooser();public DrawPanel() {setLayout(new BorderLayout());lines = new ArrayList();JPanel bp = new JPanel();t = new JTextField(10);b = new JButton("clear");b1 = new JButton("save");b2 = new JButton("load");bp.add(b1);bp.add(t);bp.add(b2);p = new CenterPanel();p.setBackground(Color.yellow);add(b, BorderLayout.ines.add(l);}public void mouseEntered(MouseEvent e) {}public void mouseExited(MouseEvent e) {}public void mouseClicked(MouseEvent e) {}public void mouseDragged(MouseEvent e) {rx2 = e.getX();ry2 = e.getY();repaint();}public void mouseMoved(MouseEvent e) {}public void actionPerformed(ActionEvent e) {if (e.getSource() == b) {clear();} else if (e.getSource() == b1) { //b1버튼이 눌리면 save버튼try {String a = t.getText(); //text란에 입력된 글자를 읽음 (save될 이름)FileOutputStream f = new FileOutputStream(a); //a이름을 가지는 outputStream 생성ObjectOutputStream of = new ObjectOutputStream(f); //ObjectOutputStream 생성of.writeObject(lines); // 그려진 직선들의 좌표값들을 Object타입으로 writeof.close();} catch (IOException e1) { //파일 오류에 관한 예외처리System.out.println(e1.getMessage());}} else if (e.getSource() == b2) {//load버튼int retval = fileChooser.showOpenDialog(CenterPanel.this);if (retval == JFileChooser.APPROVE_OPTION) {File file = fileChooser.getSelectedFile(); //파일 선택창 선언try {FileInputStream f = new FileInputStream(file);ObjectInputStre 메소드에 save버튼과 load버튼에 관한 조건 문을 추가 하였다. 추가적으로 파일입출력 예외처리를 사용하여, 파일 입출력에 관한 에러가 발생 할 시 해당 문구를 출력하도록 하였다. 여러 직선을 그리면 여러 직선의 시작좌표와 끝 좌표가 ArrayList인 lines에 저장되는데 이 것을 Object serialization을 이용하여 파일로 저장 할 수 있었다. 저장하는 이름은 텍스트 필드에 입력된 스트링을 FileOutputStream f = new FileOutputStream() 에 스트링을 인자로 주는 방법을 통하여 구현 하였다. 파일을 불러 올 경우에는 JFilechooser를 이용하여 불러오기 창을 구현 할 수 있었으며, readObject 타입은 어느 타입이나 가능한 방법이기 때문에 ArrayList로 캐스팅을 통하여 불러 올 수 있었다. 불러온 뒤에 다시 repaint하여 불러온 그림이 다시 나타나게 된다.이번 과제를 통하여 시행착오를 많이 거쳤으며, Object serialization관한 방법을 사용하는데 꽤 많은 시간을 투자한 것 같다. 많은 시간을 투자 하였지만, 강의 자료 뿐만 아니라 많은 곳에서는 단지 저장된 인자들을 System.out.println을 통하여 출력하는 방법만 있어서 구체적으로 어떻게 이용되는지 알기 힘들었으나, 이번 기회를 통해서 어떻게 활용해야 할지 더 자세히 알게 됐던 것 같다.2.(1) 문제 : 다음은 4명의 golf score를 파일로 입력 받아 각각의 성적을 파일로 출력하는 프로그램을작성하시오. 각행은 1홀 2홀 3홀... 18홀을 나타내고, 첫 열은 기준 타수, 나머지 4열은 4명의player의 점수를 나타낸다. (5점)(2) 소스코드import java.util.Scanner;import java.io.*;public class Lab10_2 {public static void main(String[] args) throws Exception {int winscore; //승자 점수int winner = 각 열의 점수를 모두 더함for (int i = 0; i < array_int.length; i++) {int temp = array_int[0];if (temp >= array_int[i])min = array_int[i];} //각 열의 점수 합의 최소 점수를 구하는 알고리즘winscore = min; //최소 점수가 승자 점수임for (int i = 0; i < array_int.length; i++) {if (winscore == array_int[i]) {winner = i + 1;break;} elsecontinue;} //승자 점수가 몇 번째에 배열 인덱스에 들어가있는지 판단, 4명의 선수는 0~3이기 때문에 i을 더해줌outFile.println("The par score is 72");outFile.println("The score are...");for (int i = 0; i < array_int.length; i++) {if (array_int[i] == 72) {par = "(even par)";}else if (array_int[i] > 72) {par = "(" + (array_int[i] - 72) + " " + "over par)";} else if (array_int[i] < 72) {par = "(" + (72 - array_int[i]) + " " + "under par)";}outFile.println("Player" + (i + 1) + " : " + array_int[i] + " "+ par);} // 72점을 기준으로 계산하여 언더파, 오버파, 이븐파를 결정 , 문구를 메모장에 write함outFile.println("The winner is Player" + winner);outFile.close();} catch (IOException e) { //파일 입출력 예외처리System.out.println(e.getMessage());}}}(3) 실행 및 스크린샷원하는 txt파일이 생성되는 것을 볼 수 있다.(4) 고(new WindowAdapter() {public void windowClosing(WindowEvent e) {System.exit(0);}});Container contentPane = getContentPane();canvas = new JPanel();contentPane.add(canvas, "Center");JPanel p = new JPanel();addButton(p, "Start", new ActionListener() {public void actionPerformed(ActionEvent evt) {Ball b = new Ball(canvas, num_label); //볼의 개수 label을 추가로 인자로 받음b.start();}});addButton(p, "Close", new ActionListener() {public void actionPerformed(ActionEvent evt) {canvas.setVisible(false);System.exit(0);}});p.add(new JLabel("Number of Balls : ")); //볼의 개수 label문구 추가p.add(num_label); //볼의 개수 문구 추가contentPane.add(p, "South");}public void addButton(Container c, String title, ActionListener a) {JButton b = new JButton(title);c.add(b);b.addActionListener(a);}private JLabel num_label = new JLabel("0"); // 볼의 숫자 라벨 처음 0으로 표기private int num_of_balls = 0; //처음 볼의 개수 0으로 초기화private JPanel canvas;}class Ball extends Thread {public Ball(JPanel b, JLabel l) {box = b;label = l; // 생성자에 label 추가}public void
Lab13-1(1) 문제 : 데이터 그램 소켓을 사용하여 실습에서 제공한 연산 서버와 비슷하게 동작하는 서버와 클라이언트를 작성한다. 클라이언트 프로그램의 작동 형태는 텔넷을 사용할 때와 비슷하게 작동할 수 있도록 하되, 입력 계산식을 받아 서버에게 전송하고, 결과를 받아 출력하는 과정을 반복하며 Datagram 소켓을 사용한다. 클라이언트와 서버는 계산 요청과 결과를 패킷에 저장하여 주고 받는다.* Datagram 방식은 요구를 패킷별로 처리함으로써 하나의 쓰레드로 여러 클라이언트를 서비스 할 수 있다.* 데이터그램을 이용한 스트링 메시지를 주고 받는 프로그램 예제를 참조하도록 한다.c:> java clientInput expression : + 2 3-> 5Input expression : - 34 23-> 11Input expression : byeBye !c:>(2) 소스코드Serverimport java.io.*;import java.net.*;import java.util.*;public class Lab13_1 {public final static int MY_PORT = 5555;public static void main(String argv[]) throws Exception {DatagramSocket ds = null;byte buf[] = new byte[256];String op;// operator를 저장하기 위한 스트링 객체String first;// 첫번째 operand를 저장하기 위한 스트링 객체String second;// 두번째 operand를 저장하기 위한 스트링 객체StringTokenizer st;ds = new DatagramSocket(MY_PORT);// datagram 패킷의 송 수신을 위한 객체while(true){DatagramPacket packet = new DatagramPacket(buf, buf.length); // 입력 datagram 패킷 생성ds.receive(packet);// 입력 datagram 패킷 받기System.out.print("Got from client: ");ByteArrayInputStream bs = new ByteArrayInputStream (buf);BufferedReader d = new BufferedReader(new InputStreamReader(bs));String data = d.readLine();System.out.println(data);st = new StringTokenizer(data);// 스트링 토큰 객체 생성try{op = st.nextToken();// 한 토큰씩 op객체에 저장 (operator)if (op.trim().compareTo("BYE") != 0) // 종료 명령어가 아니면{first = st.nextToken();// 첫번째 operand를 저장second = st.nextToken();// 두번째 operand를 저장try {if (op.compareTo("+") == 0){int sol = Integer.parseInt(first) + Integer.parseInt(second);data = Integer.toString(sol);}else if (op.compareTo("-") == 0){int sol = Integer.parseInt(first) - Integer.parseInt(second);data = Integer.toString(sol);}else{data = "Error! (Usage : {+|-} num num)";}}catch(NumberFormatException e)// operand의 숫자가 없을 때의 예외{data = "Operands are not integer";}}}catch (NoSuchElementException e)// 해당 객체에 구성요소가 없을 때의 예외{data = "Insufficient parameters";}ByteArrayOutputStream bo = new ByteArrayOutputStream(buf.length);PrintWriter pw = new PrintWriter(bo);pw.println("받은 데이터 : "+data);pw.flush();buf = bo.toByteArray();packet.setData(buf);ds.send(packet);}}}Clientimport java.io.*;import java.net.*;public class DgramSender {public final static int MY_PORT = 6666;public final static int TO_PORT = 5555;public static void main(String argv[]) throws Exception {DatagramSocket ds = new DatagramSocket(MY_PORT);// datagram 패킷의 송 수신을 위한 datagram소켓 객체InetAddress addr = InetAddress.getByName("localhost");byte[] buf = new byte[256];String result;while(true){System.out.print("Please input a keyword : ");int n = System.in.read(buf);DatagramPacket packet = // 출력 datagram 패킷 생성new DatagramPacket(buf,n,addr,TO_PORT); // IP 주소를 갖는 기계의 port로 전송할 datagram 패킷을 생성ds.send(packet);// 출력 datagram 패킷 송신DatagramPacket packet2 = new DatagramPacket(buf,buf.length);// 입력 datagram 패킷 생성ds.receive(packet2);// 출력 datagram 패킷 받기buf = packet2.getData();// 출력 datagram 패킷으로부터 data 가져오기ByteArrayInputStream bs = new ByteArrayInputStream(buf);BufferedReader d = new BufferedReader(new InputStreamReader(bs));result = d.readLine();if(result.compareTo("받은 데이터 : BYE") == 0){System.out.println(result + " 안녕~!");break;}else{System.out.println(result);System.out.println();}}ds.close();}}(3) 실행 및 스크린샷ClientSERVER(4) 고 찰데이터 그램 소켓을 사용하여 실습에서 제공한 연산 서버와 비슷하게 동작하는 서버와 클라이언트를 작성하며, 클라이언트 프로그램의 작동 형태는 텔넷을 사용할 때와 비슷하게 작동할 수 있도록 하는 것이다. 데이터를 패킷 형태로 전송하여 서버에서 다시 그 데이터를 바탕으로 연산을 하여 돌려주는 프로그램이다. 서버에서는 서버 소켓 생성과 입출력 스트림으로 데이터를 받아들이고, 받은 데이터에 맞도록 처리 연산과정을 삽입하였다. 클라이언트 부분에는 역시 소켓생성, datagrampacket을 통하여 데이터를 해당 서버에 전송 할 수 있었다.Lab13-2(1) 문제 : 다음 프로그램이 제대로 동작하도록 Comparable 인터페이스를 Student 클래스가 구현하도록 수정하고, Generic을 사용하여 경고(warnig)이 표시되지 않도록 프로그램을 수정하시오.(2) 소스코드import java.util.Collections;import java.util.LinkedList;class Student implements Comparable { //Comparable 인터페이스 구현public String toString() {return "Student [name=" + name + ", id=" + id + "]";}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getId() {return id;}public void setId(int id) {this.id = id;}private String name;public Student(String name, int id) {this.name = name;this.id = id;}public int compareTo(Student obj) {return name.compareTo(obj.getName()); //Student 타입의 객체에 name을 호출하여 정렬}private int id;}public class Lab13_2 {public static void main(String[] args) {LinkedList students = new LinkedList();students.add(new Student("Kim", 2001022));students.add(new Student("Choe", 2001042));students.add(new Student("Park", 2001122));students.add(new Student("Kee", 2001242));Collections.sort(students);System.out.println(students);}}(3) 실행 및 스크린샷소스코드에서 이름과 학번을 추가할 때 Kim, Choe, Park, Kee 순으로 추가하였지만 컬렉션의 sort를 이용하여 이름의 알파벳 순으로 정렬하였다.(4) 고찰이번 파트는 제네릭으로 이번 학기에 처음 배우는 내용이기도 하며, 실습과제의 소스구조를 보면 생각 보다 간단하였다. Student타입에 링크드리스트에 이름과, 학번을 저장한 뒤 Comparable 을 인터페이스로 구현한 Student클래스에 compareTo 메소드만 추가하여주었다. 따라서 쉽게 이름의 알파벳순으로 정렬 할 수 있는 메소드를 구현 할 수 있었다. 제네릭에 대해 많은 걸 배울 수는 없었지만 간단하게 나마 제네릭의 개요정도는 익힐 수 있었던 것 같다.