자바(JAVA Programming Language) 언어 소개
자바 프로그래밍 언어에 대해 알아보기에 앞서 자바가 가진 특징과 역사에 대해 알아보도록 하겠습니다.
1. 자바(JAVA)
자바는 썬 마이크로시스템즈(Sun Microsystems, Inc)의 개발자 제임스 고슬링이 1995년에 개발하여 1996년 1월에 공식적으로 발표한 객체지향 프로그래밍 언어입니다.
당시 썬 마이크로시스템즈는 어떠한 하드웨어 플랫폼에서도 동작하는 객체 지향의 새로운 언어인 Oak를 개발했고, 제임스 고슬링은 이 Oak를 자바 프로젝트로 발전시키게 됩니다.
2010년에 썬 마이크로시스템즈가 오라클(Oracle)에 인수되면서 저작권도 함께 넘어가게 되었습니다.
2. 자바의 역사
2.1 JDK 1.0
1996년 1월 23일에 발표되었습니다.
발표 이전에 Oak 라고 불렸으며, 1.0.2 버전에서 JAVA로 이름이 변경되었습니다.
2.2 JDK 1.1
1997년 2월 19일에 발표되었습니다.
내부 클래스, Java Beans, RMI, 리플렉션, 유니코드 지원, 국제화 등이 추가되었습니다.
2.3 J2SE 1.2
1998년 12월 8일 발표되었습니다.
strictfp(Strict Floating Point), SWING GUI, JIT, 자바 애플릿을 구동하는 웹 브라우저 플러그인, CORBA, Collections 등이 추가되었습니다.
새로운 GUI, JIT, CORBA 등의 굵직한 기능이 추가되면서 1.2 버전부터 약칭을 J2SE(Java 2 Standard Edition) 로 표기하기 시작했습니다.
(이 표기는 1.5 버전까지 사용되게 됩니다)
2.4 J2SE 1.3
2000년 3월 8일에 발표되었습니다.
HotSpot JVM, JNDI, JPDA, JavaSound 등이 추가되었고 RMI 가 CORBA 를 지원하도록 변경되었습니다.
2.5 J2SE 1.4
2002년 2월 6일에 발표되었습니다.
assert, 정규식(Regular Expression), IPv6, Non-Blocking IO, XML API, JCE, JSSE, JAAS, Java Web Start 등이 추가되었습니다.
2.6 J2SE 5
2004년 9월 30일에 발표되었습니다.
이 때부터 메이저 버전을 빼고 표기하기 시작했습니다. 하지만 내부적으로는 여전히 1.5, 1.6, 1.7 등으로 데이터가 들어있습니다.
Generics, Annotation, AutoBoxing/AutoUnBoxing, Enumeration, 가변 길이 파라미터, Static Import, 새로운 Concurrency API 등이 추가되었습니다.
※ 이전의 Java 는 표준 입력(stdin)에 대한 지원이 부족했는데, J2SE 5 에 java.util.Scanner 가 추가되면서 이전보다 편하게 표준 입력을 사용할 수 있게 되었습니다.
2.7 Java SE 6
2006년 12월 11일에 발표되었습니다.
이 때부터 표기가 J2SE 에서 Java SE 로 변경되었습니다.
Scripting Language Support, JDBC 4.0, Java Compiler API, Pluggable Annotation 등이 추가되었고,
스크립팅 언어 지원과 함께 Rhino JavaScript 엔진이 기본으로 탑재되었습니다.
2.8 Java SE 7
2011년 7월 7일에 발표되었습니다.
Dynamic Language 지원, switch 문에서 String 사용, try 에서 자동 자원 관리, Diamond Operator <>, 이진수 리터럴, 숫자 리터럴에 _ 지원, 새로운 Concurrency API, 새로운 File NIO 라이브러리, Elliptic Curve Cryptography, Java2D 를 위한 XRender, Upstream, Java Deployment Ruleset 등이 추가되었습니다.
2.9 Java SE 8
2014년 3월 18일 발표되었습니다.
Lambda Expression, Rhino 대신 Nashorn JavaScript 엔진 탑재, Annotation on Java Types, Unsigned Integer 계산, Repeating Annotation, 새로운 날짜와 시간 API(Joda-Time), Static Link JNI Library, PermGen 영역 삭제 등이 추가되었습니다.
※ 자바의 java.util.Date 클래스와 java.util.Calendar 클래스는 사용하기 불편하다는 악평이 자자한데, Joda-Time은 이를 답답하게 여긴 사람들이 대체하려고 만든 오픈소스 라이브러리 입니다.
3. 자바의 특징
자바는 다른 프로그래밍 언어에 비해서 최근에 발표된 언어입니다. 그만큼 기존의 다른 언어에는 없었던 특징들을 가지고 있습니다.
3.1 장점
3.1.1 운영체제에 독립적인 언어
기존의 언어로 개발한 프로그램을 한 운영체제에서 다른 운영체제에 이식하여 사용할 때 많은 수정 작업과 시간이 소요되었습니다. 그러나 자바에서는 일종의 에뮬레이터 프로그램인 JVM(Java Virtual Machine)을 통해 이 문제를 해결하였습니다.
자바로 개발된 응용 프로그램은 운영체제나 하드웨어가 아닌 JVM과의 통신만 이루어지며, JVM은 전달받은 명령을 해당 운영체제에게 변환하여 전달합니다. 따라서 자바는 운영체제에 독립적이지만 JVM까지 운영체제에 독립적이라고 볼 수는 없습니다.
그러나 다른 크로스 플랫폼 언어들과 마찬가지로 각 플랫폼마다 미묘하게 기능이나 작동에 차이가 있는 부분이 극히 일부분 존재하기도 합니다. 그렇기 때문에 작성된 프로그램을 그대로 다른 운영체제에서 실행할 때에 문제가 발생할 가능성이 존재하지만, 자바의 장점은 JVM에서 발생하는 이러한 문제가 다른 언어에 비해서 매우 적은 편이라는 점입니다.
아래의 그림은 Java SE7 기반 JVM의 아키텍처 개요도입니다.
3.1.2 객체지향언어
객체 지향 프로그래밍은 부품에 해당하는 객체들을 먼저 만들고, 이것들을 하나씩 조립하여 전체 프로그램을 완성하는 프로그래밍 기법입니다. 이러한 객체 지향 프로그래밍에 사용되는 언어를 객체 지향 언어라고 합니다.
자바는 객체를 만들기 위한 설계도인 클래스를 작성하고, 객체와 객체를 연결하여 목적에 맞는 프로그램을 만듭니다.
또한 자바는 객체 지향 언어의 특징인 상속, 캡슐화, 다형성을 완벽하게 지원하여 순수한 객체 지향 언어라는 평가를 받고 있습니다.
3.1.3 대중성과 많은 레퍼런스
자바는 언어에서 불필요한 부분을 제거하고 단순화함으로써 쉽게 이해하고 배울 수 있도록 하였습니다. 이러한 특징과 오래된 역사로 인하여 대중성을 갖게되었고 많은 레퍼런스와 오픈소스 라이브러리도 함께 만들어지게 되었습니다.
즉, 자바는 안정적이면서 많은 노하우가 있는 검증된 언어라고 볼 수 있습니다.
3.1.3 자동 메모리 관리 (Garbage Collection)
자바 프로그램이 실행되면, 가비지 컬렉터(Garbage Collector)가 자동으로 메모리를 관리해줍니다.
객체 생성시 자동으로 메모리 영역을 찾아 할당하고, 사용이 완료되면 가비지 컬렉터가 사용이 종료된 객체를 찾아 제거해줍니다.
이러한 가비지 컬렉터가 없을 경우 프로그래머는 메모리의 할당과 해제를 수동으로 처리해줘야 합니다.
자동 메모리 관리가 비효율적인 면도 있지만, 프로그래머 관점에서 봤을 때 좀 더 프로그래밍에 집중할 수 있도록 해줍니다.
3.1.4 멀티쓰레드(Multi-thread)
일반적으로 멀티쓰레드(Multi-thread)는 운영체제에 따라 각각 구현방시과 처리방식이 달라집니다.
그러나 자바의 멀티쓰레드는 운영체제와 상관없이 구현이 가능하며, 쓰레드 생성 및 제어와 관련된 API가 제공되어 쉽게 구현할 수 있습니다.
3.1.5 동적 로딩(Dynamic Loading)
자바는 클래스 단위의 언어로서 정의된 각각의 클래스 단위로 실행파일이 생성됩니다.
일반적으로 각각의 클래스들은 다른 클래스들을 활용하여 생성이 되는데, 이러한 클래스들에 대한 binding은 compile 과정에서 처리되나 실제 메모리 영역에 대한 할당은 프로그램 실행시 필요한 시점에 인스턴스화를 통해 할당되게 됩니다.
또한 개발 완료 이후 발생한 수정사항에 대해서는 해당 클래스만 수정하면되므로 유지보수를 빠르게 진행할 수 있습니다.
3.2 단점
3.2.1 속도 문제
자바의 속도와 관련된 문제는 하드웨어의 성능이 점차 개선되면서 해소되고 있습니다.
처음에 자바가 출시되었을 때는 느린 성능 때문에 많이 쓰이지 않을 것으로 예상되었지만, 현재 가장 많이 사용되는 곳은 성능이 중요하게 여겨지는 서버와 모비일 디바이스입니다.
이러한 점은 자바 자체가 빨라졌다기 보다는 하드웨어 성능의 향상과 비용 절감으로 인한 결과로 보는 의견도 있습니다.
자바의 경우 성능 문제가 많이 강조되다보니 많이 느린 것처럼 인지되었지만, 지금에 와서는 다른 High-Level 언어들에 비해서는 빠른 편으로 평가받고 있습니다.
(참고로 Python의 경우 C언어에 비하여 수십배 정도 느리고 JavaScript도 자바에 비해서는 2배정도 느린 성능을 보입니다)
3.2.2 예외 처리
대부분의 언어에서는 프로그램 실행시 프로그래머가 의도한 대로 동작하지 않는 상황에 대해 예외를 발생시켜 처리하도록 지원을 해줍니다.
자바에서는 다른 언어와는 달리 예외에 대해서 프로그래머가 직접 선언을 하여 처리해줘야 합니다.
대부분의 다른 언어에서는 원하는 에러만 try-catch문으로 처리해주고 그렇지 않은 경우에 대해서는 처리를 안해주어도 되지만, 자바에서는 모든 예외에 대해 철저하게 선언을 해주어야하고 그렇지 않으면 컴파일 조차 실행되지 않는 상황이 발생합니다.
이러한 점은 자바의 경직된 예외처리에 익숙하지 않은 프로그래머들에게 불편함을 느끼게 해줍니다.
이상으로 자바 언어의 특징과 역사에 대해 알아보았습니다.
※ 참고 문헌
남궁성, 『Java의 정석 2nd Edition』, 도우출판(2010)
티스토리 블로그, 자바란?, http://hoonmaro.tistory.com/9, (2017.04.16)
나무위키, 자바, https://namu.wiki/w/Java#fn-11, (2017.04.16)