기말고사 담당교수 : 단국대학교응용컴퓨터공학박경신 답은반드시답안지에기술할것. 공간이부족할경우반드시답안지몇쪽의뒤에있다고명기한후기술할것. 그외의경우의답안지뒤쪽이나연습지에기술한내용은답안으로인정안함. 답에는반드시네모를쳐서확실히표시할것. 답안지에학과, 학번, 이름외에본인의암호 (4자리숫자 ) 를기입하면성적공고시학번대신암호를 사용할것임. 1. 다음코드의실행결과를적어라 (parameter passing 에유의할것 ). (10 점 ) public static int mystery(int n, int[] numbers) { n += 100; numbers[2] ; System.out.println(n + " " + Arrays.toString(numbers)); return numbers[1] * 2; public static void mystery(int[] x, int[] y) { int[] t = x; x = y; y = t; System.out.println(Arrays.toString(x) + " " + Arrays.toString(y)); public static void mystery(int[] arr) { for (int i = 1; i < arr.length 1; i++) { if (arr[i] <= arr[i + 1]) { arr[i + 1] = i * 2; public static void main(string[] args) { int a = 4; int b = 8; int[] data = {5, 10, 15; a = mystery(b, data); System.out.println(a + " " + b + " " + Arrays.toString(data)); System.out.println(); int[] x = {1, 2, 3; int[] y = {4, 5; mystery(x, y); System.out.println(Arrays.toString(x) + " " + Arrays.toString(y)); System.out.println(); int[] data1 = {4, 1, 3; int[] data2 = {2, 1, 3, 2; int[] data3 = {1, 1, 1, 1, 8; mystery(data1); System.out.println("data1 = " + Arrays.toString(data1)); mystery(data2); System.out.println("data2 = " + Arrays.toString(data2)); mystery(data3); System.out.println("data3 = " + Arrays.toString(data3)); 1/9
108 [5, 10, 14] 20 8 [5, 10, 14] [4, 5] [1,2,3] // 자바는 pass-by-value 방식이라서, 내부에서는바뀌지만 [1, 2, 3] [4, 5] // 자바는 pass-by-value 방식이라서, 외부에는영향을주지않는다. data1 = [4, 1, 2] data2 = [2, 1, 2, 4] data3 = [1, 1, 2, 1, 6] 2. 다음은 Point 와 Bound 클래스이다. 다음질문에답하라. (40 점 ) class Point { private int x, y; public Point(int x, int y) { this.x = x; this.y = y; public int getx() { return x; public int gety() { return y; public boolean equals(point other) { if (this == other) return true; return x == other.x && y == other.y; @Override public String tostring() { return "Point[" + x + "," + y + "]"; class Bound { private int x, y, w, h; public Bound(int x, int y, int w, int h) { this.x = x; this.y = y; this.w = w; this.h = h; public static Bound findbound(point[] arr) { int xmin = arr[0].getx(); int xmax = arr[0].getx(); int ymin = arr[0].gety(); int ymax = arr[0].gety(); for (Point p : arr) { xmin = Math.min(p.getX(), xmin); xmax = Math.max(p.getX(), xmax); ymin = Math.min(p.getY(), ymin); ymax = Math.max(p.getY(), ymax); return new Bound(xmin, ymin, xmax xmin, ymax ymin); @Override public String tostring() { return "Bound[" + x + "," + y + "," + w + "," + h + "]"; 2/9
2.1 findbound(point[]) 메소드의기능을설명하고, 다음코드실행결과를적어라. (5 점 ) Point[] parray1 = { new Point(7, 5), new Point(8, 5), new Point(9, 7), new Point(2, 3) ; Point[] parray2 = { new Point(2, 3), new Point(0, 15), new Point(15, 10) ; Bound<Point> b1 = Bound.findBound(pArray1); Bound<Point> b2 = Bound.findBound(pArray2); System.out.println(b1); System.out.println(b2); Bound 클래스의 findbound 는점배열을입력받아서 (xmin, ymin) (xmax, ymax) 찾은후 Bound(xmin, ymin, xmax xmin, ymax ymin) 을돌려줌 Bound[2,3,7,4] Bound[0,3,15,12] 2.2 다음코드의실행결과를적고 == 과 equals 를자세히설명하라. (10 점 ) Point v1 = parray1[3]; Point v2 = v1; Point v3 = parray2[0]; System.out.println("v1=" + v1); System.out.println("v2=" + v2); System.out.println("v3=" + v3); System.out.println("v1 == v2 " + (v1 == v2)); System.out.println("v1 == v3 " + (v1 == v3)); System.out.println("v1 equals v2 " + v1.equals(v2)); System.out.println("v1 equals v3 " + v1.equals(v3)); Bound v4 = new Bound(1, 1, 10, 10); Bound v5 = v4; Bound v6 = new Bound(1, 1, 10, 10); System.out.println("v4=" + v4); System.out.println("v5=" + v5); System.out.println("v6=" + v6); System.out.println("v4 == v5 " + (v4 == v5)); System.out.println("v4 == v6 " + (v4 == v6)); System.out.println("v4 equals v5 " + v4.equals(v5)); System.out.println("v4 equals v6 " + v4.equals(v6)); v1=point[2,3] v2=point[2,3] v3=point[2,3] v1 == v2 true // 레퍼런스가같은 v1 == v2 v1 == v3 false // 레퍼런스가다름 v1 equals v2 true // 레퍼런스가같으므로, 객체의내용이같음 v1 equals v3 true // 객체의내용이같으므로 (Point 클래스의 equals 재정의되어있으므로 ) v4=bound[1,1,10,10] v5=bound[1,1,10,10] v6=bound[1,1,10,10] v4 == v5 true // 레퍼런스가같은 v4 == v5 v4 == v5 false // 레퍼런스가다름 v4 equals v5 true // 레퍼런스가같으므로, 객체의내용이같음 v4 equals v6 false // (Bound 클래스에 equals 재정의되어있지않으므로 ) 3/9
2.3 다음코드를설명하고, 실행결과를적어라. (5 점 ) int[] iarray = {7, 5, 8, 5, 9, 7, 2, 3; List<Integer> ilist = new ArrayList<>(); for (int v : iarray) { ilist.add(v); System.out.println(iList.toString()); // [8, 9, 2, 3] iarray 정수배열을이용하여 List<Integer> ilist 리스트에추가하고그결과를출력 [7, 5, 8, 5, 9, 7, 2, 3] 2.4 위의 ilist 에서 5 와 7 을모두지우는코드를작성하라. (5 점 ) Iterator<Integer> it = ilist.iterator(); while (it.hasnext()) { Integer v = it.next(); if (v == 5 v == 7) it.remove(); 2.5 배열에서 5 와 7 을모두지우는 int[] remove57(int[] arr) 메소드를작성하라. (10 점 ) int[] iarray = {7, 5, 8, 5, 9, 7, 2, 3; iarray = remove57(iarray); System.out.println(Arrays.toString(iArray)); // [8, 9, 2, 3] public static int[] remove57(int[] arr) { int count = 0; for (int v : arr) { if (v == 5 v == 7) continue; count++; int[] temp = new int[count]; int index = 0; for (int v : arr) { if (v == 5 v == 7) continue; temp[index++] = v; return temp; 2.6 Array 와 ArrayList 의차이점 4 개를위코드예시를들어서자세히설명하라. (5 점 ) 1. 배열 (Array) 은생성후크기가고정이고, ArrayList 는크기가동적으로바뀜. 2. 배열 (Array) 은 int, float, double 과같은 primitive type 과 Object type 을모두사용가능 (iarray, parray1 등 ), ArrayList 는 Object type 만사용이가능 (ArrayList<Integer> 로사용 ) 3. 배열 (Array) 은요소를추가할때 = 연산자를사용하고, ArrayList 는 add() 메소드를사용 4. 배열 (Array) 길이는 length 를사용하고, ArrayList 길이는 size() 메소드를사용 for (int i=0; i<iarray; i++) 등. for (int i=0; i<parray1.size(); i++) 사용 4/9
3. 다음은클래스상속관계에서다형성을보여주고있다. 아래의질문에답하라. (40 점 ) enum Mode { B, C, D interface I { void method1(int v); interface J { void method2(); abstract class A implements I, J { protected Mode mode; protected int v; protected A(int v) { this.v = v; public void method3() { System.out.println(this); public String tostring() { return "a"; class B extends A { public B(int v) { super(v); // (3.2) this.mode = Mode.B; // (3.2) public void method1(int v) { System.out.println("b1 v=" + v); public void method2() { System.out.println("b2 mode=" + mode + " v=" + v); class C extends A { public C(int v) { super(v); // (3.2) this.mode = Mode.C; // (3.2) public void method1(int v) { System.out.println("c1 v=" + v); public void method2() { System.out.println("c2 mode=" + mode + " v=" + v); public String tostring() { return "c"; 5/9
public class D extends C { protected int v = 20; public D(int v) { super(v); // (3.2) this.mode = Mode.D; // (3.2) public void method3() { System.out.println("d3 this.v=" + this.v + " super.v=" + super.v); public class Main { public static void main(string[] args) { // (3.3) //A a1 = new A(1); //A a2 = new B(); //B a3 = a2; //D a4 = new D(3); //C a4 = new D(4); // (3.4) I i1 = new I() { public void method1(int v) { System.out.println("b1 v=" + v); ; i1.method1(100); I i2 = new B(0); i2.method1(100); J j1 = new J() { public void method2() { System.out.println("J"); ; j1.method2(); J j2 = new B(200); J2.method2(); // (3.5) A[] elements = {new C(10), new B(20), new D(30); for (int i = 0; i < elements.length; i++) { System.out.println(elements[i]); elements[i].method1(i); elements[i].method2(); elements[i].method3(); 3.1 abstract method 가무엇인지간단히설명하라. 위의코드에서예를찾아서보여라. (5 점 ) 추상메소드란메소드를선언만해놓고구현내용은없는것으로, 추상메소드를상속받은클래스는반드시추상메소드를 override 해서구현해야한다. 추상메소드를상속받은클래스가추상메소드를구현하지않으면 A 처럼추상클래스가되어야한다. 위의코드에서는 method1 과 method2 가추상메소드이다. 6/9
3.2 클래스 B, C, D 생성자에서사용되는 this 와 super 의의미를자세히설명하라. (5 점 ) this 는나자신 ( 객체 ) 를가리키는레퍼런스이다. super 는부모 ( 객체 ) 를가리키는레퍼런스다. B 생성자안에 super(v) 는즉부모클래스생성자 A(int v) 호출하여, v 멤버필드를 v 로지정하겠다는뜻. this.mode = Mode.B; 는나의 mode 멤버필드를 Mode.B 로지정하겠다는뜻. 3.3 main() 의 (3.3) 에서 compile error가발생한다. 각각그이유를설명하라. (10점) //A a1 = new A(1); // cannot create A abstract class object //A a2 = new B(); // compile error; no default B constructor. //B a3 = a2; // compile error; cannot convert from A to B //D a4 = new C(3); // compile error; cannot convert from C to D //C a4 = new D(4); // Duplicate local variable a4 3.4 main() 의 (3.4) 에서는무명클래스객체를생성하고있다. 실행결과를적어라. (10점) b1 v=100 // i1의 method1을호출 b1 v=100 // i2의실제객체는 B(0) 따라서 B의 method1을호출 J // j1의 method2를호출 b2 mode=b v=200 // j2의실제객체는 B(200) 따라서 B의 method2을호출 3.5 main() 의 (3.5) 실행결과를적고이유를자세히설명하라 ( 동적바인딩주의 ). (10 점 ) c // A.toString() => C.toString() c1 v=0 // A.method1(0) => C.method1(0) c2 mode=c v=10 // A.method2() => C.method2() c // A.method3() 호출하는데그내부의 this 는 c a // A.toString() => B.toString() 없으므로부모클래스것 A.toString() 호출 b1 v=1 // A.method1(1) => B.method1(1) b2 mode=b v=20 // A.method2() => B.method2() a // A.method3() 호출하는데그내부의 this 는 b c // A.toString() => D.toString() 없으므로부모클래스것 C.toString() 호출 c1 v=2 // A.method1(2) => D.method1(2) 없으므로 C.method1(2) 호출 c2 mode=d v=30 // A.method2() => D.method2() 없으므로 C.method2() 호출그러나 mode 는 D d3 this.v=20 super.v=30 // A.method3() => 오버라이딩된 D.method3() 호출그러나 this.v 는클래스 D 에서재설정한 20 이고, super.v 는 D(30) 생성자에서지정한 30 7/9
4. 다음 BMIPanel 클래스에 EventListener 구현을 (1)outer class 를사용하는방식과 (2)inner class 를사용하는방식으로코드를수정하여라. (10 점 ) // BMIPanelActionListener (outer class) class BMIPanelActionListener implements ActionListener { BMIPanel panel = null; public BMIPanelActionListener(BMIPanel panel) { this.panel = panel; public void actionperformed(actionevent e) { panel.calculate(); // BMIPanel import java.awt.event.*; import javax.swing.*; public class BMIPanel extends JPanel implements ActionListener { JLabel label1 = new JLabel(new ImageIcon("bmi.png")); JLabel label2 = new JLabel("Age"); JLabel label3 = new JLabel("Gender"); JLabel label4 = new JLabel("Height"); JLabel label5 = new JLabel("Weight (cm)")); JLabel label6 = new JLabel("BMI")); JTextField textfield2 = new NumberTextField(20); JTextField textfield4 = new NumberTextField(20); JTextField textfield5 = new NumberTextField(20); JRadioButton radio1 = new JRadioButton("MALE", true); JRadioButton radio2 = new JRadioButton("FEMALE"); JComboBox<String> combobox1 = new JComboBox<String>(BMI.names()); BMICalculator calc = new BMICalculator(); // BMIPanelActionListener (inner class) private class ButtonActionListener implements ActionListener { public void actionperformed(actionevent e) { calculate(); public BMIPanel() { this.setlayout(null); label1.setbounds(30, 10, 240, 200); label2.setbounds(30, 230, 120, 30); label3.setbounds(30, 270, 120, 200); label4.setbounds(30, 310, 120, 200); label5.setbounds(30, 350, 120, 200); label6.setbounds(30, 450, 120, 200); textfield2.setbounds(120, 230, 160, 200); textfield4.setbounds(120, 310, 160, 200); textfield5.setbounds(120, 350, 160, 200); ButtonGroup rgroup = new ButtonGroup(); rgroup.add(radio1); rgroup.add(radio2); radio1.setbounds(120, 270, 80, 30); 8/9
radio2.setbounds(200, 270, 80, 30); button1.setbounds(30, 400, 250, 30); button1.addactionlistener(this); combobox1.setbounds(120, 450, 160, 30); this.add(label1); this.add(label2); this.add(label3); this.add(label4); this.add(label5); this.add(label6); this.add(textfield2); this.add(textfield4); this.add(textfield6); this.add(radio1); this.add(radio2); this.add(button1); this.add(combobox1); private Gender selectgender() { if (radio1.isselected()) { return Gender.MALE; return Gender.FEMALE; private void calculate() { calc.setage(integer.parseint(textfield2.gettext())); calc.setheight(double.parsedouble(textfield4.gettext())); calc.setage(double.parsedouble(textfield5.gettext())); calc.setage(selectgender()); BMI bmi = calc.getbmi(); Combobox1.setSelectedIndex(bmi.ordinal()); public void actionperformed(actionevent e) { calculate(i); // 계산 (1) outer class 를사용할시 button1.addactionlistener(new BMIPanelActionLister(this)); (2) inner class 를사용할시 button1.addactionlistener(new ButtonActionLister()); - 끝 - 9/9