메뉴 바로가기 검색 및 카테고리 바로가기

한빛미디어

뇌를 자극하는 java 프로그래밍

뇌를 자극하는 java 프로그래밍 질의응답 게시판입니다.

Exercise 10-1 정답파일 및 기타

2011-01-29

|

by routern

|

poem.txt

3002

책을 볼수록 정말 잘 구성되어 있다는 생각이 듭니다.
지난번 변수 자동초기화 부분에 대해 질의 했었던 것도 답변해주신 것처럼 이전 챕터에서 설명이 되있었더군요.
그장을 주의깊게 기억했더라면 해당부분에서 따로 설명이 없었더라도 이해가 가도록 치밀하게 구성되어 있네요.
비록 다른부분이 작게 나와서 처음에 찾기 힘들었지만 개의 귀그림도 자세히 보니 다르게 나와있었고요.
책이 전반적으로 완성도가 아주 훌륭하여 감사한 마음으로 보고 있습니다.
그래서 더욱 완벽한 책이 되도록 사소한 부분이라도 잘못된 부분을 발견하면 알려드리려고 합니다.

1. Exercise 10-1 의 정답파일에 나와있는 답
=> 정답파일을 마우스로 복사하니 아래와 같이 들여쓰기가 안되네요.

====================================================================================================
import java.io.*;
class Answer {
public static void main(String args[]) {
FileReader reader = null;
try {
reader = new FileReader("poem.txt");
while (true) {
char arr[] = new char[80];
int num = reader.read(arr);
if (num < 0)
break;
System.out.print(new String(arr));
}
}
catch (FileNotFoundException fnfe) {
System.out.println("파일이 존재하지 않습니다.");
}
catch (IOException ioe) {
System.out.println("파일을 읽을 수 없습니다.");
}
finally {
try {
reader.close();
}
catch (Exception e) {
}
}
}
}
====================================================================================================

if (num < 0)
break;
System.out.print(new String(arr));

이부분을 아래와 같이 고쳐야 완전한 것 같습니다.

if (num < 0)
   break;
else if ((num >= 0) && (num < 80))
{
  String str = new String(arr);
  System.out.print(str.substring(0, num));
}
else if (num == 80)
  System.out.print(new String(arr));


첨부한 예제파일을 참조하세요.
도스창에서 실행해보면 마지막행부분이 제대로 표시가 안되서 원본파일 그대로 출력하는 것 같지만 이클립스에서 실행해보면 마지막 행이 다릅니다.

다른 확인방법으로는, 첨부예제파일에 대해 정답파일소스를 약간 수정하여, 배열로 읽은 것을 새로운 파일(가령 output.txt)로 쓰기한 후에 울트라에디터 같은 편집기에서 hexa코드보기로 보면 첨부파일과 output.txt파일이 (끝부분이) 다른것을 확인 하실 수 있을 것입니다.
굳이 hexa코드보기로 안보더라도 output.txt파일의 경우 마지막행의 마지막글자이후로 커서를 위치시킬수 있음을 확인하실 수 있을 것입니다.
마지막행을 80바이트로 읽어들이면서 num보다 큰부분부터 80바이트까지가 무시되어져야 할 것 같습니다.

2. page 394 에서
sb1 = new StringBuilder("Hello");           //크기가 11인 버퍼 생성
sb2 = new StringBuilder(100);                //크기가 21인 버퍼 생성

sb1 은 21, sb2는 100 인 버퍼가 아닌지요?
API문서를 보면 sb1의 경우는 따로 언급이 되있지 않은 것 같은데 책의 설명에 따르면 21이 되야 할 것 같고 sb2의 경우는 책의 설명처럼 argument만큼 지정하는 것으로 명시되어 있습니다.

3. Exercise 11-1 정답파일
DataFormat => DateFormat
SimpleDataFormat => SimpleDateFormat
의 오타이겠지요.

4. Exercise 13-4 정답
생성자 : ContactInfo(String phoneNo, String address)
생성자 이용프로그램 : hashtable.put("홍길동", new ContactInfo("산속 오두막", "010-0000-0000"));
=> 생성자의 파라미터 순서를 바꾸든가 프로그램에서의 파라미터 순서를 바꿔야겠지요. 연흥부, 연놀부의 경우도 마찬가지

5. p.600 여기서 잠깐
IOException과 NullPointerException 을 처리 => IOExeption과 FileNotFoundException 을 처리
인 것 같습니다.

6. p.113 프로그램의 설명 첫부분
java.lang.ArithmeticException과 e은 => java.lang.ArithmeticException과 e는
의 오타 같습니다.

7. 14장 이것만은 알고 갑시다 의 문제 3번이 문제 2번으로 나와있습니다.

8. 15장 예제 15-9 클래스 정의
클래스를 컴파일하면,
serializable class인 InvalidInputException이 long타입의 static final serialVerisonUID field를 선언하지 않았다고 warning이 발생합니다.
private static final long serialVersionUID = -3259607844036699850L;
해당값은 컴파일러가 generate한 값이고 자바 api 문서에 보면 serialVersionUID를 명시적으로 선언할 것을 strongly recommend하고 있습니다.
뒷부분을 좀더 자세히 보다보니 17장에서 이부분에 대해서 자세히 설명해주셨더군요.
책이 정말 잘 쓰여졌다는 생각이 듭니다.
다만 17장을 참조하라는 말이 있었으면 좋았을 것 같습니다. 17장전에 있는 몇몇 예제에도 같은 현상이 나오는 것 같습니다.
그리고 api문서에 보면 private을 붙일것을 권고하고 있더군요.

9. 15장 이것만은 알고 갑시다 의 문제2번
.....파일을 열때 FileNotFoundException이 그 익셉션이 발생한 다음에 프로그램의 실행흐름은 어떻게 전개될까요?
=>파일을 열때 FileNotFoundException이 발생합니다. 그 익셉션이 발생한 다음에 프로그램의 실행흐름은 어떻게 전개될까요?
문맥상 "발생합니다" 가 빠진 것 같아 보입니다.

10. 16장 이것만은 알고 갑시다 의 문제 1번의 답에서
int getTotal() {
int total = 0;
for (Record record: list)
total += record.num;
return total;
}
=> total += record.num 을 total += record.amount 로 고쳐서 총합계 데이타를 표현할 수 있어야 할 것 같습니다.
total += record.num은 총판매수량인데 예제에는 나와있지 않은 데이타입니다.

11. p.654 박스 부분
assNotFoundException => ClassNotFoundException

12. 17장 예제 9 의 DistrChart class
8번의 사항과 마찬가지로 long 타입의 static final serialVersionUID가 선언되지 않아 warning이 발생합니다.
private static final long serialVersionUID = -526071793342783960L;
을 붙여서 해결했습니다.

13. 17장 예제 10의 역직렬화하는 프로그램에서
catch (EOFException eofe)
{
   System.out.println("끝");
}
이부분은 예제 9의 아래부분 때문에 실행되지 않는 불필요한 부분이 아닌지요?
catch (EOFException e) {
}
예제 17-9와 예제 17-10을 같이 사용할 경우 17-10의 역직렬화하는 프로그램의 해당부분이 실행되는 경우도 있는지요?

14. p659 마지막 줄
...조금 다릅니다. 지
=> 지 가 뒷장과 연계되어 두번 쓰여졌습니다. 사소한 부분이지만 훌륭한 책에 옥의 티같아서 다음 증보판에서 참고하시라고 알려드립니다.

15. p.663 그림 17-10 의 마지막 그림
class GoodsInfo extends GoodsInfo
=> class BookInfo extends GoodsInfo

16. 17장 이것만은 알고갑시다 의 문제 2번
오른쪽에 있는 빈칸을 채워서 => 아래쪽에 있는 빈칸을 채워서

17. p684 예제 18-1
class MultithreadEx/ample1 => class MultithreadExample1

18. p684 중간 아래쯤 설명부분
java.lang.Runnalbe => java.lang.Runnable

19. public static void main(String args[]) 표현 방법
=> String args[] 나 String[] args 나 채택될 수 있다고 알고 있습니다. 둘다 컴파일 에러를 발생시키지 않고요.
전자는 이전의 c프로그래밍 스타일과 비견되고 자바진영프로그래머들은 후자를 더 많이 쓰는 것 같습니다.
책에서는 18장까지는 일관되게 전자의 방식으로 표기했었는데 19장부터는 후자의 방식으로 표현하고 있습니다.
그런데 21장은 전자의 방식으로 표현하고 있습니다.
어떤 방식이든 하나로 통일해서 일관되게 표현하는 것이 좋지 않을런지요?

20. p.752 예제 19-6 컴파일오류
5번째 줄: frame = new JFrame("연락처프로그램");
=> JFrame frame = new JFrame("연락처프로그램");

21. Exercise 19-5 의 답에서
paint메소드가 호출되는 경우를 아래의 경우로 설명되있습니다.
- 윈도우가 처음 뜰 때
- 그래프 그리기 버튼을 눌렀을 때 (repaint 메소드에 의해 간접적으로 호출되는 경우임)
- 윈도우(정확히 말하면 DrawingPanel 부분)의 일부 또는 전부가 가려졌다가 다시 나타날 때
- 윈도우가 아이콘화되었다가 다시 나타날 때
- 윈도우가 최대화될 때
- 윈도우가 최대화되었다가 다시 원래의 크기로 돌아올 때
- 윈도우의 크기를 크게 또는 작게 변경할 때

이중에서
- 윈도우(정확히 말하면 DrawingPanel 부분)의 일부 또는 전부가 가려졌다가 다시 나타날 때
의 경우는 호출되지 않습니다.
개념적으로는 그럴것 같은데 실제로는 메모장등으로 일부 혹은 전체를 가렸다가 노출시켜도 print문이 수행되지 않습니다.

감사합니다.
댓글 입력