연습문제이론홀수정답
1 장연습문제 1. 자바언어소스파일의확장자는.java 이고컴파일하면.class 파일이된다. 3. 자바는플랫폼에독립적이며네트워크에연결된어느클라이언트에서도실행이가능하다. 한번프로그램을작성하면어느하드웨어에서나또는어느운영체제에서나자바프로그램을실행시킬수있는것을 WORA(Write Once Run Anywhere) 라고한다. 5. JRE는실행환경으로자바가상기계를포함하고있으며자바실행환경만필요한경우에사용되며, JDK는자바컴파일러, 도구, 라이브러리등자바응용프로그램개발에필요한모든것을포함하며 JRE도 JDK에포함된다. 따라서자바응용프로그램개발을위해서는 JDK가필요하다. 7. 3, 7이잘못되었다. 하나의클래스파일에는오직하나의클래스만포함할수있다. 패지키의목적은서로관련있는클래스를묶어관리하기위함이다. 9. Add.java JAVA PROGRAMMING 2
2 장연습문제 1. 자바에서클래스를선언할때는 class 키워드를사용한다. 3. 잘못된규칙은다음과같다. 1 @, #,!, _, $ 와같은특수문자, 공백 ( 탭, 스페이스등 ) 은식별자로사용할수없다. 특수문자 (%, *, &, @, ^ 등 ), 공백 ( 탭, space 등 ) 은식별자로사용할수없으나 _, $ 는사용가능하다. 2 식별자로한글을사용할수없다. 식별자로한글이사용가능하다. 7 식별자의길이는 128자를넘을수없다. 길이제한이없다. 5. 자바의기본데이터타입과크기는다음과같다. boolean - 1 byte char - 2 bytes byte - 1 byte short - 2 bytes int - 4 bytes long - 8 bytes float - 4 bytes double - 8 bytes 7. b = b + 100; 또는 b += 100; 9. 수식의결과값과타입은다음과같다. (1) 67 + 12.8의결과값과타입은 double 타입의 79.8 (2) 'c' + 1의결과값과타입은 int 타입의 100 (3) 10/3의결과값과타입은 int 타입의 3 (4) 10.0/3의결과값과타입은 double 타입의 3.3333333333333335 (5) 10==9의결과값과타입은 boolean 타입의 false 11. 각문장을조건식으로나타내면다음과같다. (1) a는 b보다크거나같다. a >= b 또는 a > b a == b (2) a는 b보다작고 c보다크다. a < b && a > c 연습문제이론홀수정답 3
(3) a 더하기 3 은 10 과같지않다. (a + 3)!= 10 (4) a 는 10 보다크거나 b 와같다. a > 10 a == b 13. if와 else 사이에실행문장이 2개이상인경우에는 {, 으로실행문장들을둘러싸야한다. 따라서올바른코드는다음과같다. int j, k; if (i >0 && i < 10) { j *= 2; k += 3; else if (i >= 10 && i < 20) { j /= 2; else k -= 2; 15. 각 case 문에 break가없어모든case 문과 default 문까지실행되어 j 값은 -6이된다. JAVA PROGRAMMING 4
3 장연습문제 1. for 문에 ; 이있으면실행문장이없는것으로간주되어제대로실행되지않는다. 따라서다음과같이수정되어야한다. int i = 0; for (int j = 0; j < 10; j++) i = i + 1; 3. do-while 문으로바꾸면다음과같다. int j = 0, k = 0; do { System.out.println(k); j++; k += 3; while (j < 10); 5. for 문의초기문에서선언된변수는 for 문내에서만유효한지역변수이며 for 문 밖으로벗어나면사라지므로 for 문밖에있는출력문에서변수 j를사용할수없다. 변수 j는 for 문밖에서선언및초기화되어야한다. 7. continue 를 break 로바꾸면결과는 48 이다. 9. 출력결과는 5 일째 4 시까지누적된시간이 100 시간입니다. 이다. 11. int i[] = {0,1,2,3,4,5; 또는 int[] i = {0,1,2,3,4,5; 13. 배열을선언할때크기를지정할수없으므로 int myarray[10] 이잘못되었다. int myarray[] 와같이선언해야한다. 15. 그림과같은비정방형배열의선언은다음과같다. 연습문제이론홀수정답 5
float f[][] = new float[4][]; // 각행의레퍼런스배열생성 f[0] = new float[4]; // 첫째행의 4개실수배열생성 f[1] = new float[2]; // 둘째행의 2개실수배열생성 f[2] = new float[3]; // 셋째행의 3개실수배열생성 f[3] = new float[4]; // 넷째행의 4개실수배열생성 17. 프로그램을실행하면 ArrayIndexOutOfBoundsException 이발생한다. 다음과같이 try-catch 문으로예외처리를해야한다. public class ExceptionTest { public static void main(string[] args){ int[] intarray = new int[10]; try { for (int i = 0; i <= intarray.length; i++) { intarray[i] = i; System.out.println("intArray["+i+"]"+"="+intArray[i]); catch (ArrayIndexOutOfBoundsException e) { System.out.println(" 배열의범위를벗어났습니다."); JAVA PROGRAMMING 6
4 장연습문제 1. 클래스는객체를생성하기위한설계도또는틀이라고볼수있고객체는설계도또는틀로찍어낸실체이다. 따라서클래스는객체들이어떤특성을갖는다고정의만하고값은가질수없으나, 객체는각각자신만의고유한속성값을갖는다. 3. Wine 클래스는다음과같다. class Wine { private String manufacturer; private String name; private String country; private String region; private String kind; private int year; private int grade; 5. 클래스 Car는객체지향의캡슐화의특성에따라선언되었다. 따라서모든멤버필드는 private로선언되어클래스외부에선접근할수없으며, 오로지공개된멤버함수를통해서만필드의값을읽거나쓸수있다. 7. Person 클래스의 private 멤버필드를외부에서직접접근하면접근오류가발생한다. 다음과같이 Person 클래스의멤버필드는 public으로선언하면 Example 클래스는수정하지않고사용할수있다. class Person { public String name; public int age; 그러나클래스의멤버필드를외부에공개하는것은객체지향의캡슐화에맞지않으므로멤버필드를접근할수있는메소드를추가하고 Example 클래스의 main() 메소드에서이공개메소를이용하여멤버필드를접근하는것이객체지향프로그래밍에 연습문제이론홀수정답 7
적합하다. 수정된소스는다음과같다. class Person { private String name; private int age; public void setname(string s) { name = s; public String getname() { return name; public void setage(int i) { age = i; public int getage() { return age; public class Example { public static void main (String args[]) { Person aperson = new Person(); aperson.setname(" 홍길동 ); a,person.setage(17); 9. 두개의doAdd() 의인자의수와타입이모두같고메소드이름도같지만리턴타입만다르므로메소드오버로딩은실패이다. JAVA PROGRAMMING 8 11. setnum() 메소드에서메소드의인자 num과클래스 Example의 num 필드와이름이같아모호하다. 메소드 setnum() 을다음과같이수정해야한다. public void setnum(int num) { this.num = num; 13. main() 메소드의 a = b; 문장에서가비지가발생한다. 레퍼런스변수 a는원래가리키던객체대신 b가가리키던객체를가리키게되어원래객체는더이상참조
되지않아가비지가된다. 15. Sample 클래스의 getid(), setid() 메소드는 static 함수이다. static 메소드에서는오직static 멤버만접근할수있으므로 non-static 멤버인 id를 getid() 메소드에서접근하는것은오류이다. 또한 static 메소드는객체가생성되지않는상황에서도호출이가능하기때문에, 현재실행중인객체를가리키는 this 레퍼런스를사용할수없다. 17. 가비지가발생하지않는다. a와 b에 null 값을대입하여도앞서 a가참조하던객체는 c가여전히참조하고있으므로가비지가되지않는다. 연습문제이론홀수정답 9
5 장연습문제 1. 3. 자바에서상속받은클래스를다시상속받는것은가능하며상속의횟수에제한을두지않는다. 3. 클래스 A 가슈퍼클래스, 클래스 B 가서브클래스이다. 5. 3. 모든클래스의최상위슈퍼클래스는 java.lang.object 이다. 7. 클래스 B의생성자와짝을이룰기본생성자가클래스 A에없기때문에컴파일오류가발생된다. 해결방법은다음과같이클래스 A에직접기본생성자를작성해야하거나 class A { private int a; public A() { a = 0; public A(int i) { a = i; 또는클래스 B의생성자에서명시적으로클래스 A의생성자를호출하도록수정해야한다. JAVA PROGRAMMING class B extends A { private int b; public B() { super(0); b = 0; 10
9. 2. protected 멤버는다른패키지의서브클래스에서도접근가능하다. 11. 출력결과는다음과같다. false false true false true true true true 13. 4. 메소드오버라이딩은메소드를실행시에결정하는동적바인딩이발생한다. 15. 클래스 B는추상클래스 A를상속받아추상메소드 getb() 만을구현하고 geta() 는구현하지않아여전히추상메소드로남아있다. 따라서클래스 B도추상클래스로선언되어야한다. 17. 추상클래스나인터페이스의객체를생성하려고할때발생하는오류메시지이다. 연습문제이론홀수정답 11
6 장연습문제 1. 자바에서패키지란서로관련있는클래스나인터페이스의컴파일된클래스 (.class) 파일들을한곳에묶어놓은것을말한다. 3. java.lang 패키지는 import 하지않고사용할수있다. 5. import 문없이동작하려면본문에클래스의전체경로를지정해야한다. 소스는다음과같다. public class Example { public static void main(string[] args) { java.util.stringtokenizer st = new java.util.stringtokenizer(" 라디오 / 카메라 / 오디오 ", "/"); while (st.hasmoretokens()) System.out.println(st.nextToken()); 7. 결과는 false이다. == 연산자는주어진두객체의레퍼런스를단순히같은지비교하고내용에대해서는비교하지않는다. 따라서 str1과 str2는서로다른객체이므로 false이다. 내용에대해비교를하려면 String 클래스의 equals() 메소드를이용한다. JAVA PROGRAMMING 12 9. 스트링버퍼에서 "bad" 를삭제하므로출력결과는 "programming" 이다. 11. (1) int i = Integer.parseInt("20"); (2) double d = Double.parseDouble("35.9"); (3) boolean b = Boolean.parseBoolean("true"); (4) String s = Integer.toBinaryString(30); (5) String s = Integer.toHexString(50); 13. (1) b (2) c,e
7 장연습문제 1. 컬렉션 3. 4. Map 은 Collection 인터페이스를상속받지않는다. 5. Vector<String> v = new Vector<String>(); 7. Vector<Integer> v = new Vector<Integer>(); v.add(100); // auto boxing int k = v.get(0); // auto unboxing 9. 최종적으로출력되는벡터의용량은 12이다. 벡터의초기용량은 3이며루프가 4 번째돌때벡터의공간이부족하므로현재벡터의용량의 2배로용량을증가시 킨다. 그러므로용량이 6이된다. 다시7번째루프를돌때용량이 12가되며, 10 번루프를돌았을때의용량은여전이 12이다. 코드를아래와같이고쳐서실행해보면더욱분명해진다. Vector<Integer> v = new Vector<Integer>(3); for(int i=0; i<10; i++) { v.add(i); System.out.println(v.capacity()); 11. new T(); 를할수없다. 연습문제이론홀수정답 13
8 장연습문제 1. 2. 스트림은데이터처리를위하여몇개라도연결이가능하다. 3. 문자스트림클래스는문자로인식되는데이터, 즉텍스트파일만처리할수있다. 그러므로음악, 이미지등과같은바이너리파일을문자스트림으로읽어서다시문자스트림으로출력하여저장하면원래의데이터가그대로보존되지않는다. 5. File 클래스는파일삭제, 디렉터리생성등과같은중요한파일관리작업을지원한다. 7. 빈칸을채운코드는다음과같다. BufferedOutputStream bout = new BufferedOutputStream(System.out, 50); FileReader fin = new FileReader("c:\\tmp\\sample.txt"); int c; while ((c = fin.read())!= -1) { bout.write((char)c); fin.close(); bout.close(); JAVA PROGRAMMING 14
9 장연습문제 1. 자바는 AWT 패키지와스윙패키지두가지를지원한다. 3. AWT 에서지원하는컴포넌트는몇개되지않고모양이그다지예쁘지않다. 그러나스 윙은 AWT에서지원하는컴포넌트를모두지원하고추가적으로많은새로운컴포넌트를제공한다. 이들컴포넌트들은예쁘고화려하며기능적완성도가높아서개발자가응용프로그램을작성하기매우용이하다. 5. 정답은다음과같다. import javax.swing.*; import java.awt.*; public class MyFrame extends JFrame { MyFrame() { Container c = getcontentpane(); // 컨텐트팬을알아낸다. c.setbackground(color.blue); // 컨텐트팬의바탕색을파란색으로설정한다. setsize(300,300); setvisible(true); 7. 틀린보기는다음과같다. 1 배치관리자는 4개이상의여러개가있으며사용자가새로운배치관리자를만들수있다. 4 배치관리자는자신이소속된컨테이너의크기를조절할수없다. 다만컨테이너의자식컴포넌트들의크기를조절한다. 7 배치관리자는한컨테이너에오직하나만설정될수있다. 8 컨테이너가배치관리자를가지지않도록할수있다. 9. 컨텐트팬은 JFrame, JDialog 등과같이스윙의최상위컨테이너들만가지는것으로최상위컨테이너에스윙컴포넌트들이특별히부착되는전용공간또는전용컨테이너이다. 연습문제이론홀수정답 15
10 장연습문제 1. 이벤트소스란이벤트를발생시킨컴포넌트이다. 3. MyActionListener 를작성하면다음과같다. class MyActionListener implements ActionListener { public void actionperformed(actionevent e) { System.exit(0); 5. 익명클래스를이용하여다시작성하면다음과같다. JButton btn = new JButton("Hello"); btn.addactionlistener(new ActionListener() { public void actionperformed(actionevent e) { System.out.println("Click"); ; JAVA PROGRAMMING 7. 틀린부분을수정하면다음과같다. (1) ActionAdapter는존재하지않으며틀린부분을 implements ActionListener로수정하여야한다. class MyActionListener extends ActionAdapter { // implements ActionListener로수정 public void actionperformed(actionevent e) { System.out.println("Click"); (2) MouseListener를 implements하면 mousereleased(), mouseclicked(), mouseentered(), mouseexited() 를모두구현하여야한다. 그러므로틀린부분을 16
extends MouseAdapter 로수정하여야한다. class MyMouseListener implements MouseListener { // extends MouseAdapter로수정 public void mousepressed(mouseevent e) { System.out.println("Mouse Pressed"); (3) Key 이벤트가발생하면 KeyEvent 객체가생성되고메소드에인자로넘어온다. 그러므로 ActionEvent가아니라 KeyEvent로수정하여야한다. class MyKeyListener extends KeyAdapter { public void keytyped(actionevent e) { // KeyEvent로수정 System.out.println("Key Pressed"); 9. 1 ItemListener 11. <Alt>, <Tab>, <Delete>, <Shift>, <Help> 13. a 키는유니코드키이므로 keypressed(), keytyped(), keyreleased() 메소드순으로호출된다. 15. 눌러진키가 k 키인경우현재응용프로그램을종료시키는 keypressed() 메소드를작성하면다음과같다. public void keypressed(keyevent e) { if(e.getkeychar() == 'k') System.exit(0); 연습문제이론홀수정답 17
11 장연습문제 1. 2 Frame 3. "java.jpg" 를가진 JLabel 컴포넌트는다음과같이생성한다. ImageIcon image = new ImageIcon("java.jpg"); JLabel label = new JLabel(image); 5. 3 개의이미지아이콘은다음과같다. normalicon 버튼이보통상태에있을때출력되는이미지 rollovericon 버튼위에마우스가올라가면출력되는이미지 pressedicon 마우스버튼이눌러져있는동안출력되는이미지 7. JCheckBox와 JRadioButton의가장큰차이점은 JCheckBox 컴포넌트는그룹을형성하지않고개별적으로체크가능하지만, JRadioButton 컴포넌트들은여러개가모여하나의그룹을형성하고이들중오직하나만선택가능하다. 9. 2 선택상태체크박스를클릭한경우선택상태체크박스를클릭하여다시선택하면선택상태의변화가발생하지않았기때문에 Item 이벤트가발생하지않는다. JAVA PROGRAMMING 18
12 장연습문제 1. 자바에서지원하는컴포넌트를사용하여구성할수없는 UI가필요한경우로서, 대표적으로게임등매우자유로운모양의 GUI를사용하여야하는경우이다. 3. JPanel 5. AWT 컴포넌트와스윙컴포넌트가화면에그려지는과정은매우다르다. AWT 컴포넌트의그리기는 Component 클래스의 paint(), update() 등의메소드에의해지배받지만, 스윙컴포넌트의경우 JComponent에구현된 paint(), paintcomponent(), paintchildren() 등의메소드에의해지배받는다. 그러므로한컨테이너에 AWT 컴포넌트와스윙컴포넌트가존재하게되면 AWT 컴포넌트가화면에그려지지않거나이상하게그려질가능성이있다. 7. (1) 이미지를원본크기로 (10, 20) 위치에그리는코드는비교적간단하다. g.drawimage(img, 10, 20, this); (2) 패널에서상, 하, 좌, 우 10픽셀씩간격을두고그안에이미지가모두보이도록그리기위해서는시작좌표는 (10, 10) 이며, 이미지의크기는폭이 10*2만큼작게, 높이도 10*2만큼작게그려야한다. 그러므로다음과같다. g.drawimage(img, 10, 20, this.getwidth()-10*2, this.getheight()-10*2, this); 연습문제이론홀수정답 19
13 장연습문제 1. 영화보면서팝콘먹기, 전화하면서문서작성하기 3. public void run() 5. 우선순위값이높을수록스레드는높은스케쥴링우선순위를가진다. 그러므로스레드 A가먼저실행되며일정시간이지난후 JVM이다시스케쥴링을시행한다. 그러나여전히 A가우선순위가높기때문에다시실행된다. 이런식으로 A가종료할때까지계속된다. 그러고나면 B, C의우선순위는동일하므로어떤것이먼저선택될지는모른다. 만일 B가선택된다면 B가실행되며일정시간후 B의실행이중단되고 JVM이다시스케쥴링을실시한다. 여전히 B, C의우선순위가동일하므로 round-robin 전략에의해 C가선택된다. C의실행도중일정시간이지나다시스케쥴링되면 B가선택되며, B와 C는번갈아실행된다. 7. JVM이실행되는동안에스레드는두가지종류가존재한다. 데몬스레드와일반스레드이다. 가비지컬렉터는데몬스레드이며, main 스레드는일반스레드이다. 아무조건없이응용프로그램에서만들어진스레드는일반스레드이다. JVM은일반스레드가모두종료하고데몬스레드만남은경우스스로종료한다. 9. 스레드는입출력을실행하는순간 BLOCK 상태가되며다른스레드로스케쥴링된다. JAVA PROGRAMMING 20
14 장연습문제 1. 4 Separator 3. 5 툴바의핸들을마우스드래깅할수없게만드는메소드는 JToolBar.setEnabled (false) 이다. 5. JButton b = new JButton("Hello"); b.settooltiptext(" 안녕하세요 "); 7. 모달다이얼로그란다이얼로그에입력을마치지않고다른작업을할수없도록다이얼로그가키입력을독점하는것을말한다. 일반적으로파일을읽고읽은파일을처리하는응용프로그램은파일열기다이얼로그를이용하여사용자로부터읽고자하는파일을선택한다. 그러고나서응용프로그램은사용자가선택한파일을읽고읽은데이터를가지고계속작업을실행한다. 그러므로파일다이얼로그가화면에출력된상태에서사용자가파일을선택하지않고다른작업을시도하면파일을읽지않았기때문에다른작업을하는것이무의미하다. 혹은사용자가파일다이얼로그가파일을선택하는과정을생략한채다른작업을진행하도록어설프게응용프로그램을작성하여서는안된다. 그러므로파일다이얼로그는모달다이얼로그로작성되어야한다. 9. (1) JOptionPane.showInputDialog("type ID"); 연습문제이론홀수정답 21
(2) JOptionPane.showConfirmDialog(null, "Continue?", " 확인하고자합니다.", JOptionPane.YES_NO_CANCEL_OPTION); JAVA PROGRAMMING 22
15 장연습문제 1. 3 애플릿은자바가상기계의도움없이도웹브라우저만있으면실행가능하다. 3. 애플릿의생명주기는웹브라우저에의해제어된다. 5. Applet 을상속받아작성되는애플릿의경우애플릿을그리는그래픽코드는 Applet 을상속받는클래스의 paint() 메소드에두어야한다. 7. 서버컴퓨터의 HTML 파일이있는디렉터리 \bin\etc\sample\test.class 9. 애플릿응용프로그램은웹페이지에내장되어있기때문에웹페이지를접근하는원격사용자가이미인지하지못하는경우가대부분이다. 그러므로임의의웹페이지를방문하였을때인지하지못한애플릿프로그램이사용자의컴퓨터에서실행되는것은매우위험한상황에노출되는것이다. 인터넷의웹페이지가악의적인목적을가지고있을때, 애플릿이사용자몰래사용자의컴퓨터에서실행되어정보를빼가거나정보를지우는등악의적인경우가발생할수있다. 그러므로자바에서는애플릿이사용자의컴퓨터에서활동을제한하는보안정책을마련하고있다. 즉, 사용자의컴퓨터의파일시스템에접근할수없고, 설치된프로그램을실행할수없으며, USB 등연결된장치들에대한접근을제한하고, 서버외다른컴퓨터로의네트워크접근을막고있다. 연습문제이론홀수정답 23
16 장연습문제 1. 4. UDP 는 TCP 와마찬가지로 transport 계층의프로토콜이다. 3. 4. FTP, TELNET, GOPHER 등과같은프로토콜도 URL의프로토콜식별자로사용될수있다. 5. 빈칸에들어갈문장은 aurl.openstream() 이다. 7. URLConnection 클래스 9. 서버소켓은 accept() 메소드를이용하여클라이언트로부터의연결요청을기다린다. accept() 메소드는연결요청이오면새로운 Socket 객체를반환한다. JAVA PROGRAMMING 24
17 장연습문제 1. 4. JDBC 는관계형데이터베이스에대한 API 를제공한다. 3. SQL 5. 열의이름을인자로하거나또는열의인덱스를인자로하여각각 getint("id") 또는 getint(1) 를빈칸에삽입할수있다. 1. 실습문제 3. 연습문제이론홀수정답 25