리뷰 - 프로그래밍 언어 JAVA

리브리버·2023년 7월 3일
0

TIL

목록 보기
9/17

이번 시간에는 평소 개발 관련된 영상들을 자주 챙겨보는 널널한 개발자 님의 C/C++ 개발자가 바라 본 프로그래밍 언어 JAVA 영상 리뷰를 해보려고 합니다

영상에서 나온 내용을 주로 하며 추가적으로 궁금한 부분은 따로 첨부하였습니다

기본 특징

  • JVM 기반에서 작동하는 OOP 언어
  • C/C++ 의 가장 큰 특징인 메모리 관리와 책임이슈를 구조적으로 제거
  • OS(혹은 Platform)에 대한 의존성 없음
  • 컴파일러, 인터프리터 특징을 모두 가짐
  • 문법적으로 C/C++와 매우 유사

첫번째,

중요 특징인 컴파일러, 인터프리터 특징을 지닌 다는 것은 JVM인 가상머신과 관련지어 생각할 수 있습니다

JVM은 .java 코드를 특정 OS에 맞게 변환시켜주는 역할인데 이 과정에서 컴파일러와 인터프리터의 2가지 특징들이 모두 사용됩니다

크게 살펴보면 자바 컴파일러인 javac를 통해 .java 파일을 바이트 코드 클래스 파일 .class 로 컴파일 합니다 즉, javac는 .java 파일을 JVM을 위한 바이트 코드로 변환하는 것 입니다 여기서 .class 파일형식은 excutable binary format이라고 생각할 수 있습니다

그리고 JVM의 Class loader를 통해 .class 코를 loading하여 실질적인 실행이 이루어 진다고 볼 수 있습니다



두번째,

개발자들이 C/C++을 사용하던 시절 메모리 누수 관련한 이슈로 많은 고생을 하였습니다 그래서 이 이슈를 구조적으로 제거하기 위해 JAVA 진영에서는 가비지 콜렉터인 GC를 사용합니다

개발자가 메모리를 할당하는 키워드인 new 라는 것은 있습니다 하지만 JAVA에서 메모리를 해제하는 Delete와 같은 키워드는 없습니다 즉, "생성은 개발자 너네가 하되 메모리 해제는 우리가 할게!" 가 되는 것입니다



세번째,

Hello JAVA 출력

package com.test;

public class Main {
	public static void main(String[] args) {
    	System.out.println("Hello, JAVA");
    }
}

이를 빌드하여 실행하면
Hello, JAVA 라고 잘 나옵니다

여기서 그렇다면 JAVA를 가지고 실행을 할텐데 이 JAVA는 JDK 파일 안에 있는 java.exe 를 의미합니다 이 java.exe 파일이 JVM 프로세스가 되는 것이고 이 JVM이 load 한 .class 라는 byte code 의 뭔가가 있었을 것입니다

이를 자바에서는 16진수로 분석 해보았습니다

아래는 JAVA class file format 입니다

(class file format 관련 자바 공식 홈페이지 - Chapter 4. class file format)

JAVA class file format은 Java 바이트코드를 저장하고 전송하기 위한 표준 형식입니다. 클래스 파일은 JVM(Java Virtual Machine)에서 실행될 수 있는 중간 형식으로, 소스 코드를 컴파일하여 생성된 .class 파일이라고 할 수 있습니다.

Java 클래스 파일 형식은 JVM에서 클래스를 로드하고 실행하는데 필요한 정보를 포함하고 있습니다

위 그림은 class file format 이며 위에서 u4는 4Byte로된 자료라는 것이고, u2는 2Byte로 된 자료라는 의미 입니다

위 그림은 class file format 을 16진수로 표현한 것이며 각 칸은 1Byte를 의미합니다
(byte code는 아닌 것 같음)

여기서 중요하게 볼 부분은 개발자가 입력한 "Hello, JAVA" 인 문자열 입니다

이러한 문자열은 실행 시 정적 메모리에 로딩하게 되어있습니다 즉 자바에서는 .class 파일에 저장되어 있습니다

여기서 보면 신기한 점들이 몇가지 있습니다

여러 문자열들이 들어있는데 특정 문자가 오기전에 점이 3개가 있는 것 입니다
점 3개는 3Byte를 의미하며 마지막 Byte에서의 숫자가 다음 Byte의 개수에 대한 정보를 가지고 있었습니다 Hello, JAVA의 경우 0B 라는 Byte 정보가 있었는데 B가 의미하는게 11이며 "Hello, JAVA"의 문자 개수와 일치하는 것을 볼 수 있습니다

네번째,

Machine 과 VM

위 그림에서 Virtual CPU 부분이 JVM을 의미합니다
JVM은 가상 머신이며 이는 소프트웨어로 구성된 CPU라고 할 수 있습니다

JVM 은 java.exe로 실행이 되며 JVM은 java.exe로 볼 수 있습니다
그렇다면 JVM은 실행이 될때 JVM 이 하나의 Process로 존재하며 그 안에 .class 파일내에 들어 있는 byte code들을 인터프리트 하여 실행을 합니다 그리고 여러 동시성 적용을 시작한다면 여러개의 스레드가 생성이 될 것이며 이는 JVM이 관리하게 되는 것 입니다

그리고 가상 메모리 공간(VMS)은 JVM의 경우 JVM 수준에서 할당을 받는다고 볼 수 있습니다
만약 .class가 n개가 되었다고 한다면 이들은 모두 해당 VMS를 공유한다고 볼 수 있습니다

0개의 댓글