Java

내위키
Dennis (토론 | 기여)님의 2015년 7월 27일 (월) 13:40 판

컴퓨터 프로그래밍 언어의 하나. 객체지향 프로그래밍 언어를 언급할 때 가장 먼저 손꼽히는 언어다. 선마이크로시스템즈의 제임스 고슬링이 만들었다. 원래는 컴퓨터를 넘어서 갖가지 기기를 네트워크로 연결시키고 자체 통신을 통해 동작하는 체제를 구축하기 위해서 개발한 언어인데, 지금은 서버 환경에서 가장 많이 쓰이고 있는 상황이 되었다.

C++의 객체지향 프로그램 아이디어 가운데 상당수를 살리면서도 불필요하거나 많은 오류를 일으킬 수 있는 요소들은 없애거나 단순화시켰다. C에서부터 내려오던 포인터를 없앴고, 연산자 오버로딩, 다중 클래스 상속 같은 것들도 지원하지 않는다. C++를 쓰던 사람들 눈으로 봤을 때에는 되던 게 안 되는 게 이것저것 꽤 있다 보니 어떤 면에서는 답답하기도 했다. 지금이야 C 안 배우고 바로 자바부터 배우는 사람들이 많으니 그냥 원래부터 그러려니... 다.

또 한 가지 중요한 특징은 바이트코드와 가상머신이다. 이전의 컴파일러는 최종 결과물로 바로 실행시킬 수 있는 실행 파일, 혹은 다른 오브젝트 파일이나 라이브러리 파일과 링크해서 실행 파일을 만들 수 있는 오브젝트 파일이 나왔다. 이러한 방식의 가장 큰 문제점은 결과물이 특정 운영체제나 하드웨어에 종속된다는 것이다. 예를 들어 윈도우용으로 컴파일한 실행 파일은 리눅스에서는 실행이 안 된다. 인터프리터 방식이라면 이런 문제를 극복할 수 있지만 속도가 너무 느리다.

자바가 사용한 전략은 중간 형태의 결과물을 만들어내는 것. 컴파일을 하긴 하는데, 특정 운영체제나 하드웨에어 종속되지 않은 바이트코드(bytecode)라는 중간 형태의 결과물을 만들어내고, 실행할 때에는 각 운영체제나 하드웨에어 맞춘 자바 가상머신(Java Virtual Machine, JVM)에서 이를 실행한다. 인터프리터컴파일러를 절충한 형식이라고 볼 수 있다. 컴패일러로 아예 실행파일을 만들어내는 것보다는 느리지만 인터프리터 방식보다는 확실히 빠르다. 그래도 속도가 느리다는 문제가 자꾸 지적되다 보니 결국 내놓은 해법은 JIT(Just-in-time) 컴파일러다. 예전에는 실행할 때마다 JVM이 바이트코드의 명령을 실행하는 방식이었지만, JIT컴파일러는 처음 실행할 때 바이트코드를 기계어로 컴파일해 버리고, 그 다음에 실행할 때에는 바로 기계어로 컴파일된 것을 실행해 버린다. 이렇게 하면 프로그램의 실행 속도가 기존 컴파일러와 거의 비슷하게 빠르다. 대신 컴파일한 기계어 실행파일을 어딘가에 저장해야 하니 저장 공간은 좀 더 잡아먹고 첫 실행할 때 기계어 컴파일 과정이 필요하니 그때만 실행 속도가 느리다.

크게 세 가지 버전으로 나뉜다. 일반적인 범용 용도르 쓰기 위한 SE(Standard Edition), 대규모 엔터프라이즈 서버급의 처리가 가능한 EE(Enterprise Edition), 그리고 휴대용 기기와 같은 가벼운 장치를 위한 ME(Micro Edition) 이렇게 세 가지가 있다.