|
||
이 글에 대한 원문은 다음의 웹페이지에서 보실 수 있습니다. http://mercury.chem.pitt.edu/~tiho/LinuxFocus/English/july1998/article8.html 요약 : 자바 프로그래밍에 대한 기사입니다. 이 기사에서는 프로그래밍 언어로서 자바에 대해서 설명하고 자바에 대한 일반적인 특성과 관련된 자료의 위치 등을 알려줄 것이다.
1. 소개 이 기사는 자바 프로그래밍 언어와 개발환경에 대한 일련의 기사들 중 첫 번째입니다. 이번 호의 목적은 언어의 기초적인 것에 대해서는 다루지 않을 것이다. 만약 이러한 것을 원한다면 다른 서적을 참고하기 바란다. 현재의 자바의 현상에 대해서는 다소간의 유행이 있다. 모든 컴퓨터 잡지의 유명한 필자들이 자바에 대해서 글을 쓰고 많은 소프트웨어 회사들이 자바 애플릿을 개발하고 자바애플릿을 쓰지 않은 웹싸이트는 거의 없을 정도이다. 이 기사에서 자바에 대해 깊이있게 다루고 배울 수 있도록 내용을 충실히 하려고 하지만 이 언어에도 기본은 간단하지만 상당히 복잡한 부분도 있고 이 언어가 계속 개발이 되고 있기 때문에 완벽하게 익숙해 지기는 쉽지 않을 것이다. 이 기사의 목적은 자바에 대한 일반적인 것에서 한걸음 나아간 것으로 하고 있다. 예를 들자면 애플릿과 네트웍에 관련된 프로젝트, JDBC, 빈즈 등등이다. 필자는 자바는 범용언어라는 것을 강조한다. 즉, 단지 웹페이지를 위한 애플릿이나 만드는 용도로 사용되는 언어는 아니라는 것이다. 물론 유행은 웹페이지를 위한 언어로서 사용하는 것이다. 우리는 자바 애플릿보다 더 선호하고 있는 자바를 대신할 만한 많은 것이 있기 때문에 자바를 단지 그러한 용도로 사용하는 것에는 그렇게 감명받을 필요는 없는 것이다.
2. 기원 자바는 1991년에서 18개월동안 썬 마이크로시스템즈에서 베임스 고슬링, 패트릭 노튼, 크리스 워쓰, 에드 프랑크, 마크 세리단에 의해서 개념이 만들어 졌다. 1992년에서 1995년 사이에 빌 조이, 아더 반호프, 조나단 페인, 프랭크 옐리아, 팀 린돌이 초기의 프로토타입에 성숙도를 높이는 작업에 참여하였다. 바로 이 시기에 발전한 www 보다는 먼저 자바가 개발되어졌다는 것을 알 수 있다. 1991년에 HTML의 개발자인 팀 버너스리는 아직 HTML언어를 개발하고 있지 않았었다. 자바의 구문은 C와 매우 유사하고 객체지향적 특징에서는 C++와 유사하다. 자바는 잘 짜여지고 논리적으로 모순이 없는 프로그래밍 언어이다. C나 C++와의 유사점 때문에 자바는 C++의 인터넷 버전이라는 인상을 주기도 한다. 그러나 이론적으로나 실제적으로 서로간에는 많은 차이가 있다. 특별히 자바는 C++ 과는 비교가 되는 관점의 객체지향 파라다임을 가지고 발전하고 개선되어졌다. 자바는 인터넷에 잘 적용되었고 인터넷을 통하여 널리 알려진 언어가 되었다. 그리고 동시에 자바는 사이버 공간에 자유롭게 움직일 수 있는 객체(동적으로 실행가능한 프로그램들)에 대한 범위를 넓혔다는 점에서 인터넷에 깊은 영향을 미쳤다고 할 수 있다.
3. 설치 자바의 프로그래밍에는 중요한 몇가지 툴이 있다. 부수적으로 필자는 GNU/LINUX 환경에 대해서도 항상 언급하게 될 것이다. 현재 리눅스를 위한 ELF 형식의 파일은 커널버전 1.2.13 이상을 필요로 한다. 필자는 JDK 환경과, 네트스케이프 버전 2.0.14 나 이후버전과 Xemacs 와 같은 텍스트 에디터를 사용할 것이다. 덧붙여 X 윈도우에서 작업을 할 것이다. 비록 X 에서 작업하는 것이 반드시 필요한 것은 아니지만 애플릿 프로그램을 개발하거나 그래픽적인 인터페이스를 가지는 프로그램을 작성한다면 반드시 필요하다. JDK 배포본은 다음의 장소에서 다운로드 할 수 있다. http://www.blackdown.org/java-linux.html 이 장소로부터 편리한 미러사이트를 확인하여 빠르게 받을 수 있다. 현재는 JDK 1.1.3 이 나와 있는 상태이다.(역자주 : 현재는 JDK 1.1.7버젼이 나와있다.) 상당히 분량이 많은 관계로 다운로드하는 것이 쉽지는 않을 것이다. gunzip을 사용하여 압축을 풀고 나면 그다지 어려움이 없다. 보통 우리는 /usr/local 디렉토리 밑에 배포본을 설치한다. 이곳에 풀고 나면 JDK1.1.3 이라는 서브디렉토리가 생기고 그 밑으로 다음과 같은 디렉토리가 생긴다. /doc : HTML 형식으로 되어 있는 공식적인
설명서들 /lib 디렉토리 밑에 보면 classes.zip 파일이 있다. 이것이 .zip 이라고 되어 있다고 해서 압축되어 있다고 생각하여 unzip 하면 안된다. 이것에는 JDK 에 의해서 사용되는 컴파일된 클래스들을 가지고 있다. JDK 의 root 디렉토리에는 "src.zip" 이 있는데 이 파일에는 classes.zip 안에 포함된 것들의 소스파일이 있다. 이것들은 컴파일되지 않은 것들로서 오직 정보제공을 위한 목적으로 배포본에 제공되는 것이다.
4. 개발 환경 앞에서도 말했듯이 개발 툴들은 /bin 디렉토리 밑에 있다. 여기에는 여러개의 파일들이 있고 몇가지 설명을 하자면 다음과 같다. 그리고 /bin 디렉토리를 PATH 환경변수에 추가시켜 준다. 만약 전체 사용자가 모두 이것이 필요하다면 /etc/profile에 넣어두는 것도 좋다. javac : 자바소스를 바이트코드로 변환시켜주는
자바 컴파일러
5. 특징 계속하기 전에 각자에게 질문을 하고 싶다. 자바란 무엇일까? 우리가 이 물음에 답하기 위해서 JDK 매뉴얼을 볼 수 있다. 이것에는 자바란 두가지 것이라고 되어있다. 한 가지는 프로그래밍 언어이고 하나는 플랫폼이다. 프로그래밍 언어로서 자바는 고수준의 언어이다. 그리고 다음과 같은 특징을 가지고 있다. 간단하다. 이중에서 우리의 주위를 끄는 것은 첫 번째 것은 자바가 인터프리터라는 것이다. 자바 소스가 바이트 코드라는 오브젝트파일로 컴파일 되었더라도 이것은 저수준의 코트일 뿐이고 이 바이트코드라는 저수준 코드가 여러 다양한 플랫폼에서 해석되어지는 것이다. 자바 바이트코드 덕분에 "한번 코드를 작성하고 모든 곳에서 실행한다. (write once and execute always)" 가 가능하게 된 것이다. 우리가 자바 프로그램을 한 곳에서 작성하고 완전히 다른 구조를 가지는 시스템에서 그것을 실행 시킬 수 있는 것이다. 이것이 가능하게 하는 것은 자바 가상기계(JVM)라는 것이다. 예를 들어 Windows NT플랫폼에서 컴파일된 자바 프로그램이 있다면 이것은 어떠한 어려움 없이(최소한 이론적으론) Sun Ultra Solaris에서 동작시킬 수 있는 것이다. 자바 플랫폼에는 두 개의 요소가 있다. JVM JVM은 자바 바이트코드로 된 프로그램을 실행 시켜주는 추상적인 컴퓨터이다. 이것은 간단하고 크기가 작게 만들어져 있다. 왜냐하면 어떠한 곳에라도 설치되려면 크기가 작지 않으면 쉽지 않기 때문이다. 이러한 단순함 때문에 모든 플랫폼에 걸쳐서 퍼질 수 있게 된 것이다. 여러 플랫폼을 지원하므로 모든 것에서 운용되는 공통의 소프트웨어 레이어를 만들어줄 수 있고 여러 가지 다양한 네트워크(예를 들면 인터넷)에서 이식성의 문제에 대한 완벽한 해결책을 제공하고 있는 것이다. 이러한 점을 생각해보면 왜 이 기술이 성장가도에 있는지를 쉽게 알 수 있다. 이러한 점에도 불구하고 가상머신은 단순하게 소프트웨어 층으로만 보는 경향이 있다. 그러나 이름에서 알 수 있듯이 이것은 완전한 컴퓨터 시스템이 되어야만 한다. 점차적으로 시장에서 진정한 자바머신, 신용카드, TV 디코더등을 지원하는 자바 칩을 볼 수 있게 될 것이다. 자바의 API 는 GUI 와 같은 다양한 수의 기능을 제공하는 거대한 소프트웨어 콤포넌트의 집합이다. 이것들은 라이브러리(자바기술로 말하면 자바 패키지)의 형태로 구성 되어졌다. 이러한 패키지로 인해서 웹에서의 애플릿을 형태가 아닌 많은 애플리케이션이 자바로 작성할 수 있는 것이다. 예를 들면 웹서버, 프록시, 메일 서버, IRC 서버 그리고 인터넷에 관련된 우리가 상상할 수 있는 모든 것들이 가능한 것이다. API 패키지를 여러 개의 그룹으로 분류할 수 있다. 기본 : 객체, 매트릭스, 수, 입출력, 자료구조,
시스템 속성, 날짜, 시간 등 이러한 기본적인 API 커널을 제외하고 3D 확장판, 이동통신, 애니메이션, 등등이 있다. 위에서 언급했던 것처럼 자바가 가지는 일련의 특징을 세부적으로 알아보자. 간단하다 : 작업에 있어서 정의된 형식의 수를 줄였다. 강력한 언어의 기능성을 제공한다. 그러나 혼돈될 수 있는 특성에 관한 것은 거의 없다. 자바는 C/C++ 문법 구조를 상속받았고, C++의 많은 객체지향적 특성을 상속받았다. C/C++ 에 익숙한 프로그래머라면 자바를 배우는데 문제는 없을 것이다. 이러한 유사성에도 불구하고 C/C++특성 중 몇 가지를 제거했다. 다음은 그러한 내용이다. 포인터 연산 객체지향적이다 : 자바는 객체지향적인 관점에서 디자인 되었고, 결과적으로 객체지향적인 것이 매우 깨끗하고 활용성이 있으며 실용적인 것이 되었다. 자바의 객체모델은 사용하기에 간단하고 쉽다. 분산환경이 지원된다 : 자바는 거대한 TCP/IP 접속을 지원하도록 디자인되었다. 사실 이것은 개발자에게 네트웍에 대한 정보의 접근의 로컬파일에 대한 접근만큼 쉽게 해준다. 강력하다 : 자바는 타입검사에 있어서 매우 엄격하다. 이것은 컴파일 시간에 타입 검사가 이루어지도록 하고 있다. 물론 런타임시에도 타입 검사를 한다. 메모리는 자동적으로 관리된다. 이것은 인터프리터가 사용하지 않는 객체에 대한 자동적인 gabage collection을 하기 때문이다. 자바는 그것 자체로서 많은 예외상황 처리를 한다. 그래서 오류에 대한 고민을 덜어주게 되는 것이다. 애플리케이션이 런타임시에 나타날 수 있는 모든 에러들에 대한 처리를 할 수 있게 된다. 시스템에 독립적이다 : 자바의 디자인의 주요 목표는 " 한번 코딩하고 아무 곳에서, 아무 순간에 항상 실행될 수 있도록" 이다. 자바 코드는 한번 고 수준의 바이트코드로 컴파일되어지고 이것은 장치에 독립적인 것이다. 이 바이트코드는 인터프리터에 의해서 작동되도록 디자인되어 있어서 장치에 독립적인 것이 되는 것이다. 안전하다 : 분산화된 정보를 관리하기 위해서는 보안레벨이 높아야 한다. 자바는 실행환경에서 몇 가지의 특성으로 보안기능을 제공한다. 바이트코드 인증 비록 컴파일러가 정확한 코드만 만들어 내지만 인터프리터는 컴파일 시간에 코드가 변경되지는 않았는지 확인하기 위해서 다시 한번 검사를 한다. 게다가 자바 인터프리터는 클래스에 대한 메모리 허용범위를 결정한다. 자바는 어떠한 시스템에 대해서도 가장 안전한 애플리케이션중에 하나로서 여겨질 수 있다. 이식성이 있다 : 자바의 기본적인 이식성을 고려하지 않더라도 시스템에 독립적이라는 것이 벌써 자바가 이식성을 고려하고 구현되어졌다는 것을 알 수 있는 것이다. 즉 정수형은 언제나 정수형이고 GUI는 윈도우에 대해서 추상화된 시스템으로 구성되어 있어서 이것도 역시 시스템에 독립적이 되는 것이다. (즉 UNIX나 PC나 Mac 시스템이 유사한 GUI를 가진다는 것이다.) 인터프리터다 : 자바의 기본 목표인 플랫폼 독립적인 것을 얻기 위해서 자바 컴파일러는 바이트코드만 생성한다. 그리고 이것은 해당 시스템에서 제공하는 적절한 인터프리터에 의해서 실행되어질 수 있는 것이다. 이러한 패러다임은 자바의 수행성에 영향을 미칠 수 있다고 생각할 수 있다. 그렇지만 이러한 수행성을 고려한다면 자바 애플리케이션 개발자들이 바이트 코드에 대한 최적화된 디자인을 해야 할 것이다. 왜냐하면 바이트코드의 잇점이 수행보다 더 하기 때문에 만약 수행성을 중요시한다면 네이티브 코드를 만들어 내는 것보다는 바이트코드를 어떻게 하면 최적화할 것인가를 생각하는 것이 좋다는 것이다. 멀티쓰레드를 지원한다 : 자바 애플리케이션은 같은 시간에 강력한 방법으로 몇 개의 태스크를 수행 시킬 수 있다. 동적이다 : 자바는 실행시에 애플리케이션을 구성하는 모든 모듈을 링크시키려고 하지 않는다. 이러한 점은 실행코드를 동적으로 안전하게 또한 편리하게 링크시킬 수 있도록 도와준다. 이쯤되면 독자들 중 어떤 사람들은 현재 GUN/Linux
에서의 자바의 상태를 궁금해 할 것이다. 우리는 앞에서 리눅스를
위한 JDK를 이야기했었다. 그러나 이 JDK 는 썬마이크로시스템즈에
의해서 상업적으로 개발되어진 것이다.(비록 자유롭게 배포되긴
하지만) 마지막으로 GNU 기술에 관한 상당히 활발한 활동이 인터넷 상에서 이루어지고 있다는 것을 말해두고 싶다. 특히 썬으로부터 독립하여 자바의 자유로운 배포를 위한 완전한 툴박스를 개발하는 것이 매우 활발하게 진행되고 있는 것이다. 이것으로 약간이나마 자바의 중요성에 대해서 어느 정도 이해가 되었을 것이고 현재의 분위기가 어떻다는 것을 알 수 있을 것이다.
6. 첫 번째 자바 프로그램 언어에 대한 일반적인 특징을 알았으므로 이제는
실제 프로그램을 보도록 하자. 소개에서 언급했던 것처럼 언어의
전형적인 것에 대한 것은 설명하지 않을 것이다. 즉 "hello
world" 와 같은 예를 사용하지 않겠다는 것이다. 대신에 우리는
우리가 원하는 공간에 사각형을 그리는 프로그램부터 시작하자.(다시
복잡할지 모르지만)
주어진 예에서 정의된 클래스의 이름이 소스파일의 이름과 일치한다. 이것은 우연히 그렇게 된 것이 아니다. 자바에서는 모든 코드는 클래스가 있어야 한다. 그래서 관행상 클래스 이름과 소스파일의 이름은 서로 같게 하는 것이다. 추가적으로 자바는 대소문자를 구분한다. 예제를 컴파일하기 위해서는 다음과 같이 입력한다. > javac Cuadro.java 모든 것이 잘 된다면 자바 컴파일러는 Cuadro.class 파일을 생성할 것이다. 이것은 바이너리 형태로 이것이 바이트 코드이다. 이것을 인터프리터로 실행시키려면 다음과 같이 한다. > java Cuadro 자바 소스코드가 컴파일될 때 파일 안의 정의된 클래스 이름과 같은 이름의 클래스 파일이 생성되기 때문에 소스파일 이름을 안에 정의된 클래스 이름과 같게 주는 것이 좋다. Cuadro .java 라는 이 예제가 간단함에도 불구하고 자바의 기본적인 것을 이해하는 데에는 별 문제가 없다. 이 프로그램이 자바 프로그램의 전형적인 구조를 가지고 있다. 먼저 알아야 할 것은 이 예제는 HTML 파일안에 포함될 수 있는 애플릿이 아니라 명령행에서 자바 인터프리터에 의해서 수행될 수 있는 독립적인 프로그램이라는 것이다. 프로그램의 첫 번째 행을 보자. class Cuadro { 첫 번째 단어는 언어의 예약어이다. 이것은 새로운 클래스의 이름을 지정하는 것이다. 이 경우에는 "Cuadro" -이 말은 스페인어로 사각형이라는 것이다. -라는 것이 새로운 클래스가 되는 것이다. 모든 멤버를 포함한 클래스에 대한 정확한 정의는 괄호 "{}" 사이에 잇다. 자바에서 프로그램의 실체는 클래스 안에 있다는 것을 알아야 한다. 그 다음 행을 보자. public static void main (String args[]) { 이것은 main() 이라는 메쏘드를 선언하는 것이다. 모든 자바 애플리케이션은 main()에서 수행을 시작한다. 이것은 C/C++와 유사하다. 이 예제를 이해하는데 필요한 몇 가지 것을 알아보자. public 키워드는 멤버 메쏘드의 범위를 지정하는
것이다. 클래스가 public 이라고 선언되어 있다면 그 클래스는 해당
클래스 밖에서 정의된 코드에서 사용이 가능하다. static 키워드는
main() 메쏘드가 클래스가 만들어질 떄마다 새로 생겨나지 않는
다는 것을 지정하는 것이다. void 는 메쏘드가 어떠한 값도 리턴하지
않는다는 것을 의미한다. 함수나 메쏘드에 인자를 주기 위해서 함수
이름에 이어서 괄호를 넣고 필요한 인자를 주기 위해서 함수 이름에
이어서 괄호를 넣고 필요한 인자를 그 안에 넣어준다. 이 예에서
main 메쏘드는 String 클래스로 부터의 배열객체를 인자로 받는다. 다음 행을 보자. int 1,a : 두 개의 정수형 변수를 선언한다. 자바에서 모든 변수는 사용전에 선언이 되어야 한다. 그리고 코드안에 각 문들은 세미콜론으로 끝나야 한다. 코드의 나머지 부분은 작은 알고리듬으로 구현되어 있다. 다음은 인자의 오른쪽 숫자가 제공되어졌는지 확인한다. If (args.length==2) 만약 인자가 주어졌다면 정수형 변수에 할당한다. 1 = Integer.valueOf(args[0]).intVaiue() : 그렇지 않다면 초기값을 할당한다. 1 = 20 : 프로그램의 나머지 부분은 화면에 사각형을 그리는 명령들로 되어 있다. 특별히 봐둘 것은 다음 것이다. System.out.print() print() 는 문자열을 인자로 받아서 프린트한다. System 은 시스템을 접근하기 위해서 제공된 미리 정의된 클래스이고 out 은 콘솔에 접속된 output 스트림이다. 다음을 보자. for (int i=1 ; i> ;1; I-) 이것은 이미 C/C++에서 익숙한 것이므로 설명이 필요없을 것이다. 여기까지로 어느 정도 소스에 대한 설명이 끝났다. 독자들이 자바의 시스템 독립적이라는 것을 알아보기 위해서 여기서 만들어진 Cuadro.class를 다른 플랫폼에서 실행시켜서 결과를 확인하기 바란다. 우리는 간단히 자바의 특징을 알아보았다. 다음은
참고가 될 만한 URL과 참고서적을 소개하는 것으로 이 기사를 마무리한다.
|