Ubuntu 11.10에 Java 를 설치해 보자. 일단 설치하는 방법은 크게 보면 2가지다. 하나는 Oracle 에서 개발하고 있는 Oracle Java(Sun Java)이고, 또 하나는 Open Source Java 이다. 각각은 장단점을 갖고 있다.
1. Oracle Java 를 설치한다는 것은 항상 최신 버전을 설치한다는 것을 의미한다. 그것은 Java 를 개발하고 있는 회사의 사이트에서 다운로드를 받기 때문이다. 하지만, 이 방법은 현재 Ubuntu를 지원하고 있지 않는다. 만일 Linux Fedora 를 사용한다면 rpm 버전을 다운로드 받아서 설치하면 될 것이다. 하지만 Ubuntu 에 설치하려면 별도의 설치방법을 사용해야 한다. 그 방법은 다음 글에서 설명하도록 하겠다.
2. Open Source Java 를 설치한다는 것은 Ubuntu 에 최적화된 패키지를 설치한다는 것을 의미한다. 따라서 보다 편하게 그리고 에러없이 설치할 수 있다. 하지만 이 방법은 Oracle Java 의 최신버전을 사용하지는 않는다. 아마도 한 두 단계 하위 버전을 사용할 것이다. 이번 글에서는 이 방법을 설명하려고 한다.
이 설치방법은 일반적으로 Ubuntu 에서 패키지를 설치하는 방법과 동일하다.
1. 일단 저장소를 확인해 보자. 현재 대부분 한국에서 Ubuntu 를 사용하는 분들은 아마도 Update Server 를 Daum 으로 할 것이다. 물론 이 서버로도 업데이트 혹은 다운로드하는데 큰 문제는 없다. Daum Server 를 사용해도 된다. Terminal(Ctrl + Alt + T) 을 열어서 아래의 저장소를 추가해 보자. ppa 에 대해서는 여기를 참고해 보라. 1) sudo add-apt-repository ppa:ferramroberto/java 2) sudo add-apt-repository ppa:nilarimogard/webupd8
2. repository 가 Daum Server 이든 위에서 추가한 저장소이건 상관없이 반드시 update 하자.
sudo apt-get update
3. 설치할 패키는 다음과 같다. openjdk-7-jdk, openjdk-7-jre, openjdk-7-demo, openjdk-7-doc
4. apt-get 은 패키지종속성(dependencies)를 관리하며, 변경사항들을 목록화한다. 'y' 키를 눌러 설치를 진행하자.
5. 자~ 설치가 모두 끝났다. 간단하다. 무지 쉽다.
6. 설치가 끝나면 /usr/lib/jvm/java-7-openjdk-i386/ 에 설치될 것이다.
7. 그럼...Java 버전과 Java Compiler 를 확인해 보자.
8. 근데, 이상하다. Java Compiler 의 버전은 최신버전인데, Java 의 버전은 초기값 그대로다. 즉 업데이트가 되지 않았다는 것일까? 사실은 재 등록해줘야 한다. 그래서 alternatives list 에서 java 를 확인해보자.
sudo update-alternatives --config java
9. 예상한 대로 기본적으로 설치돼있는 6 버전으로 맞춰져 있다. 방금 설치한 7 버전의 번호를 확인한다. 필자의 머신에서는 2번이다. 2번을 입력한다.
10. 그러면 2번 즉 방금 설치한 Java 7 으로 설정될 것이다.
11. 다시 한번 Java 버전 확인하자.
12. 마지막으로 JAVA_HOME 설정하자. 굳이 PATH 는 설정할 필요가 없다. 왜냐하면 필요한 /usr/lib/java 가 설정되어 있기 때문에 PATH 는 설정할 필요는 없지만, 많은 Console 관련 패키지들은 JAVA_HOME을 참조하기 때문에 확실히 하기 위해 설정하도록 하자.
일단 제목은 거창하게 잡았다. [JDBC를 통해 Microsoft Excel File 연결하기] 그럴듯하다. 일반적으로 JDBC 프로그래밍을 하면 Oracle, MySQL 같은 RDBMS 를 가지고 한다. 당연하다. 하지만 꼭 RDBMS 의 데이터만 핸들링하란 법은 없다. JDBC 스펙에 의하면 비정형화되어 있는 파일들(csv, xls, txt) 같은 파일들도 핸들링할 수 있다고 나와있다. 그래서 이번 글에서는 일반 텍스트파일을 Microsoft Excel 파일로 변환해서 JDBC를 통해 연결하는 프로그램을 설명하려고 한다.
일단 특별한 프로그램이나 툴을 설치하지 않는다면 일반적인 Text 파일들은 직접 Java 가 핸들링할 수 없다. 그래서 할 수 없이 Excel 파일로 변환한 다음, ODBC 를 거쳐 JDBC까지 연결하도록 하자.
1. 먼저 필자는 Editplus 를 이용해서 아래의 그림과 같이 텍스트 파일을 만들었다. 앞에서부터 제품이름, 제품수량, 제품판매단가, 매입단가, 운송료이다. 현재 이 파일의 이름은 data.dat 이다.
2. 직접 JDBC가 텍스트 파일을 핸들링할 수 없기에, xls 파일로 변환하기 위해 Microsoft Excel 프로그램을 열었다.
3. 파일 열기를 하고, 이미 생성한 data.dat 파일을 선택했다.그러면 아래와 같이 [Text Import Wizard] 창이 나타난다. 먼저 [Original data type] 섹션에서 기본값 [Delimited] 가 선택돼있는 것을 확인하고 [Next] 버튼을 누른다. 미리보기를 통해 열고자 하는 파일이 보인다.
4. 두번째 스텝. [Delimiters] 섹션에 보면 기본값은 [Tab]이다. 필자가 생성한 파일은 탭으로 구분하지 않고, 컴마로 구분했기 때문에 [Comma] 를 선택했다. 그럼, 미리보기창에 보면 각각의 데이터가 Delimiter 기준으로 나눠짐을 볼 수 있다. [Next] 를 클릭하자.
5. 마지막 스텝. [Column data format] 의 기본값 [General] 을 확인하고, [Finish] 버튼을 클릭하면 변환작업이 모두 끝난다.
6. 변환작업이 모두 끝나면 아래의 그림처럼 [data.dat] 파일이 Excel 파일로 변환됐음을 확인할 수 있다.그리고 컴머로 구분된 자료들이 각각의 Excel 의 셀에 잘 위치하고 있음을 알 수 있다. 그리고 특별히 기억할 것은 지금 오픈한 파일의 이름이 Sheet 의 이름으로 들어온다는 것이다. 파일 아래의 Sheet 이름을 확인하자. 이건 매우 중요하다.
7. 이제 JDBC작업을 위해 이 data.dat 파일을 xls 파일로 변환하자. 한가지 아쉬운 점은 xlsx 즉 Excel 2007 버전 이상파일로 변환할 수 없다는 것이다. 그래서 필자는 할 수 없이 [다른 이름으로 저장]할 때 [Excel 97-2003 Workbook]으로 저장했다.
10. 이제 ODBC 로 연결하자. [제어판] 으로 들어가서 [Performance and Maintenance] 로 가자.
11. [관리도구] [Administrative Tools] 로 가자.
12. [Data Source (ODBC)] 가 보인다. 더블클릭하자.
13. [ODBC Data Source Administrator] 창이 나타난다. 여러 탭 중에 [System DSN] 탭을 선택한다. 그리고 [Add] 버튼을 클릭하여 새로운 DSN 을 추가하자.
14. [Create New Data Source] 창이 나타났다. 목록 중에서 [Driver do Microsoft Excel(*.xls)] 을 선택한다. 왜냐하면 지금 ODBC 로 연결할 파일의 확장자가 xls 즉 Excel 파일이기 때문이다. [Finish] 버튼 클릭.
15. [Finish] 버튼을 클릭하면 [ODBC Microsoft Excel Setup] 창이 나타난다. 여기서 몇가지 중요한 포인트가 있다.
Data Source Name : mydata (<-- 여러분들은 알아서 의미있는 이름을 주면 된다.) Description : (<-- 굳이 작성하지 않아도 된다.)
[Select Workbook...] 버튼을 클릭하여 Excel 파일을 선택하도록 하자.
16. [Select Workbook]창이 나타난다. 여기서 위에서 xls 파일 저장한 디렉토리에 가서 저장한 파일을 지정한다. 그리고 [OK] 버튼을 클릭하여 창을 닫자.
17. 그러면 아래와 같이 [Version] 밑에 [Workbook:] 이 들어오고 방금 선택한 파일의 경로가 나온다. [OK] 버튼을 클릭하여 창을 닫자.
18. 아래 그림과 같이 [mydata] 라는 이름의 Data Source Name 이 완성됐다. [OK] 버튼을 클리하여 ODBC 관리자 창을 닫자.
이 코드에서 중요한 부분은 1) JDBC Driver 가 JDBC-ODBC Bridge Driver 라는 점. 2) JDBC url 은 jdbc:odbc:Data Source Name 이라는 점 3) Select 할 때 테이블의 이름은 Excel 의 Sheet 이름이며, Sheet 의 이름을 갖고 올 때 반드시 [Sheet Name$]로 해야한다는 점 4) Excel 파일의 각 셀에 저장한 값을 갖고 올 때 데이타타입별로 갖고 올 수 있다는 점. 즉 갖고 올 데이터가 정수이면 비록 텍스트파일에 저장돼있을 때 스트링이었다 하더라도 정수로 갖고 올 수 있다는 점이다.
20. 결과는 아래와 같다. 성공적으로 데이터를 갖고 온 것임을 알 수 있다. 이로써, 텍스트 파일이나 csv 혹은 xls 파일같은 비정형 데이터도 JDBC 에서 처리할 수 있다는 것을 확인했다. 재밌다. 여기서 한 가지 주의할 점은 Excel 파일의 데이터를 갖고 올 때 첫 행 글이 들어오지 않을 것이다. 이것은 첫 행은 헤더로 보기 때문이다. 그래서 Excel 파일에서는 첫 행에 반드시 제목을 주어야 한다. 잊지 말자.
컴퓨터는 인간과 달리 정수 5와 실수 5.0을 다른 것으로 취급한다. 인간은 자료에 대한 형태를 자동으로 판단하기 때문에, 문제없이 처리하지만, 컴퓨터 즉 기계는 그렇지 않다. 이번 글에서는 컴퓨터에서 데이터를 저장할 때 정수방식으로 저장하는 것과 실수방식으로 데이터를 저장하는 방식을 알아보고, 그렇기 때문에 데이타타입이 왜 필요한지에 대해 고민해보자.
정수 5를 메모리에 저장할 때는 아래와 같다.
정수 : 5
변환 : 00000000 00000000 00000000 00000101(2)
정수는 단순 2진법으로 변환해서 저장한다. 십진수 5를 컴퓨터는 2진화해서 즉 1과 0으로 변환해서 저장하게 된다. 그래서 16진수 hexa code 로 변환하면 정수 5가 실제로 변수에 저장되는 값은 00000005(16)이 되는 것이다.
1. 부호부 : 0 (양수) 2. 지수부 : 129 ( 2승(위에서 정규화부분에서 2의 2승이기 때문) + 127) 3. 가수부 : 01 (위의 정규화부분에 있는 1.01 중에서 소수점 이하의 수만 사용)
그런데, 대부분의 프로그래밍 언어에서는 실수를 float(4Byte) 와 double(8Byte) 두가지로 나눠서 사용하고 있다. 각각 어떻게 저장하는지 살펴보자. 1. float type(32bit) --> 부호부(1bit) + 지수부(8bit) + 가수부(23bit) 2. double type(64bit) --> 부호부(1bit) + 지수부(11bit) + 가수부(52bit)
그래서 실제로 float 변수에 저장하는 5.0은 40 A0 00 00 으로 저장한다. 그렇다면 컴퓨터는 같은 실수인 5.0을 저장할 때 float 와 double을 같이 인식할까? 정답은 당연히 아니다. 왜냐하면 위의 float 와 double 의 예를 들었듯이 각각 부호부는 같지만, 지수부의 사이즈가 다르고 가수부의 사이즈가 다르다. 이 부분이 다르면 결국 16진수로 변환될때 값도 다르고 사이즈가 다르다. 그렇기 때문에 같은 실수 5.0이라도 float 로 저장할 때와 double 로 저장할 때의 값이 달라지는 것이다. 프로그래밍에서는 같은 실수라도 그래서 정확한 데이타 타입을 사용해야 하는 이유가 바로 이것이다.
Java JDK 속에는 javadoc.exe 라는 Java API 문서 생성기가 들어있다. 이 유틸리티를 이용하면 HTML 형식의 문서를 쉽게 작성할 수 있다. 더구나 Eclipse 에 내장돼있기 때문에 Command Line 명령어를 입력하지 않고서도 편하게 API 문서를 작성할 수 있다.
참고> http://www.javaexpert.co.kr/19 , http://www.javaexpert.co.kr/20
반면, Doxygen 이라는 툴은 Java 뿐만 아니라, 다른 언어 즉 C 나 C++, 파이썬, PHP 용 API 문서를 생성시켜준다. 문론 HTML 형식으로 말이다. 자 이번 칼럼에서는 Doxygen 을 이용해서 편하게 Java API 문서를 작성해 보자.
현재 최신 버전은 2008년 12월 27일에 Release 된 1.5.8 이다. 해당 플랫폼별로 다운 받으면 된다. 여기서는 Windows 버전으로 설명하겠다. [doxygen-1.5.8-setup.exe (7.2M)] 를 ftp 이든 http 이든 링크를 클릭하여 다운받자.
다운로드받은 파일 [doxygen-1.5.8-setup.exe] 를 더블클릭하여 설치하자.
설치자체는 어렵지 않다. 계속 다음버튼을 클릭만 하면 된다. 자 이제 실행해보자.
시작 -> 모든프로그램 -> doxygen -> doxywizard 를 클릭하면 아래의 그림처럼 실행된다.
[Doxygen GUI frontend] 창에 있는 Step 순서대로 설정하면 Doxygen 문서가 생성된다. 먼저 Step 1 부터 보자. Step1. doxygen 이 실행할 작업 디렉토리를 지정한다. [Select...] 버튼을 클릭하자.
필자는 C:\JavaRoom 디렉토리를 선택했다. [확인] 버튼을 클릭하자.
Step2. 문서를 생성하기 위한 각종 옵션을 설정한다. 기본은 [Wizard] 탭이 선택돼 있다. 계층이 Project, Mode, Output, Diagrams 로 돼있다.
기본적인 프로젝트에 대한 정보를 설정하는 곳이다. 각 필드에 들어가는 내용은 아래와 같다. Project name : 프로젝트의 이름 Project version or id : 프로젝트 문서 버전 Source code directory : 소스 코드 문서 자동 빌드 작업을 할 디렉토리 경로를 지정 Scan recursively : Source code directory 의 하위 경로까지 소스 코드 문서 자동 빌드 작업을 할 것이지의 여부, 체크하면 하위 디렉토리까지 포함한다. Destination directory : 생성된 소스 코드 문서가 저장될 디렉토리
필자는 아래의 그림과 같이 간단하게 설정했다. [Next] 버튼을 클릭하자.
Mode 에서는 대상 소스 코드의 언어와 문서 생성 모드를 결정한다.
Documented entities only 를 선택하면 코드에서 문서화태그가 있는 부분만 문서화된다.
All entities 를 체크하면 코드의 모든 부분을 문서화 한다. Doxygen 주석이 없는 경우 설명이 없이 네임스페이스, 클래스, 메소드 등만 나타난다. 특별한 이유가 없다면 All entities 를 선택한다. Include cross-referenced source code in the output 을 체크하면 실제로는 SOURCE_BROWSER 옵션이 설정된다. 이 옵션이 설정되면 문서화된 코드의 entity 들이 실제 코드 어디에 해당하는지 그 링크를 보여준다. 문서가 좀 지저분해지는 경향이 있지만 문서를 보면서 해당 소스코드를 바로 참고할 필요가 있다면 선택한다.
[Select programming language to optimize the results for] 당근 Java 를 선택한다.
필자가 선택한 설정은 아래 그림과 같다.
[Next] 버튼을 클릭하자.
Output 에서는 출력될 format 을 지정한다. HTML : HTML 형태로 출력할지의 여부 plain HTML : 단순한 HTML 형태로 출력 with frames and a navigation tree : Navigation Tree 와 Frame 으로 출력 prepare for compressed HTML(.chm) : Windows Help 파일 제작을 위한 파일 생성 with search function (require PHP enabled web server) : function search 기능 포함 여부 LaTeX : LaTeX 형태로 출력할 지의 여부, 수학 기호등을 깔끔하게 표현할 경우 체크한다. as intermediate format for hyperlinked PDF : hyperlink 로 연결된 PDF 문서 생성을 위한 LaTeX로 출력 as intermediate format for PDF : PDF 문서 생성을 위한 LaTeX 로 출력 as intermediate format for PostScript : PostScript 생성을 위한 LaTeX 로 출력 Man pages : Unix 의 man 명령 형태의 출력 여부 Rich Text Format(RTF) : Rich Text 형태의 출력 여부 XML : XML 형태의 출력 여부
필자는 LaTeX 에서 [as intermediate format for PostScript] 를 선택했다. [Next] 버튼을 클릭한다.
마지막으로 Diagram 이다. 이 곳은 생성할 Diagram 의 표시 형태를 결정한다. No diagrams : Diagram 을 생성하지 않는다. Use built-in class diagram generator : Doxygen 에 내장된 class diagram generator 로 diagram 을 생성 Use dot tool from the GraphViz package to generate : GraphViz 를 이용한 diagram 생성(이 기능은 이미 GraphViz 가 설치돼 있어야 사용할 수 있다.)
아래의 그림처럼 필자는 GraphViz 를 사용하며 아래의 모든 체크박스를 선택했다.
설치는 간단하다. 다운로드 받은 파일을 더블클릭하여 실행하고 [Next]버튼을 클릭하기만 하면 된다.
자 다시, Doxygen 창으로 돌아가서, [Expert] 탭을 클릭한다.
해당 글자위에 마우스를 올려놓으면 왼쪽 하단프레임에 설명이 나타난다.
[Project] 계층에서는 아래의 사항을 체크했다. ALWAYS_DETAIL_SEC : 항상 상세정보를 보여준다. REPEAT_BRIEF 가 같이 켜지면 개략 정보가 없어도 상세정보 영역을 생성한다. INLINE_INHERITED_MEMB : 상속된 모든 멤버들도 보여준다. 단, 생성자와 파괴자 제외. JAVADOC_AUTOBRIEF : QT스타일 대신 자바스타일의 주석을 BRIEF 로 해석한다. C++ 코드의 경우 체크하는 것이 좋으며, 이 옵션이 꺼지면 BRIEF 가 멀티라인으로 나타나지 않는다.
[Build] 계층에서는 아래의 사항을 체크했다. EXTRACT_ALL : 클래스의 모든 멤버를 문서화한다. 단 EXTRACT_PRIVATE 과 EXTRACT_STATIC 이 체크되지 않는다면 주석없는 멤버는 보이지 않는다.
[Dot] 계층에서는 아래의 사항을 체크했다.
먼저, DOT_PATH설정을 하자. 보통 GrahphViz 설치된 경로에서 bin 디렉토리를 지정하면 된다. 그리고 나서, 반드시 HAVA_DOT 을 체크해야 한다. CLASS_DIAGRAMS : 클래스의 상속구조를 보여준다. GRAPHICAL_HIERARCHY : 그래프를 text가 아닌 그래픽 버전으로 보여준다. 당근 필수 체크 UML_LOOK : UML 형식으로 보여준다. 이걸 체크하면 컴파일 시간과 용량이 무지하게 증가하므로 신중히 선택할 것. INCLUDE_GRAPH : 파일들의 include 구조를 그래프로 보여준다. 매우 유용.
이제 [Run] 탭을 클릭하자.
실행하기 위해 [Run doxygen] 버튼을 클릭한다.
잠시후, 아래의 그림처럼 결과가 나타나게 된다.
그럼, [Show HTML output] 버튼을 클릭하여 브라우저를 통해 API 문서를 확인해 보자.
Java 에서의 압축 파일은 JAR(Java Archive) 파일이다. 여러 파일들을 하나의 JAR 파일로 압축하기 위해 사용하는 명령어에 대해 알아보자. JAR 파일은 보안을 위한 옵션적인 signature 파일들, manifest 파일 즉, JAR content describer, 을 포함하는 ZIP 아카이브로 구성돼 있다. syntax 는 아래와 같다.
자바는 원시 소스를 컴파일해서 bytecode 로 만든다음, JVM 을 통해 bytecode 를 machine code 로 변경해서 실행하게 된다. bytecode, 기계어도 인간의 언어도 아닌 중간 언어, 를 interpretation 하기 위해 java.exe 명령어를 사용하게 된다.
java [-options] class [arguments...] 이것은 일반적으로 Java 클래스를 인터프리테이션하기 위해 실행하는 명령어이다. 또 있다.
java [-options] -jar jarfile [arguments...]
이것은 JAR 파일을 실행하기 위한 사용법이다.
java HelloWorld
이건, 자바를 첫 시간 수업들은 사람은 다 안다. 뭐! 나를 무시하자는 건가? 하지만, 이게 가장 많이 사용하는, bytecode 화 돼있는 클래스를 머쉰 코드로 변경하라는 것 아닌가?
이 명령을 통해 JRE 를 시작하고, HelloWorld 클래스를 로딩하며, 그리고 그 클래스의 main() 을 실행하게 된다.
java -cp .:./dir/Classes HelloWorld
컴파일 명령과 같이 -cp 는 곧 -classpath 이다. 실행시 CLASSPATH 를 검색하는데, 별도로 환경설정이 돼있던, 돼있지 않던 상관없이 -cp 뒤의 경로의 클래스를 호출하게 된다. 여기서 중요한 점은, 반드시 경로의 시작이다. Linux/Unix 의 path 구분자는 ':' 이기 때문에, 현재(.) 그리고 구분자(:)를 이어서 '.:' 이렇게 써야 한다. 반면, Windows 는 path 구분자가 ';' 이기 때문에, 현재(.) 그리고 구분자(;)를 이어서 '.;' 이렇게 써야 한다.
HelloWorld 클래스는 /dir/Classes 의 Test 클래스를 필요로 한다. 그래서 현재 경로의 HelloWorld.class와 /dir/Classes 의 Test.class 모두 필요한 거다. 두개의 경로를 다 이어줘야 성공적으로 실행된다.
java -ea HelloWorld
이 명령어는 Java 의 Assertion 가 가능하게 하는 옵션이다. -enableassertions 라고 해도 된다. 기본적으로 Java 는 assertion 옵션이 disable 이기 때문에 별도로 -ea 즉, 가능해야 assert 처리를 할 수 있다.
java -version
이 옵션은 Java Interpreter, JRE 그리고 Virtual Machine 의 버전을 출력하게 한다.
요새는 얼마나 좋은 편집기가 많은지...Eclipse 나 NetBeans 같은 무료로 사용할 수 있는 자바 개발툴도 있고, 상용인 JBuilder 같은 툴들도 있다. 하지만, 가끔 커맨드라인에서 컴파일하고 실행하고 싶지 않은가? 여기 몇가지 커맨드라인 명령어들을 소개하고자 한다. 이 글에서는 일단 컴파일 옵션부터 살펴보자.
당연히 여러분은 javac.exe 에 대한 PATH 를 설정했을 것이다. 컴파일하려는 파일이 있는 디렉토리로 이동하자.
javac HelloWorld.java
너무 쉽다고? 다 안다고? 맞다 이건 누구나 다 안다. 결과는 아래의 그림처럼 HelloWorld.class 파일을 생성한다.
javac -cp ./dir/Classes/ HelloWorld.java
-cp 옵션은 -classpath 와 같다. 컴파일때 CLASSPATH 설정을 참조하거나 옵션을 이용해서 경로를 참조한다. 위의 그림의 소스를 보니 Test 클래스를 참조하고 있다. Test class의 소스를 보자.
그런데, Test.class 의 위치는 HelloWorld.java 가 있는 디렉토리에 없다. 다른 디렉토리에 있는 것이다. 현재 디렉터리 아래 dir 디렉토리 아래 Classes 디렉토리에 존재한다. 그래서 HelloWorld.java 를 컴파일할 때 참조할 클래스가 있는 디렉토리를 지정해야 한다.
이렇게 컴파일때 참조할 클래스가 있는 디렉토리의 경로를 지정하면 된다. -classpath 옵션과 동일하다.
javac -d ./dir/libs HelloWorld.java
이 경우는 HelloWorld.java 파일을 컴파일 할 때 현재 디렉토리에 class 파일을 생성하는 것이 아니라, -d 옵션 다음에 기술돼 있는 디렉토리에 클래스 파일을 생성하는 것이다. 이 경우 Linux 경우에는 이미 그 디렉토리가 존재해야 한다. 하지만, Windows 에서는 컴파일시에 디렉토리가 생성된다. 여하튼, HelloWorld.java 를 컴파일해서 생성되는 HelloWorld.class 는 현재디렉토리 아래 dir 디렉토리 아래 libs 디렉토리에 생성되는 것이다.
javac -source 1.4 HelloWorld.java
-source 옵션은 받아들이는 원시 코드의 버젼을 지정한다. -source 뒤에는 버전을 지정하게 되는데, 1.3, 1.4, 1.5(또는 5)를 지정할 수 있다. 아래 그림을 보자. printf() 는 1.5 버전 즉 Tiger 버전에서부터 지원하는 출력메소드이다. 이 코드를 1.4 버전으로 지정하면 어떻게 될까?
아래의 그림과 같이 컴파일에러가 발생한다. 이유는 -source 로 버전을 1.4로 지정했기 때문이다.
javac -version
이 옵션은 자바 컴파일러의 버전을 출력한다.
javac -help
마지막으로 help 옵션이다. 위에 기술하지 않은 나머지 옵션에 대한 설명을 볼 수 있다.
자 여기까지 많이 사용하는 컴파일 옵션에 대해 설명했다. 다음은 Interpreter 옵션에 대해 살펴보도록 하자.
위의 문서에서 보듯이 간단하게 현재 날짜 및 시간을 출력하는 프로그램소스이다. 클래스 설명부분은 클래스 소스 위에, 메소드 설명부분은 메소드 위쪽에 기술하면 된다. 필요한 notation 은 아래에 따로 설명하도록 하겠다. 일단 저장하고 컴파일해서 문법에 이상이 있는지 없는지 살펴보자.
JavaDoc.exe 을 사용하는 방법은 의외로 간단하다. 도스모스(Windows Platform)이나 터미널환경(Linux)에서 위의 그림처럼 명령어에 필요한 옵션을 넣은 다음 실행명령을 내리면 된다. 위 명령어에서는, -author 즉, 저자를 표기하고, -version 버전을 표시하며, 문서 생성 위치는 -d 옵션을 이용해서 현재 아래의 docs라는 디렉토리에 생성하라는 것이다. 여기서 Windows Platform 에서는 아래와 같이 명령어를 넣어야 한다.
잘 알겠지만, Windows 와 Linux/Unix 의 경로 지정차이다. '\' 이든, '/' 이든 플랫폼에 맞게 경로를 지정하면 된다.
자 이와같이 명령어를 내리면 docs 디렉토리에 HTML 문서들이 생성됐을 것이다. 살펴보자.
docs 디렉토리에 가니 index.html 파일이 있고, 웹브라우저를 이용해서 파일을 열었더니 위의 그림과 같이 생성되었다. 생성자체는 별로 어려움이 없다. 필요한 옵션을 아래와 같다.
JavaDoc 주석은 /** 로 시작해서 */ 로 끝나게 되며 각 라인은 * 로 시작해야 한다. 아래는 필요한 JavaDoc 주석의 태그들이다. 당연히 자바니까 대소문자 구별한다.
1. 클래스와 인터페이스에서 @see 태그 : 이 태그를 이용하면 우리가 API에서 다른 패키지를 보고자 할 때 넘어가는 하이퍼링크를 생성해 준다. JavaDoc 빌드시 See also 란 항목으로 나타난다. 하지만, 올바른 하이퍼 링크인지는 JavaDoc이 확인하지 않는다.
ex)
@see 클래스 이름
@see 패키지가 지정된 클래스면
@see 패키지가 지정된 클래스명#메소드
@version : 해당 클래스의 버전정보를 나타내고자 할 떄 사용된다. 빌드시 -version 옵션 필요.
ex) @version 1.2
@author : 작성자 정보를 넣는다. 가령, 이름이나 EMail 주소 같은... 역시 빌드시 -author 옵션 필요
ex) @author JavaMan
@since : 태그를 가진 객체의 추가 시기를 기술한다. 빌드시 별다른 옵션없이 사용하며, 포함하고 싶지 않으면 -nosince 를 사용하면 된다.
2. 메소드에서 @param : 메소드의 매개변수에 대한 설명을 기술한다. @return : 메소드의 반환될 값을 설명한다. @exception : 메소드에서 발생할 수 있는 예외를 설명한다. @throws 과 같다. @deprecated : 혹 사용버전과 이전버전과의 호환성 문제가 발생할 것에 대비해서 사용금지정보를 설명한다. 문서에 포함시키지 않으려면 -nodeprecated옵션을 주면 된다.
이번엔 jar 파일로 클래스 파일을 압축한 다음 배포해 보자. 보통 자바 클래스 파일들을 압축해서 배포할 때에는 jar 파일로 배포한다. Java Web 에서는 war 파일로, 또는 ear 파일로 압축해서 배포한다.
본래 SUN 에서 배포한 클래스 파일들을 레퍼런스하면 컴파일러는 기본 위치 즉, %JAVA_HOME%\lib\tools.jar 를 참조한다. 하지만, SUN 이 제작하지 않았거나, 제작했어도 JDK 설치시점에 들어있지 않았거나, 개발자가 별도로 제작한 클래스 파일들은 jar 형식으로 제작돼 배포되는데, 이번 강의에서는 jar 파일의 배포에 대해 살펴보도록 한다.
먼저, 두개의 클래스를 작성한다. 하나는 아래의 그림처럼 abc.sales.data.A 클래스이고,
두번째는, abc.it.data.B 클래스이다.
필자는 이 2개의 파일들의 클래스 생성기준을 C:\Temp 하위로 하겠다. 현재 커서가 있는 위치인 C:\JavaRoom 에서 2개의 소스파일이 저장돼 있는 C:\Temp 하에 컴파일하자. 그럼. -d 옵션에 의해 설정된 디렉토리가 package 생성시점이 되는 것이다. 즉, abc 디렉토리는 C:\Temp\abc에 생성될 것이다.
예상했던 대로 C:\Temp\abc 하에 두개의 디렉토리가 생성됐다. 하나는 A 클래스가 있는 sales 디렉토리, 또 하나는 B 클래스가 있는 it 디렉토리.
자! 이 두개의 클래스 파일을 압축해보자. jar -cvf test.jar abc/ 즉, abc 하위의 모든 디렉토리를 test.jar 파일로 압축하라는 말씀.
방금 생성한 test.jar 파일을 컴파일러가 기본적으로 인식하는 위치인 %JAVA_HOME%\lib 가 아니라, 아래의 그림과 같이 외부에서 작성된 jar 파일들은 %JAVA_HOME%\jre\lib\ext 디렉토리에 집어넣는다.
자! 이젠 불러오는 것만 남았다. import 로 레퍼런스할 클래스 경로를 정확히 지정하고, 컴파일 그리고 실행까지 성공이다. 그런데...
에디터에서는 잘 실행되지만, 아래의 그림처럼 도스모드에서는 컴파일은 되지만, 실행되지 않는다. A클래스와 B 클래스를 찾을 수 없다고 나온다. 이게 웬일인가?
결국, %JAVA_HOME%\jre\lib\ext 디렉토리에만 test.jar 파일을 갖다 놓는 것이 아니라, 한곳 더 복사해 넣어야 한다. %JAVA_HOME% 에 가보면 jre6 디렉토리가 있다. 필자의 경로는 C:\Program Files\Java\jre6\lib\ext 에도 복사해서 붙여 넣어야 한다. 왜냐하면, 컴파일할때는 %JAVA_HOME%\jre\lib\ext\test.jar 를 참조하고, 실행할 때는 C:\Program Files\Java\jre6\lib\ext\test.jar 를 참조하기 때문이다.