UID warning 및 exericse19-5 및 기타
2011-02-05
|
by routern
|
UID.zip
3805
1. 체크해보니 지적하신 내용이 맞습니다. 하지만 제가 생각하기에는 이렇게 고치는 것이 더 간결하고 좋을 것 같습니다.
System.out.print(new String(arr)); -> System.out.print(new String(arr, 0, num));
String 클래스의 또 다른 생성자를 이용해서 문자 배열의 지정된 위치(0)로부터 지정된 문자수(num) 만큼의 문자를 가지고 String 배열을 만드는 방법을 사용한 것입니다.
=> 한번에 정리되는 좋은 방법이네요.
2. 말씀하신 대로 다음과 같이 고쳐야 합니다. "Hello"라는 문자열은 크기가 5이므로 거기에 16을 더해서 버퍼의 크기가 21이 되어야 합니다. 이것은 잘못된 것이므로 체크해두겠습니다.
sb1 = new StringBuilder("Hello"); //크기가 21인 버퍼 생성
sb2 = new StringBuilder(100); //크기가 100인 버퍼 생성
그런데 그 아래에 있는 행은 확인해보니 책에 이미 100이라고 되어 있습니다. 제가 가지고 있는 책이 초판본이라 그 후에 나온 책에서 다르게 바뀐 부분이 있을 가능성도 있지만, 제가 고쳐달라고 요청한 것 외에 출판사에서 임의로 내용을 고치는 경우는 없으므로 올바른 내용이 잘못된 내용으로 바뀌는 경우는 극히 드물 것 같습니다. 해당 페이지를 다시 한번 체크해주시겠습니까? 잘못되었다면 요청해서 고치도록 하겠습니다.
=>네. 9쇄발행 11월20일 로 되있는 책입니다. 다시확인했으나 알려드린대로입니다.
5. 이것은 NullPointerException이라고 쓴 내용이 맞습니다. 왜냐하면 [예제 10-3]에서 close 메서드가 발생할 수 있는익셉션은 IOException과 NullPointerException이기 때문입니다. (p.435 아래의 [여기서 잠깐] 참고) close 메서드를 호출할 때는 FileNotFoundException이 발생하지 않습니다.
=> 자세히 보니 finally에 있는 Exception을 의미한 것이고 말씀하시는 것이 맞네요. 저는 finally문 위에 있는 catch문들에 있는 변수를 생각했었습니다.
8. 12. serialVersionUID을 명시적으로 선언하지 않았을 때 warning이 발생한다고 하셨는데, 제가 책을 집필할 당시나, 지금 다시 테스트보았을 때는 warning이 발생하지 않았습니다. 자바스터디님이 사용하신 자바 컴파일러 버전, 컴파일 옵션, 이클립스로 컴파일하셨다면 어떤 방법으로 컴파일하셨는지도 알고 싶습니다.
=> warning이 발생하는 화면을 캡쳐했으니 첨부파일을 참조하세요.
참고로
/**
*
*/
//private static final long serialVersionUID = 8232176758443511378L;
위의 부분은 이클립스 컴파일러가 자동으로 생성해준 구문입니다. private...........378L;
warning을 보여드리려고 //로 다시 제가 코멘트 처리한것입니다.
자바컴파일러는 1.6.0_23 버전이고
이클립스는 아시겠지만 컴파일을 이클립스가 자동으로 하고 따로 메뉴같은데서 프로그래머가 수행하는 것이 아니라서 그냥 이클립스에서 자동컴파일 했습니다.
21. Exercise 19-5 의 답에서
paint메소드가 호출되는 경우를 아래의 경우로 설명되있습니다.
- 윈도우가 처음 뜰 때
- 그래프 그리기 버튼을 눌렀을 때 (repaint 메소드에 의해 간접적으로 호출되는 경우임)
- 윈도우(정확히 말하면 DrawingPanel 부분)의 일부 또는 전부가 가려졌다가 다시 나타날 때
- 윈도우가 아이콘화되었다가 다시 나타날 때
- 윈도우가 최대화될 때
- 윈도우가 최대화되었다가 다시 원래의 크기로 돌아올 때
- 윈도우의 크기를 크게 또는 작게 변경할 때
이중에서
- 윈도우(정확히 말하면 DrawingPanel 부분)의 일부 또는 전부가 가려졌다가 다시 나타날 때
의 경우는 호출되지 않습니다.
개념적으로는 그럴것 같은데 실제로는 메모장등으로 일부 혹은 전체를 가렸다가 노출시켜도 print문이 수행되지 않습니다.
22. P772 이미지 로드버튼을 처리하는 리스너 클래스의 설명 부분에서
ImagePanel 클래스의 setPanel 메소드를 호출합니다.
=> ImagePanel클래스의 setPath메소드를 호출합니다.
23. P772이미지 로드버튼을 처리하는 리스너 클래스에서
imagePanel.setPath(text.getText());
이부분을
imagePanel.setPath("c:\\temp\\abc.jpg");
이렇게 직접 써넣으면 제대로 로딩이 됩니다.
하지만
imagePanel.setPath("c:\temp\abc.jpg");
이렇게 써넣으면 \를 두번연속으로 써넣지 않아서 컴파일 에러가 발생합니다.
이것은 당연하다고 생각합니다.
그렇다면
프로그램 사용자가 경로를 c:\temp\abc.jpg로 입력하면(프로그램사용자입장에서는 당연) text.getText()메소드가 자동으로 \를 두번 넣어서 setPath에 넘겨주는 것이 아닐까 생각해서 디버거로 값을 확인해보니 그렇게 처리하더군요.
그런데,
imagePanel.setPath("c:\\\\temp\\\\\\abc.jpg");
이런식으로 짝수개로 escape sequence를 직접 입력하면 에러없이 컴파일되고 이미지로드버튼을 눌렀을때 올바로 실행되지만,
imagePanel.setPath("c:\\\temp\\abc.jpg");
이런식으로 어느하나라도 홀수개로 입력하면 컴파일 에러가 발생합니다.
하지만
imagePanel.setPath(text.getText());
이런식으로 프로그램에서 사용자로부터 직접 입력을 받게 컴파일하고 실행한 후에 이미지가 있는 경로를 프로그램에서 직접 입력할때는
c:\temp\abc.jpg, c:\\temp\\abc.jpg, c:\\\temp\\\\abc.jpg, c:\\\temp\\\\\\\abc.jpg
이런식으로 홀수든 짝수든 몇개의 \를 입력하든 제대로 로딩이 됩니다.
결국 text.getText()메소드는 단순히 사용자가 입력한대로 넘겨주는것이 아니라 일반 텍스트가 아닌 경로에 대한 텍스트일 경우는 알맞게 가공을 해서 넘겨주는 현상이 발생하는데 api문서에는 제가 못찾는 것인지 설명이 없는것 같습니다.
이부분에 대해 설명 부탁드립니다.
24. p774에서
플레이버튼을 처리하는 리스너 늘래스 -> 플레이버튼을 처리하는 리스너 클래스
25. p774 예제 19-13 컴파일 warning발생
플레이버튼을 처리하는 리스너 클래스의 14행,
AudioClip audioClip = Applet.newAudioClip(file.toURL());
이부분에서 file.toURL() 이 deprecated warning을 발생시킵니다.
해당메소드가 URLs에 있어서 올바르지 않은 character를 자동으로 escape하지 않는다고 합니다.
따라서 우선 toURI 메소드로 우선 URI로 바꾼후에 다시 toURL메소드를 이용하여 URI를 URL로 바꿀것을 recommend하고 있습니다.
따라서 AudioClip audioClip = Applet.newAudioClip(file.toURL()); 를
아래와 같이 바꾸든지
1)
URI uri = file.toURI();
URL url = uri.toURL();
AudioClip audioClip = Applet.newAudioClip(url);
2)
AudioClip audioClip = Applet.newAudioClip((file.toURI()).toURL());
혹은 warning을 강제로 suppress하는 아래와 같은 방법으로 해결해야 할 것 같습니다.
3)
@SuppressWarnings("deprecation")
AudioClip audioClip = Applet.newAudioClip(file.toURL());
=> 3번보다는 1,2 번으로 할 것이 recommend되는 것 같습니다.
26. 19장 이것만은 알고 갑시다 1번 문제
JTextField text1 = new JTextField(6);
JTextField text2 = new JTextField(10);
JTextField text3 = new JTextField(5);
실행 그림과 비교해보면 주소와 전화번호 텍스트필드가 너무 작습니다.
주소필드는 30정도, 전화번호필드는 3자리 국번, 4자리 지역번호를 감안하여 13 으로 늘리고 이름은 6자면 좀 많은 것 같군요.
27. P800 프로그램 설명부분
이 예제의 메시지 송신 스레드 클래스와 수신 스레드 클래스의 소스코드는 [예제 12-3]의 해당 클래스들과 동일합니다.
=> [예제 20-3]
28. P803 예제 프로그램의 37행에서
socket.close();
이부분을 설명하면서 굵은글씨로 하이라이트 하셨는데
첫글자 s를 제외하고 굵은글씨로 되있습니다.
29. 20장의 vitamin퀴즈 정답
=> 서버 프로그램에 종료 명령이 입력되기를 기다리는 스레드를 추가하면 됩니다.
으로 되있고 소스는 안나와있어 생각해봤습니다.
서버측에서 thread하나가 while(true)로 계속 system.in을 체크하다가 특정입력(예를 들면 bye)이 오면
system.exit(0)으로 종료하도록 하는 것이 맞는지요?
일단 그렇게 코드를 짜니 원하는대로 bye를 입력하면 server프로그램이 종료되는 것을 확인하였습니다만 효율적인 코드는 아닌것 같으니 모범코드를 알려주십시오.
30. 21장의 예제들에서의 characterset변환
latin1, unicode등의 변환을 위해 toUnicode, toLatin1등의 함수를 쓰셨는데,
my.ini 의 characterset부분에 euckr만 추가하면 db자체가 한글지원이 되면서 별도의 조치 없이 사용할 수 있습니다.
실무에서도 변환함수를 일일이 쓰기보다는 db자체가 한글지원이 되도록 하는 것이 편하지 않을런지요?
my.ini 에 두줄만 변경하면 된다는 것을 mysql설치 부분을 설명하시면서 해주셨으면 더 좋았을 것 같습니다.
mysql이나 connector j등의 설치 사용부분은 자세히 설명되어있어서 설치에 많은 도움이 되었습니다.
31. P885 예제에서
SwingUtilities.invokeLater(
new Runnable() {
public void run() {
text.append(str + "\n");
}
}
);
이부분이 이름없는 로컬 클래스를 이용하여 수신된 메시지를 JTextArea에 추가하고 있다고 설명이 되있는데,
어떤 부분이 어떻게 이름없는 로컬 클래스인지 잘 모르겠습니다.
컴파일한 결과물에 숫자만 붙은걸로 봐서는 이름없는 로컬클래스가 사용된것이 맞다는 것을 알겠습니다.
p628을 참고해보면 Runnable이 슈퍼클래스의 메소드이고 그것의 객체를 따로 변수에 넘기지 않고 바로 대입하는 형식으로 사용한 것 같습니다만 설명부탁드립니다.
또한 여기서 사용된 이름없는 로컬클래스를 적당한 이름을 붙여서 이름있는 클래스로 사용하는 코드는 어떻게 되는지요?
감사합니다.