2023.11.25

근 5년정도 자바를 이용해서 알고리즘과 프로그래밍등을 하는데 기초를 정리할때가 된 것 같아 Basic 시리즈를 준비하게 되었다. 그 첫번째로 자바의 특징을 알아보고 시작하자.

자바의 특징

자바의 장점과 특징을 알아보고 가자.

  • 객체 지향 언어 : 객체 지향언어란, 프로그래밍 기법 중 하나로 객체를 만들고 이 객체를 이용해 조립, 연결등으로 프로그램을 완성하는 것을 의미한다. 객체(Object)는 상태와 행동을 가지는 것으로 사물이나 생물 등등 현실 생활에 있는 것들이 주를 이룬다. 이러한 객체 지향의 특징으로는 캡슐화, 상속성, 다형성이 있다.


  • 이식성, JVM : 자바는 운영체제에 상관없이 JVM 을 통해서 모든 운영체제에서 실행할 수 있다. 즉, 자바를 실행하려면 반드시 JVM 을 거쳐야 하고, JVM이 있는 곳이라면 어디든 실행 가능하다는 이야기 이다. OS 에 종속적이지 않지만, 내부적으로 컴파일을 2번 해야하는데.. 이부분은 추후 다루도록 하겠다.


  • 컴파일 + 인터프리터 언어 : 컴파일언어이자 인터프리터 언어로 2자리 방식을 효율적으로 사용한다. (이는 추후 컴파일 부분에서 더 설명하겠다.)


  • 분산, 멀티 쓰레드 환경 : 자바에는 기본적으로 TCP/IP 라이브러리가 포함되어서 분산 네트워크 개발에 좋다. 또한, 멀티 스레드 개발에도 좋다.


  • 자동 메모리 정리 - GC(Garbage Collector) : 객체 생성 이후, 메모리를 해제하는 부분을 자바가 관리한다. 이렇게 사용 이후 자동으로 메모리를 정리하는 모듈을 가비지 컬랙터 라고 부른다.


  • 동적로딩 : 프로그램이 실행될 때 모든 클래스가 로딩되는 것이 아닌 필요한 시점에 클래스를 로딩시킨다.


단점

위에서 특징과 장점을 말했다면… 이번에는 단점이다.


  • 속도가 느리다. (2번 컴파일해야 해서… 하지만, JIT 컴파일러 도입 이후 속도가 많이 빨라졌다. 여전히 C보다는 느리다.)
  • 강박적인 예외처리 필요
  • 하드웨어 프로그래밍에 어려움


자바의 구조

자바에 특징을 보다보면 오.. 이런게 어떻게 동작하지? 하는 생각이 든다. 구조를 간단히 짚고 넘어가자. 우선 간략한 구조는 다음과 같다.

JDK structure



JDK(Java Development Kit)

JDK 는 우리가 개발을 위한 환경을 제공한다. 예시로는 openjdk 등이 있고 위 그림과 같이 JVM, Library 등이 포함되어 있다.


JRE(Java Runtime Environment)

JRE 는 자바 실행환경으로 자바 프로그램이 실행되기 위한 최소의 구조를 가지고 있다. 그중 큰 부분은 JVM 과 표준 클래스 라이브러리이다.


JVM(Java Virtual Machine)

JVM 은 자바 가상 머신으로 자바 파일을 컴파일하여 실행시키는 컴퓨터 환경이다. 운영체제 환경에 상관없이 동작하기 위해서 해당 운영체제에서 바로 바이트 코드를 읽고 실행시키는 방식이 아니라, JVM이 중간에 위치해 해당 바이트 코드를 다시 운영체제가 읽을 수 있게 변환해주는 역할을 한다. 여기서 컴파일러, JVM의 과정을 한번 풀어보자면 다음과 같다.


컴파일과 JVM 한눈에 보기

컴파일러는 자바코드(.java)를 하드웨어가 읽을 수 있는 바이트 코드(.class)로 바꾸어준다. 여기서 바이트 코드는 기계어가 아니기 때문에 CPU가 받아도 해독할 수 없다. 이 바이트 코드를 변환해주는 가상 머신(가상 CPU)가 필요한데, 이 부분을 JVM 이 해주는 것이다. JVM에서 바이트 코드를 기계어로 변환하면 바로 현재 OS에 전달해 실행하는 것이다.


다른 언어와 차이점

다른 언어의 경우 각 OS 에 맞게 프로그램을 실행하기 위해서는 해당 OS에 맞는 컴파일러는 각각 만들고 설치해야 했다. OS 마다 바이트 저장 방식이 달라서… ㅠㅠ 하지만, JVM이 있으면 그런 걱정이 없기 때문에 자바가 가지는 큰 장점 중 하나이다..!


Development Tools

javadoc 처럼 개발에 도움이 되는 프로그램이 위치한다.



Leave a comment