Java는 객체 지향 프로그래밍(OOP, Object Oriented Programming)을 가능하게 하는 객체 지향 언어이다. 숫자나 논리값을 제외한 거의 모든 것들이 객체로 구성되어 있으며, 실제로 Object 클래스로부터 모든 클래스를 파생한다. 또 캡슐화, 상속, 다형성의 구현을 지원하고 있다. 때문에 코드 재사용 및 유지보수, 업그레이드, 디버깅을 비교적 쉽게 할 수 있으며 생산성이 높아 많은 곳에서 Java를 사용하고 있다.
Java는 컴파일 언어인 동시에 인터프리터 언어로, 텍스트 소스를 컴파일(javac.exe)하여 이진 클래스 파일로 만든 다음 자바 런타임이 클래스 파일을 인터프리트하며 실행(java.exe)하게 된다. 따라서 JRE(Java Runtime Environment)만 설치되어 있다면 OS에 관계없이 어디서든 실행할 수 있어 플랫폼에 대해 독립적인 특징(Platform independent)을 갖는다.
Java는 포인터 연산을 지원하지 않아 모든 메모리 접근을 자바 시스템이 관리하고 제한한다. 또한 예외 핸들링을 하여 시스템 붕괴의 위험이 없다. 객체 생성 시 Java는 자동적으로 메모리 영역을 찾아 할당하고, 사용이 종료되면 GC(Garbage Collector)를 실행시켜 자동적으로 메모리를 관리한다. 또한 유형의 정의가 강고하여 실행 전에 클래스 파일을 이용한 프로그램의 검사가 가능하다. Java는 프로그램 작성 시 자료형 타입에 굉장히 민감하여 일단 컴파일만 성공한다면 실행 시 오류가 발생하는 경우가 비교적 적다. 이런 제약은 코드를 명확하게 작성할 수 있도록 만들어 준다.
멀티쓰레드를 이용하면 하나의 프로그램 단위로 동일한 쓰레드를 동시에 수행할 수 있게 된다. Java는 멀티 프로세서 하드웨어를 지원하도록 설계되어 있으며, 스레드 생성 및 제어와 관련된 라이브러리 API를 제공하여 멀티스레드를 쉽게 구현할 수 있다.
Java 인터페이스는 모든 인스턴스 변수와 툴의 실행문을 배제한 채 객체 간의 상호작용을 정의하고 있어 하나의 모듈을 갱신할 때 다른 모듈을 모두 갱신할 필요가 없다. 즉, 어플리케이션을 실행할 때 모든 객체를 즉시 생성하지 않고 필요할 때 동적으로 로드하여 생성하기 때문에 유지보수 및 디버깅 시 전체 프로그램을 다시 컴파일하는 대신 해당 클래스만 수정하면 된다는 장점을 갖는다.
대용량 데이터 병렬 처리와 이벤트 지향 프로그래밍에는 함수적 프로그래밍이 적합한데, Java 8부터 함수적 프로그래밍을 위한 람다식을 지원하고 있다. 람다식을 사용하면 컬렉션 요소 필터링, 매핑, 집계가 쉬워지며 코드가 간결해진다.
Java는 매우 광범위하게 사용되고 있으며, 그 자체가 오픈소스 언어이기도 하다. 때문에 apache와 같은 다양한 오픈소스 라이브러리가 제공되고 있어 프로그램 개발 시간을 단축하면서 높은 안정성을 가진 프로그램 개발이 가능하다.
Java는 JVM에 의해 이진 파일로 번역된 후에 실행하는 과정을 거쳐야 하므로 C, C++에 비해서는 속도가 느리다. 하지만 전반적 하드웨어 기술 발전 및 JIT 컴파일러와 같은 기술 적용으로 JVM의 성능이 향상되어 큰 격차가 나진 않는다.
이 글은 점프 투 자바를 읽고 스터디한 글입니다.