[자바] Java와 JVM

2020. 5. 6. 12:32TIL/자바

'자바를 왜 사용해?' 라는 질문에 나는 어느 정도까지 대답을 할 수 있을까.

배웠던 내용을 찬찬히 생각해본다면 여러 이유를 찾아낼 수 있겠지만,

즉각적으로 대답할 수 있는 내용은 매우 적었다.

자바가 객체지향 프로그래밍을 지원하는 언어이니까?

웹 어플리케이션 개발에 가장 많이 사용되는 언어이니까? .. 정도....?

내가 사용하는 언어이면서 이정도밖에 대답이 나오지 않는다는 것은 참 부끄러운 일이다.

한번쯤 찾아보았던 내용이지만, 정리를 해두지 않아서 계속 잊어버리는

자바의 기원에 대해서 간략하게 정리해보려고 한다.

또한, 자바가 강력할 수 있는 근본적 이유인 JVM에 대해서도 간단히 정리하겠다. 

 

1. Java의 기원

자바는 썬 마이크로시스템즈의 제임스 고슬링이 개발한 프로그래밍 언어이다. (물론, 혼자 개발하지는 않았을것이다.)

1995년 5월 23일 처음으로 발표되었던 자바는 사실 가전제품 내에 탑재되는 프로그램을 위해 개발 되었다고 한다.

당시에는 유닉스 기반의 프로그램이 지배적이었는데, 이때 사용했던 C/C++의 특성상 여러 하드웨어를 커버하기 위해서는 같은 기능의 소스를 여러번 컴파일 해주어야 했다고 한다. 이러한 불편함에서 탄생한 것이 바로 자바이다.

자바의 가장 큰 특징이라고 한다면 하드웨어와 운영체제에 대하여 독립적이라는 것이다.

다시 말해, 어느 플랫폼이든 작성한 소스를 변경할 필요 없이 모두 실행시킬 수 있다는 의미이다.

가전제품 내에 탑재하려다가 웹 어플리케이션에서 가장 널리 사용되게 된 이유도 바로 이런 특징 덕분이라고 할 수 있겠다.

무엇이 이 언어를 이렇게 독립적으로 만들어 주느냐 ... 그것이 바로 JVM이다.

 

2. Java의 철학

JVM에 대해 찾아보기 전에, 자바가 추구하는 방향에 대한 궁금증이 생겨서 찾아보았다.

우선, 자바라는 이름에 어떤 의미가 있느냐?  그냥 단어리스트 중 무작위로 뽑은 단어라고 한다. 

프로그래밍 역사에 획을 긋는 언어의 이름이 이런식으로 지어졌다는 것은 허무하면서도 참 매력적인 것 같다.

자바는 다음과 같은 5가지의 핵심 목표를 가지고 있다고 한다.

  • 객체 지향 방법론을 사용해야 한다.
  • 같은 프로그램이 여러 운영체제에서 실행될 수 있어야한다.
  • 컴퓨터 네트워크 접근 기능이 기본적으로 탑재되어 있어야 한다.
  • 원격 코드를 안전하게 실행할 수 있어야 한다.
  • 다른 객체지향 언어들의 좋은 부분만 가지고 와서 사용하기 편해야 한다.

"Write Once, Run Anywhere"이라는 첫 슬로건으로부터 압축된 철학을 이해할 수 있겠다.

 

3. JVM

위의 그림만 봐도 JVM의 역할을 짐작할 수 있을것이다.

자바 프로그램이 운영체제에 독립적일 수 있는 이유는 JVM이 프로그램과 운영체제 사이에 존재하기 때문이다.

(JVM이 운영체제에 독립적이지는 않다. 각 운영체제에 맞는 JVM을 설치해주어야 한다. 설치한번으로 프로그램을 독립적인 존재로 만들어 주니까 설치를 해야한다는 것을 단점으로 생각하지는 말아야 겠다.)

 

그렇다면 이 JVM은 어떻게 프로그램을 운영체제로부터 독립적으로 만들어 주는 걸까?

이를 이해하기 위해서는 자바 코드가 실행되는 과정을 알아야한다.

모두 알면 좋겠지만 일차적 정리 단계인 지금에서는 간단히 이해해 보겠다.

먼저 자바소스파일(프로그램)은 JVM에 도착하기전에 javac을 통해서 중간코드인 Java Byte Code(.class)로 컴파일 된다.

그리고 .class파일이 JVM에서 각 플랫폼에 맞게 실행되는 것이다. (각 운영체제의 메모리를 관리하게 된다.)

개발자가 해줄 것은 단지 자바소스파일을 작성하면 되는 것이다.

이 부분을 공부하면서 Compiler에도 프론트와 백이 나누어져 있다는 것을 알게 되었다.

 

4. JVM의 내부 구조

위의 그림에서 보면 알 수 있듯이 JVM은 다양한 요소들의 상호작용으로 돌아간다.

세부적인 내용은 다음에 따로 정리하고, 지금은 큰 흐름에 대해 정리하고자 한다.

1) Class Loader

자바에서 소스를 작성하면 .java파일이 생성된다.

.java 소스를 컴파일하면 javac에 의해 .class파일이 생성된다.

이렇게 생성된 .class파일들을 엮어서 JVM이 운영체제로부터 할당받은 메모리 영역인 Runtime Dara Area로 적재하는 역할을 Class Loader가 하게된다. 

2) Excution Engine

Class Loader에 의해 메모리에 적재된 클래스들을 기계어로 변경해 명령어 단위로 실행하는 역할을 하는것이 Excution Engine이다.

명령어를 하나 하나 실행하는 Interpreter방식이 있고 Just In Time(JIT)컴파일러를 이용하는 방식이 있다.

JIT 컴파일러는 적절한 시간에 전체 바이트 코드를 네이티브 코드로 변경해서 Excution Engine이 네이티브로 컴파일된 코드를 실행하는 것으로 성능을 높이는 일종의 방식이다.

3) Runtime Data Area

JVM의 메모리 영역을 의미한다. 

자바 어플리케이션을 실행할 때 사용되는 데이터들을 적재하는 영역이다.

위의 그림과 같이 크게 Method Arae, Heap Area, Stack Area, PC register, Native Method Stack으로 나누어진다.

각각의 용도에 대해서는 JVM을 구체적으로 정리하겠다.

 

'TIL > 자바' 카테고리의 다른 글

[자바] 사다리 게임 구현  (0) 2020.05.24
[자바] 로또 게임 구현  (0) 2020.05.18
[자바] getter메소드 사용을 지양하자  (0) 2020.04.25
[테스트] JUnit 과 AssertJ  (0) 2020.04.23
[자바] 레이싱 게임 구현  (0) 2020.04.22