- Today
- Yesterday
- Total
메이쁘
[Java] Java란 무엇일까? Java는 어떻게 동작되고 컴퓨터에서 실행되는 걸까? 본문
안녕하세요.
어떤 계기를 통해 가장 원초적인 지식을 되짚어보고 정리하는 시간을 갖게 되었습니다.
신입생 시절 처음 접했던 언어인 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보다는 속도가 빠르다는 장점이 있다고 했슴죠.
흠.. 이렇게 그리고 보니 못알아먹는 단어들이 많네요.. 죄송합니다.
- 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 클래스 파일로 컴파일합니다.
점점 혼란스러워집니다..
마지막으로, 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://jeong-pro.tistory.com/148?category=793347
https://sieunlim.tistory.com/2
'Language > JAVA' 카테고리의 다른 글
[Java] JAVA8 Optional Class에 대한 정의 및 사용방법 - Tutorial(Sample) (3) | 2021.12.09 |
---|---|
[Java] ThreadLocal 정의 및 기본 사용법 - Tutorial(Sample) (1) | 2021.12.09 |
[JAVA] JAVA에서 static(정적) 변수 / 메서드 / 클래스 등 static 키워드란 ? (0) | 2020.08.26 |
[JAVA] Integer.parseInt() 와 Integer.valueOf() 의 차이점 간단 설명! (0) | 2020.05.31 |
[JAVA] String, StringBuilder, StringBuffer 의 차이점 (0) | 2020.04.06 |