객체지향(Object-Oriented)
자바는 객체지향 언어(Object Oriented Programming)로 OOP 언어라고도 하며 객체지향 개념이 적용된 C++을 기초로 하여 만들어진 언어입니다.
절차지향 언어인 C언어와 반대되는 특성을 가졌는데요, 절차지향과 객체지향은 이후에 한번 더 다루도록 하겠습니다.
객체지향을 하게 되면 재사용성(Reusability)을 높일 수 있습니다.
- 단순히 코드의 재사용을 넘어선 객체의 재사용을 뜻합니다.
- 프로그램 개발에 필요한 수많은 클래스 라이브러리들을 API로 제공합니다.
단순(Simple), 메모리 자동 관리
C/C++의 복잡한 기능을 제외하여 코드를 단순하게 작성할 수 있습니다.
대표적으로 그 기능에는 C++ 전위처리, 포인터 사용, 다중 상속, 구조체, goto문, 연산자 중복 등이 있습니다.
그리고 가비지 컬렉터(Garbage Collector)에 의한 자동 메모리 관리로 할당된 메모리 해제를 신경쓰지 않아도 됩니다.
객체를 생성할 때 자동적으로 메모리 영역을 찾아 할당하고, 사용이 완료되면 사용하지 않는 객체를 제거합니다.
반대로 C/C++의 경우 동적 할당한 변수는 Free, delete를 통해 메모리 할당을 직접 해제시켜줘야 하죠.
분산 처리(Distributed)
분산 환경에서 TCP/IP 등의 프로토콜을 통해 효율적으로 실행할 수 있도록 설계된 언어입니다.
- TCP/IP 네트워크 기능 내장
- HTTP, FTP 등과 같은 프로토콜을 쉽게 사용할 수 있도록 라이브러리 제공
서로 다른 컴퓨터 상의 객체들도 원격으로 호출하여 실행할 수 있는 원격 메서드 호출과 관련된 RMI(Remote Method Invocation) 기능의 라이브러리 제공합니다.
컴파일러(Compiler)&인터프리터(Interpreter)
자바는 컴파일 언어임과 동시에 인터프리터 언어입니다. 컴파일러를 통해 class파일로 만들어지고 동시에 인터프리터로 기계어로 번역이 됩니다.
안전(Secure)
컴파일 시에 엄격하게 데이터 타입을 검사함으로써 프로그램 실행 시 발생할 수 있는 비정상적인 상황을 미리 방지합니다.
바로 위 컴파일러&인터프리터 특징의 그림을 세분화 하면 아래와 같습니다.
높은 이식성, 플랫폼 독립(Architecture Neutral)
이식성이란, 사용하는 운영체제나 CPU 등의 하드웨어 사양에 관계 없이 실행될 수 있다는 말이며 이는 JAVA의 큰 특징중 하나입니다.
자바 실행 환경(Java Runtime Environment,JRE)이 설치되어 있다면 모든 운영체제에서 실행이 가능합니다. 개인적인 경험으로는 C++을 리눅스에서 코딩하고 Windows로 옮겼을 때 소스코드가 실행되지 않는 문제를 겪었는데 JAVA는 이런 문제점이 없다고 합니다!
JRE가 설치된 모든 플랫폼은 자바 가상 머신(Java Virtual Machine,JVM)이 되고, 작성된 코드는 JVM에 맞춰 컴파일 됩니다. 그리고 JVM이 OS에 맞춰 기계어로 컴파일 번역되는 과정을 거치게 됩니다. 이렇게 OS에 종속되지 않는 것을 '동적 로딩(Loading)'이라고 합니다.
이러한 특징으로 속도가 느리다는 단점이 있습니다. 하지만 이 점은 JIT(Just In Time) 컴파일러의 적용으로 개선되고 있으며 단순히 이 점 하나로 "자바는 느리다!" 라고 일반화 하기는 힘들 것 같습니다. 이 점 외에 자바가 빠른 부분도 있으니까요.
JIT 컴파일
프로그램을 실행하는 시점에(실시간) 기계어로 번역하는 컴파일 기법. 그래서 Just In Time이라는 단어를 사용한다.
멀티스레드(Multithread)
스레드 생성 및 제어와 관련된 라이브러리 API를 제공하고 있기에 멀티 스레드를 쉽게 구현할 수 있습니다.
참고한 페이지