Java란?
Java는 썬 마이크로시스템즈의 제임스 고슬링이라는 사람과 다른 연구원들이 객체 지향 언어로 개발한 프로그래밍 언어이다.
처음에는 가전제품 내에 탑재해 동작하는 프로그램을 위해 개발했는데, 현재는 웹 어플리케이션 개발에 가장 많이 사용하는 언어 중 하나가 되었다.
장점
- 운영체제에 독립적이다.
- JVM에서 동작하기 때문에 특정 운영체제에 종속되지 않는다.
- 객체지향 언어이다.
- 객체지향적으로 프로그래밍 하기 위해 여러 언어적 지원을 하고 있다. (캡슐화, 상속, 추상화, 다형성 등)
- 객체지향 패러다임의 특성상 비교적 이해하고 배우기 쉽다.
- 자동으로 메모리 관리를 해준다.
- JVM에서 Garbage Collector라고 불리는 데몬 쓰레드에 의해 Garbage Collection이 일어난다.
- 별도의 메모리 관리가 필요 없으며 비지니스 로직에 집중할 수 있다.
- 오픈 소스이다.
- OpenJDK라는 오픈소스가 존재한다.
- 많은 개발자가 존재하고 생태계가 잘 구축되어있다. 덕분에 오픈소스 라이브러리가 풍부하며 잘 활용한다면 짧은 개발 시간 내에 안정적인 애플리케이션을 쉽게 구현할 수 있다.
- 멀티 스레드를 쉽게 구현할 수 있다.
- 스레드 생성 및 제어와 관련된 라이브러리 API를 제공하고 있기 때문에 실행되는 운영체제에 상관없이 멀티 스레드를 쉽게 구현할 수 있다.
- 동적 로딩(Dynamic Loading)을 지원한다.
- 애플리케이션이 실행될 때 모든 객체가 생성되지 않고, 각 객체가 필요한 시점에 클래스를 동적 로딩해서 생성한다.
- 유지보수 시 해당 클래스만 수정하면 되기 때문에 전체 애플리케이션을 다시 컴파일 할 필요가 없다. 이로인해 쉽고 빠른 유지보수가 가능하다.
단점
- 비교적 속도가 느리다.
- 자바는 한 번의 컴파일링으로 실행 가능한 기계어가 만들어지지 않고 JVM에 의해 기계어로 번역되고 실행하는 과정을 거치기 때문에 C/C++ 같이 컴파일 단계에서 만들어지는 완전한 기계어보다는 속도가 느리다.
- 그러나 하드웨어의 성능 향상과 바이트 코드를 기계어로 변환해주는 JIT 컴파일러 같은 기술 적용으로 JVM의 기능이 향상되어 격차가 많이 줄었다.
- 예외처리가 불편하다.
- 프로그래머 검사가 필요한 예외가 등장한다면 무조건 프로그래머가 선언을 해줘야 한다.
자바 코드 실행 과정
1. 프로그램이 실행되면, JVM은 운영체제로부터 이 프로그램이 필요로 하는 메모리를 할당 받는다. JVM은 이 메모리를 용도에 따라 여러 영역으로 나누어 관리한다.
1. 자바 컴파일러(JAVA Compiler)가 자바 소스 코드(.java)를 읽고 자바 바이트 코드(.class)로 변환시킨다.
2. 컴파일 된 바이트 코드를 JVM의 클래스 로더(Class Loader)에게 전달한다.
3. 클래스 로더는 동적 로딩(Dynamic Loading)을 통해 필요한 클래스들을 로딩 및 링크하여 런타임 데이터 영역(Runtime Data Area), 즉 JVM의 메모리에 올린다.
4. 실행 엔진(Execution Engine)은 JVM 메모리에 올라온 바이트 코드들을 해석한다.
5. 해석된 바이트 코드들은 메모리 영역에 배치되어 실직적인 수행이 이루어진다. 이러한 실행 과정 속에서 JVM은 필요에 따라 스레드 동기화나 가비지 컬렉션 같은 메모리 관리 작업을 수행한다.
[참고]