메이쁘

[Java] Java란 무엇일까? Java는 어떻게 동작되고 컴퓨터에서 실행되는 걸까? 본문

Language/JAVA

[Java] Java란 무엇일까? Java는 어떻게 동작되고 컴퓨터에서 실행되는 걸까?

메이쁘 2020. 9. 6. 22:16

안녕하세요.

 

 

어떤 계기를 통해 가장 원초적인 지식을 되짚어보고 정리하는 시간을 갖게 되었습니다.

 

신입생 시절 처음 접했던 언어인 Java

 

이 Java에 대해 기초부터 정리하고, 글 제목의 질문에 대한 정답을 적어보겠습니다.

(부제 : Java를 Java보자!)

 

 

 

Java란 무엇일까?


  -  프로그램을 만드는 프로그래밍 언어 중 하나. 1995년에 발표되었으며, 썬 마이크로시스템즈에서 개발함.

 

  -  가장 큰 특징은 바로 객체 지향적 프로그래밍 언어. (OOP : Object-Oriented-Programming)

그럼, 객체 지향적 프로그래밍은 무엇일까?

*** 이전 포스팅으로 가서 한번 점검하고 와도 좋습니다!

 

  -  OS(운영체제)에 상관없이 JVM(Java Virtual Machine) 만 있으면 코드를 실행할 수 있습니다.

      ->  처음에는 이러한 특징으로 인해 다른 언어(C, C++) 보다 한 번 더 돌리고 실행되기 때문에 속도가 느리고 메모리를 많이 차지했습니다. 하지만, WEB이 나오고나서부터 단숨에 인기를 차지했는데요. 그 이유는 각 기업 뿐 아니라 웹을 운영하는 곳 어디든 서버를 사용하게 되면서, 서버OS에 상관없이 한 번만 작성하면 실행할 수 있기 때문입니다.

      ->  만약, C언어였으면 해당 OS에 맞춰서 일일히 변환시켜줘야했습니다. 엄청 불편하죠?

 

  -  그렇기 때문에, 확장성이 엄청납니다(호환성이 높다). 다양한 애플리케이션을 쉽게 개발할 수 있습니다.

 

  -  그 외, Java는 스스로 메모리 관리를 하기 때문에, 사용자가 일일히 메모리를 관리할 필요가 없습니다.

      ->  Garbage Collection(가비지 컬렉션)이 존재하기 때문에, 메모리를 사용하지 않는 부분은 자동으로 메모리를 해제한다.

 

  -  뿐만 아니라, 시스템과는 상관없이 멀티 쓰레드를 지원합니다.

 

 

 

중간정리

 

Java 특징

  -  객체 지향적 프로그래밍 언어

  -  OS에 상관없이 JVM 만 있으면 자바 코드 실행이 가능

  -  Garbage Collection(가비지 컬렉션) 이 존재해서 스스로 메모리를 관리하며, 사용하지 않는 부분은 메모리를 해제합니다.

  -  멀티 쓰레드 지원

 

 

그럼, Java는 JVM 이 있어야 동작한다는건데..

동작 원리를 알기 위해선 우선 JVM을 알아봐야겠습니다.

 

 

JVM(Java Virtual Machine) 이란 ?


  -  자바 가상 머신.

 

  -  Java의 Byte 코드를 OS에 맞게 실행해주는 역할 수행(Java 언어를 CPU나 OS의 종류와 상관없이 실행할 수 있게 해줍니다.)

  

  -  우리가 Java 언어를 사용해서 코드를 작성합니다. 하지만, 이건 우리 사람들끼리 알아볼 수 있는 언어일 뿐입니다. 실제 컴퓨터는 0과 1만 읽을 수 있기 때문에, java 언어를 당연히 바로 읽을 수 없습니다. 

** 마치, 한글만 읽을 수 있는데 영어를 갖다주면 읽을 수 없는 것과 같습니다.

 

그럼, 컴퓨터는 Java 코드를 어떻게 실행시킬까요?

 

중간에 Java 코드를 컴퓨터가 읽을 수 있는 언어(기계어) 로 변환시켜주면 됩니다!

*** 마치, 영어를 한글로 번역해주는 것과 같습니다.

*** 이것도 컴파일이라고 보시면 됩니다.

 

 

 

Java 동작 과정

 

더 자세하게는,

 

Java 코드 ---> (컴파일) ---> Java Byte 코드(class 파일) ---> (컴파일) JVM에서 기계어로 바꿔서 실행시킴(실행은 인터프리팅)

 

과정을 거칩니다.

 

그래서 C나 C++ 같은 경우에는 컴파일 단계에서 바로 코드 --> 기계어 로 변환하기 때문에,

Java보다는 속도가 빠르다는 장점이 있다고 했슴죠.

 

 

 

Java 동작 과정

 

 

흠.. 이렇게 그리고 보니 못알아먹는 단어들이 많네요.. 죄송합니다.

 

 

 

  -  Class Loader : class 파일들을 묶어서 Runtime Data Area 로 적재하는 역할을 수행합니다. 자바 애플리케이션이 실행중일 때 이 작업이 수행된다고 하네요..!

  -  Runtime Data Area : 자바 메모리 공간 이라고 생각하시면 됩니다. 자바 애플리케이션 실행 시 사용되는 데이터들을 담아두는 영역입니다. OS로부터 할당받아 사용합니다.

  -  Execution Engine : 기계어로 변경해 명령어 단위로 실행하는 역할을 수행합니다. 

      -> Interpreter(인터프리터) 방식 / JIT(Just - In - Time) 컴파일러 이용하는 방식 존재. 주로 이 둘을 병행한다.

    *** Interpreter 방식 : 명령어 하나하나 실행함.

    *** JIT 방식 : Byte 코드를 Native 코드로 변경해서 이 Native 코드를 실행함.

 

  - Javac.exe : Java 컴파일러인 Javac.exe 로 temp.java를 temp.class 클래스 파일로 컴파일합니다.

 

javac.exe 는 JDK(Java Development Kit) 이다. (출처 : 생활코딩)

 

 

 

점점 혼란스러워집니다..

 

 

마지막으로, Runtime Data Area(자바 메모리 공간) 내부에 있는 5개의 Area에 대해 어떤 역할을 맡고있는지 알아볼까요?

 

 

Runtime Data Area 내부 영역들에 대해 !


  -  Method Area(메소드 영역) = static Area 라고도 함.

      ->  모든 쓰레드가 공유하는 영역 중 하나.

      ->  전역 변수, static 변수, final class 변수 등을 저장합니다.

      ->  이에 더해, class와 interface에 관련된 data를 저장합니다. (런타임 상수풀, 필드 / 메소드, 메소드 / 생성자 코드 등)

 

 

  

  -  Stack Area

      ->  각 쓰레드마다 하나씩 존재하며, 쓰레드 시작 시 할당

      ->  기본 자료형(int, double, byte, long, boolean 등) 에 해당하는 지역 변수의 데이터 값이 저장되는 공간.

      ->  만약, int a = 100; 을 실행하면, Stack Area 내 메모리에 이름이 a이고, 값이 100인 공간이 생깁니다.

      ->  만약, A a = new A(); 을 실행하면, Stack Area 내 메모리에 이름이 a이고, 실제 인스턴스 A 정보는 Heap Area에 저장되기 때문에 Stack Area의 메모리 a에는 Heap Area 내 인스턴스 A의 주소값을 가지고 있습니다. (참조하고 있습니다.)

      ->  메소드 호출 시 메모리가 할당되고, 메소드 종료 시 메모리가 해제됩니다.

 

 

 

-  Heap Area

    ->  모든 쓰레드가 공유하는 영역 중 하나.

    ->  new 키워드로 생성된 인스턴스와 배열이 동적으로 메모리 할당되는 영역

    ->  Stack Area의 변수나 다른 인스턴스의 필드에서 참조합니다.

    ->  Method Area 에 저장된 클래스만 생성이 가능합니다.

    ->  Garbage Collector가 참조되지 않은 메모리를 확인해서 메모리를 제거합니다.

 

 

 

-  PC Register

    ->  각 쓰레드마다 하나씩 존재하며, 쓰레드 시작 시 생성

    ->  현재 쓰레드가 실행되는 명령의 주소와 값을 가지고 있습니다.

    ->  그렇기 때문에, 현재 명령이 끝나면 값을 증가시켜 다음 해당하는 값의 명령을 실행시킵니다.

 

 

 

-  Native Method Stack

    ->  각 쓰레드마다 하나씩 존재합니다.

    ->  자바 외 언어(C, C++ 등) 로 작성된 Native 코드를 동작하기 위한 메모리 영역 및 Stack

    ->  JNI 를 사용합니다.

 

    ***  JNI(Java Native Interface) : JVM 위에서 실행되고 있는 자바 코드가 자바 외 언어로 작성된 코드나 라이브러리를 호출하거나 반대로 호출되는 것을 가능하게 해주는 프로그래밍 프레임워크. 이를 통해, Java 메서드 호출 시 C, C++ 함수를 실행되게 할 수 있습니다. (그 반대도 가능)

    ***  그래서 보통 안드로이드에서 JNI를 통해 C/C++로 앱 루팅 체크를 합니다. (바로 기계어로 컴파일되기 때문에 해킹 위험도가 낮아서)

 

 

 

모든 쓰레드가 공유하는 영역 : Method Area, Heap Area

각각의 쓰레드가 가지는 영역 : Stack Area, PC Register, Native Method Stack

 

 

 

이상입니다.

 

틀린 부분 있으면 댓글로 지적해주시면 감사하겠습니다.

 

 

 

감사합니다!

 

 

 

참고

https://mommoo.tistory.com/71

https://jdm.kr/blog/188

https://jeong-pro.tistory.com/148?category=793347

https://sieunlim.tistory.com/2

https://ko.wikipedia.org/wiki/%EC%9E%90%EB%B0%94_(%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D_%EC%96%B8%EC%96%B4)

 

Comments