상세 컨텐츠

본문 제목

Java 공부 1주차 과제

Java 공부/Java 주차별 공부

by Banjosh 2022. 12. 9. 06:49

본문

학습할 것

 1. JVM이란 무엇인가

 2. 컴파일 하는 방법

 3. 실행하는 방법

 4. 바이트코드란 무엇인가

 5. JIT 컴파일러란 무엇이며 어떻게 동작하는지

 6. JVM 구성요소

 7. JDK와 JRE의 차이

---------------------------------------------------------------

Q1. JVM이란 무엇인가

A1. JVM은 Java Virtual Machine의 약자로 '자바 가상 머신'이라 불린다. C언어의 경우 소스코드를 컴파일하면 실행파일이 생성돼 OS에서 실행이 가능하다. 이 경우 OS마다 컴파일러가 있고 윈도우 컴파일러에서 컴파일된 실행파일은 리눅스에서 실행되지 않는 것처럼 한 번 컴파일 되면 다른 OS에서 지원되지 않는다. 이와 달리 Java를 OS에서 실행하기 위해서는 소스코드(.java)를 자바 컴파일러를 통해 바이트 코드(.class)로 컴파일한 뒤 OS에 맞는 JVM으로 실행파일로 바꿔줘야 한다. 컴파일 하면 다른 OS에선 쓸 수 없는 C언어와 다르게 Java는 컴파일을 해도 원하는 OS에 맞는 JVM을 이용해 어떤 OS에도 사용할 수 있다. 여기서 JVM은 OS마다 따로 존재합니다.(Java는 플랫폼에 종속적이지 않지만 JVM은 플랫폼에 종속적이다.)

 

Q2. 컴파일 하는 방법

A2. 컴파일이란 우리가 쓰는 언어를 컴퓨터가 이해할 수 있도록 통역하는 작업을 말한다. 하지만 Java에서는 컴파일을 해도 바로 컴퓨터가 이해할 수 있는 기계어로 번역되는 것이아닌 바이트코드라는 반기계어로 번역되기 때문에 후에 작업이 더 필요하다.

- 컴파일 하는 과정

 1. 자바 컴파일러는 자바 개발 키트(JDK)에 포함되어 있기 때문에 컴파일을 위해 우선 JDK가 필요하다.(JDK의 bin폴더에 javac.exe 존재)

 2. 자바 언어 사양(JLS)를 충족하는 자바 소스코드(.java) 파일을 작성한다. (=자바 문법에 맞는 소스코드 작성) 

 3. 자바 컴파일러(javac.exe)를 통해 자바 소스코드(.java)를 자바 가상 머신 사양(JVMS)을 충족하는 바이트코드(.class)로 컴파일 한다. (JVM이 이해할 수 있는 언어인 바이트코드로 변환)

 4. *.class 파일이 생성된 것을 확인 할 수 있다.

(자바파일이 있는 곳으로 이동 > javac *.java 로 컴파일 > *.class 파일 생성)

 

Q3. 실행하는 방법

A3. 컴파일한 바이트코드(.class)를 JVM(java.exe)을 통해 실행할 수 있다. (java.exe : JVM을 구동시키기 위한 명령 프로그램)

(바이트코드파일이 있는 곳으로 이동 > java (.class를 제외한 파일이름) > 파일 실행)

 

Q4. 바이트코드란 무엇인가

A4. CPU가 이해할 수 있는 언어가 바이너리 코드(!=기계어) 라면, 바이트 코드는 JVM이 이해할 수 있는 바이너리 코드다. 즉 고급언어로 작성된 소스코드를 JVM이 이해할 수 있는 중간 코드로 컴파일해서 어떤 플랫폼에도 종속되지 않고 실행될 수 있게 만든 JVM용 기계어코드다.

 

Q5. JIT 컴파일러란 무엇이며 어떻게 동작하는지

Q5. JIT(Just In Time)컴파일러는 JRE(실행엔진)안에 존재하고, 기존의 인터프리터 방식으로 명령어를 하나씩 실행하게끔 이루어져 실행 속도가 느렸던 자바의 컴파일 방식을 개선한 것이다. 동작하는 방식을 살펴보면, JIT 컴파일러는 전체 바이트 코드를 한번에 컴파일 한 뒤, 네이티브 코드로 캐싱해둔다. 나중에 캐싱해둔 코드를 다시 사용할 경우, 재컴파일 하지 않고 바로 사용한다. 단, 처음 컴파일 시간이 길기 때문에 여러번 사용된다고 판단한 코드에 한해 JIT컴파일러가 동작하고 나머지는 기존의 인터프리터 방식으로 처리한다.

(인터프리터 방식: 런타임에 한 줄씩 읽고 해석하고 실행하는 방식 / 컴파일 방식 : 코드를 한번에 해석한 후 번역본을 해석하는 방식)

 

Q6. JVM 구성 요소

Q6. JVM은 크게 4가지 구성요소로 이루어져 있다. 

 1. 클래스 로더 시스템

      - 우리가 컴파일한 바이트코드(*.class)를 실행시점(RunTime)에 읽어들여서 메모리(Runtime Data Area)에 적절하게 배치하는 것이 클래스로더의 역할이다.(동적으로 클래스를 로딩해준다)

 2. 메모리(Runtime Data Areas)

      - JVM이 프로세스로써 수행되기 위해 OS로부터 할당받는 메모리 영역이다. 목적에 따라 크게 5가지로 나누어진다.

        1) 메소드(Method) 영역 : 클래스 정보,인터페이스,메소드 ,필드,Static 변수 등이 저장 (클래스 구조를 바이트코드로 저장)

        2) 힙(Heap) 영역 : new 키워드로 생성된 객체와 배열이 생성되는 영역 (힙, 메소드 영역 : 모든 쓰레드가 공유해서 사용 /GC의 대상)

        3) 스택(Stack) 영역 (Java Stack) : 지역변수, 매개변수, 리턴 값, 연산에 사용되는 임시 값 등이 생성되는 영역

        4) PC (PC registers) 영역 : 쓰레드가 생성될 때마다 생성되는 영역으로 프로그램 카운터, 즉 현재 쓰레드가 실행되는 부분의 주소와 명령을 저장하고 있는 영역

        5) 네이티브 메소드 스택 영역 : 자바 이외의 언어(C, C++, 어셈블리 등)로 작성된 네이티브 코드를 실행할 때 사용되는 메모리 영역으로 일반적인 C 스택을 사용한다. JNI를 통해 바이트 코드로 전환하여 저장 (스택, PC, 네이티브 메소드 스택 영역 : 쓰레드 마다 하나씩 생성)

 3. 실행 엔진(Execution Engine)

      - Class Loader를 통해 JVM 내의 Runtime Data Areas에 배치된 바이트코드를 명령어 단위로 읽어서 실행

      - 두가지 방식의 조합을 통해 실행

        1) JIT 컴파일러 : 인터프리터의 단점을 보완하기 위해 도입

        2) 인터프리터 : 바이트코드 명령어를 하나씩 읽어서 해석하고 실행한다. 한 줄씩 수행하기 떄문에 느림

 4-1. JNI(Java Native Interface)

      - 자바 애플리케이션에서 C, C++, 어셈블리로 작성된 Native 키워드를 사용한 함수를 사용할 수 있는 방법 제공

      - C,C++ 등 언어로 작성된 함수를 사용할 수 있는 인터페이스 제공

 4-2. Native Method LIbrary 

      - C, C++로 작성 된 라이브러리

 

Q7. JDK와 JRE의 차이

Q7. JRE(Java Runtime Environment)는 자바 런타임 환경으로 JVM과 Java Class Library(자바 클래스 라이브러리) 등으로 구성되어 있다. 이들은 컴파일된 java 프로그램(*.class)를 실행하는데 필요한 패키지이다.

      JDK(Java Development Kit)는 자바 개발 키트로 Java를 사용하기 위해 필요한 모든 기능을 갖춘 Java용 SDK(Software Development Kit)이다. JDK는 JRE뿐 아니라 컴파일러(javac)와 jdb, javadoc 등과 같은 도구들도 포함되어 있다. 

      즉 , JDK는 프로그램을 생성, 실행, 컴파일 할 수 있고 JRE는 JDK에 포함되어 있으며 컴파일 된 Java프로그램을 실행 할 수 있다. 그리고 JRE에 포함되어 있는 것이 JVM 이다.

( JDK = JRE + Development Kit / JRE = JVM + Library)

'Java 공부 > Java 주차별 공부' 카테고리의 다른 글

Java 공부 3주차 과제  (0) 2022.12.22
Java 공부 2주차 과제  (0) 2022.12.20

관련글 더보기