원인과 해결책.


[ 다음 글들 ] [ 이어서 글올리기(답하기) ] [ 자바 묻고 답하기 ]

글쓴이 :김덕태 1998년 5월 11일 14:26:49

In Reply to: [테스트결과] PrintWriter를 사용하니 되네요 posted by 강신동 on 1998년 5월 11일 13:29:17:

1. classes.zip의 플랫폼 독립성에 대해.
classes.zip은 물론 자바 표준 패키지를 그 명세 문서에 따라 구현해 놓은
클래스 화일들입니다.
하지만, 명세 문서에 기술되어 있지 않은 다음과 같은 부분들이 포함되어
있습니다.
- 패키지 접근 범위를 갖는 클래스,
- 패키지 접근 범위 혹은 private으로 선언된 메쏘드, 필드
- 비 표준 내부 패키지 부분 (sun이라는 이름으로 시작하는 패키지등등)
- 이들을 받쳐주는 네이티브 라이브러리.


이러한 부분들을 각 플랫폼 혹은 JDK 버전에서 구현할 때,
필요에 따라 변경시켜가며 구현하면서도 충분히 명세 문서를
만족시킬 수 있습니다.
즉, 네이티브 라이브러리와 classes.zip 화일이 서로 같이 구현된
동일한 버전이 아니면 대부분 오동작할 것입니다.

따라서, AIX에 JDK를 porting하면서 그들 나름대로
네이티브 라이브러리를 수정하였을 것이고, classes.zip의
내부를 일부 수정하였을 것이므로, classes.zip만을
복사해서는 이미 설치된 네이티브 라이브러리랑 궁합이
맞지 않게 되어 오동작하게 되는 것입니다.


네이티브 라이브러리는 플랫폼 본래 플랫폼 독립적이지
않으므로 물론 복사할 수 없으니, 자바 가상머쉰을 그대로 둔채
패키지만 바꾸어친다는 것은 어려운 일이 되는 것입니다.


하지만, 그러한 문제가 생기지 않을 것으로 생각되는
클래스 화일들만 일부 떼어내어 복사해서 사용하는 것은
충분히 가능한 방법입니다.


2. AIX JDK 1.1.4의 한글 버그.
System.out은 본래 바이트스트림이므로, 이론적으로 한글을
출력하는 데 부적당한 것입니다.
그러나, 사용 편리성과 호환성을 이유로 Writer류의 클래스처럼
유니코드로부터 시스템의 디폴트 인코딩 (KSC5601)으로 변환하여
출력하도록 JDK 1.1 표준 패키지의 명세 문서에 기술되어 있습니다.
AIX JDK는 이를 따르지 않았으므로 버그입니다.
따라서, 컴파일시에도 한글이 제대로 나오지 않는 것입니다.
그러나, 저도 AIX JDK에서 정확히 어떤 과정을 거쳐
한글이 ?로 바뀌는 지는 모르겠습니다.
분명한 사실은 표준 패키지 명세 문서에 따라 디폴트
인코딩으로 변환하여 출력하지 않는 다는 것만이 확실합니다.


3. 해결책 1.
PrintWriter w = new PrintWriter(System.out, true);
로 하시면 flush()를 호출할 필요 없습니다.


4. 해결책 2. (문제 없을 확률: 95%)
선사의 JDK의 classes.zip을 풀어놓은 후,
java/io/PrintStream.class를 설치해서 사용하시면
예전과 같이 System.out을 사용하실 수 있을 것입니다.
그 클래스가 클래스 탐색 경로상에서 AIX JDK의 classes.zip보다
앞에 놓여져야 하며, 클래스 탐색 경로를 확실하게 알아내는
방법은 다음을 출력해보면 알 수 있습니다.
System.out.pritnln( System.getProperty("java.class.path"));
확인 후, CLASSPATH 환경 변수를 설정하시든지,
그것이 곤란하다면 AIX JDK classes.zip의 PrintStream.class를
교체해보십시오.
그러면, 컴파일시의 한글 메시지도 제대로 출력이 될 것입니다.





다음 글들:



이어서 글올리기(답하기)

이름:
E-Mail:
제목:
내용:
관련 URL(선택):
URL 제목(선택):
관련 이미지 URL:


[ 다음 글들 ] [ 이어서 글올리기(답하기) ] [ 자바 묻고 답하기 ]