개요
Java 공부를 시작하고 뭣도 모를 때에 우연히 본 어떤 게시글에서 이런 말을 본 적 있었다.
'Java를 사용하는 개발자라면, 적어도 Java가 어떤 특징을 갖고 JVM이 어떻게 동작하는지는 알아야 합니다.'
이 말을 듣고 한번이라도 이렇게 생각해본 적이 있었나? 싶었고, 부트캠프에 들어와 강사님들이 해주시는 말씀들에서도 JVM의 작동 원리에 대해서는 알고 있어야 한다고 하셨다.
그래서 이제는 어느 정도 공부를 진행한 시점에서 이를 공부해보고자 한다.
Java란?
Java는 프로그래밍 언어 중 하나로 C/C++ 스타일의 장점은 취하고, 사용하지 않는 부분은 삭제한 비교적 쉽게 습득 가능한 언어이다.
Java 언어의 모토로는 "Write Once Run Anywhere"가 있다.
이 말인 즉, 한번 작성한 코드를 어떤 컴퓨터에서든 실행할 수 있도록 하는 것인데 개개인이 가진 컴퓨터마다 CPU가 전부 다르고 받아들이는 기계어가 다른데 어떻게 실행한다는 것이지? 하는게 궁금증이다.
이러한 궁금증은 아래에 후술할 자료들로 설명이 가능하다.
Java의 특징
1. 객체지향 언어
Java를 사용하는 이유이자, 가장 핵심적인 특징.
앞서 객체지향 언어가 특징임을 말했는데, 객체지향이 뭘까?
객체지향 프로그래밍(OOP, Object Oriented Programming)이란 프로그램을 개발하는 기법으로 부품에 해당하는 객체들을 먼저 만들고, 이를 하나씩 조립 및 연결하여 전체 프로그램을 완성하는 것을 말한다.
쉽게 말해 클래스라는 설계도를 이용하여 각 객체를 연결하여 프로그래밍을 만든다는 것이다.
객체지향 언어의 특징으로는 캡슐화, 상속성, 다형성, 추상화가 있다.
2. 높은 이식성
Java는 JRE(Java Runtime Environment)가 설치되어 있는 모든 운영체제에서 실행이 가능하다.
서로 실행환경이 다르더라도 JRE만 설치되어 있다면, 어디서 프로그램을 옮겨도 실행이 가능한 것이다.
3. 오픈소스 라이브러리가 풍부하다.
Java는 오랜 시간 많은 기업들이 사용하고 발전해온 만큼 오픈소스의 양이 방대하다.
내가 구현해야 하는 기능을 담은 코드를 작성하는 것 대신, 검증된 오픈소스 라이브러리를 이용하면 애플리케이션을 다시 컴파일 할 필요가 없다.
그러므로 유지보수를 쉽고 빠르게 진행할 수 있다.
4. 독립적인 플랫폼
이는 앞서 Java에 대해 설명할 때 나온 특징이다.
어떠한 운영체제에서도 자바 언어를 사용가능하다는 점인데 이는 JVM에 의해 실행이 되기 때문이다.
5. 인터프리터 언어
Java는 컴파일 언어이면서 인터프리터(Interpreter) 언어이다.
Java가 텍스트 소스를 컴파일하여 클래스파일로 만든 다음, 자바 런타임이 클래스 파일을 인터프리트 하여 실행된다.
6. 자동 메모리 관리
Java는 개발자가 직접 메모리에 접근할 수 없으며 자바가 직접 관리한다.
그래서 객체 생성 시에는 자동으로 메모리를 할당하고, 사용하지 않을 시에는 객체를 제거시켜 준다.
보통 GC(Garbage Collection)를 실행시켜 메모리 관리를 한다.
이로 인해 개발자는 메모리 관리를 하지 않고 개발에만 몰두할 수 있다.
7. 멀티 쓰레드 구현이 쉽다.
Java의 경우 쓰레드 생성 및 제어와 관련된 라이브러리 API를 제공해서 멀티 쓰레드의 구현이 운영체제와 상관없이 쉽다.
JDK의 구성
그럼 Java랑 JVM만 있으면 아무렇게나 사용이 가능한가? 라고 물어보면, 그렇지는 않다.
Java와 관련된 개발 도구들을 모은 JDK(Java Development Kit)가 있어야 컴파일하거나 JVM을 사용할 수 있게 된다.
JVM의 동작 과정 (= Java 코드의 실행 과정)
그럼 JVM(Java Virtual Machine)은 도대체 어떻게 작동하는건가? 라고 하는 질문에 대해 답해보고자 한다.
앞서 도대체 Java가 어떻게 각기 다른 운영체제마다 똑같이 실행이 가능한 것인지에 대해 언급했다.
이는 JVM의 동작과정을 보면 이해하기 한결 쉬울 것이다.
JVM은 크게 4가지의 과정으로 동작하게 된다.
1. JAVA Source(= 확장자가 .java인 파일)를 JAVA Compiler를 통해 JAVA Bytecode로 컴파일한다.
2. 컴파일된 바이트코드를 JVM의 Class Loader로 전달한다. (여기서 바이트코드란 쉽게 말해 JVM이 읽을 수 있는 어셈블리어라고 보면 된다.)
3. Class Loader는 동적 로딩(Dynamic Loading)을 통해 필요한 클래스들을 로딩 및 링크하여 Runtime Data Area, 즉 JVM의 메모리에 올린다.
4. 메모리에 올린 바이트코드들을 명령어 단위로 하나씩 가져와 Execution Engine에서 실행한다.
각각의 기능에 대한 설명까지 포함하면 더 길어질 것 같아 다음 포스팅에 세세한 부분에 해당하는 게시글을 작성하려고 한다. (사실 해당 영역들의 구성요소나 기능적인 부분에 있어서 공부를 덜 해서 공부를 좀 더 하고 작성하는 걸로...!)
참고자료
https://yaelimeee.tistory.com/70
[JAVA] JVM 동작 원리 및 기본 개념
자바는 OS에 독립적인 특징을 가지고 있다. JVM이 OS와 프로그램의 사이에서 기계어로 행석앻주는 역할을 하기 때문이다. JVM JAVA Virtual Machine 컴파일된 바이트 코드를 기계가 이해할 수 있는 기계
yaelimeee.tistory.com
https://steady-snail.tistory.com/67
[JAVA] JVM 동작원리 및 기본개념
JAVA라는 언어를 통해 코딩을 하고 있는 사람으로서 JAVA의 간단한 탄생배경 그리고 JAVA의 시작과 끝이라고 할 수 있는 JVM을 한 번 짚고넘어가려고 해요 우선 JAVA의 탄생배경을 좀 알고가면 이해하
steady-snail.tistory.com
https://helloworld-88.tistory.com/3
[JAVA] 자바란 무엇인가?
8년을 끈 구글과 오라클의 자바(JAVA) 저작권 전쟁이 오라클의 승리로 막을 내렸다. 그렇다면 과연 자바가 무엇이길래 구글과 오라클에서 이리도 오랫동안 라이센스 분쟁을 벌였던것일까? 썬 마
helloworld-88.tistory.com
'Dev > Java' 카테고리의 다른 글
[Java] enum 매핑한 값 DB에 문자열로 저장하기 (0) | 2023.07.06 |
---|---|
[Java] 객체지향 설계원칙 - SOLID (0) | 2023.06.14 |
[Java] 클래스 메소드와 인스턴스 메소드 (0) | 2023.06.04 |
[Java] 이차원 배열을 정렬하는 법 (0) | 2023.05.29 |
[Java] 추상 클래스와 인터페이스 (0) | 2023.05.26 |