애증의 자바.. 정리 시작!
1. 자바에 대해서 간단하게 설명해주세요!
자바는 미국의 썬 마이크로시스템즈에서 개발한 객체지향 프로그래밍 언어 입니다.
운영체제에 독립적이고,
메모리를 자동으로 관리해주며,
오픈소스가 다양하고,
멀티스레드를 지원한다는 장점이 있습니다.
1-1. 운영체제에 독립적인 이유는 무엇인가요?
자바에는 JVM이라는 Java Virtual Machine 이 존재하기 때문입니다.
Java complier로 인해 개발자가 작성한 코드가 byte코드(중간코드)로 해석해 주는데,
이 코드를 기계어로 해석하여 실행할 수 있도록 하는 역할을 수행합니다.
이 JVM은 운영체제마다 각각 존재하기 때문에, 운영체제가 서로 달라도 같은 실행결과를 도출하게 됩니다.
그러므로, 운영체제가 독립적이라는 장점을 가집니다.
1-2. 메모리를 자동으로 관리해주는 이유는 무엇인가요?
Java는 해당 객체를 생성하면 자동으로 그 메모리 할당공간을 찾아 할당을 해주고,
만약 그 객체가 실행이 완료했을 시, 즉 종료되었을 때 Garbage Collector가 그 객체를 삭제하기 때문입니다.
2. JVM 에 대해 자세하게 설명해주세요.
JVM Java Virtual Machine으로, Java와 운영체제 사이에 중계자와 같은 역할을 수행합니다.
즉, 어떤 운영체제를 사용하더라도 같은 실행결과를 도출할 수 있도록 도와줍니다.
또한, 가장 중요한 메모리를 관리함으로써 개발자가 일일히 할당된 객체들을 삭제하지 않아도 Garbage Collector가
Garbage Collection을 수행합니다.
- 필요한 이유
프로그램이 실행되려면 운영체제로부터 메모리를 가져와야 합니다.
그래서 C나 C++에서는 운영체제 레벨의 메모리에 직접 접근하여 할당받는 메소드(malloc() 또는 new 연산자)와, 할당받은 메모리를 해제하는 메소드(free(), delete)가 따로 존재합니다.
반면에, 자바는 운영체제의 메모리영역에 직접 접근하지 않고, JVM이라는 가상머신을 이용해서 간접적으로 접근할 수가 있습니다.
JVM은 프로그램이 실행시 운영체제로 부터 요청한 사이즈 만큼의 메모리를 할당받아서 실행하게 됩니다.
즉, 프로그램을 실행하기 위해 운영체제에 직접 접근해서 메모리를 할당받고, 해제했던 C와 C++과 달리
자바에서는 JVM이 이러한 역할을 대신하기 때문에 메모리관리에 더 효율적이고 편리하다는 장점이 있습니다.
2-1. JVM의 구조에 대해서 설명해주세요.
우선 크게 총 세 부분으로 나뉩니다.
클래스 로더 시스템, 메모리, 실행엔진으로 나뉩니다.
우선 클래스 로더 시스템은 byte코드를 읽어오며 메모리에 적절하게 배치하는 역할을 수행합니다.
그다음 메모리는 JVM이 운영체제로부터 할당받은 메모리 공간으로 Runtime Data Area라고 부릅니다.
자바 어플리케이션을 실행할 때 사용되는 데이터들을 적재하는 영역 입니다.
heap, stack, method, PC register, native method stack으로 나뉩니다.
1) heap : new 연산자로 생성된 객체들, 인스턴스들이 할당되는 공간 입니다. 이때, 참조하는 변수나 필드가 없다면 제거대상이 되는 객체로 Garbage Collector의 대상이 됩니다.
2) method: class 수준의 정보들을 저장합니다. class의 이름, 부모 class의 이름, 메소드, 변수 등 과 같은 정보가 저장됩니다.
3) stack : 인스턴스나 지역변수의 참조 주소들을 저장합니다.
4) PC : JVM이 현재 실행중인 명령의 주소를 가지고 있습니다.
5) native method stack : java가 아닌 그 이외의 코드로 작성된 메소드 들을 호출할 때 사용하는 별도의 stack 입니다.
실행엔진에는 클래스 로더에 의해 Runtime Data Area에 적재된 코드들을 기계어로 변경해 명령어 단위로 실행하는 역할을 합니다.이때 바이트코드를 기계어로 바꾸어 일을 수행할 수 있도록 2가지 방법을 이용합니다.
Interpreter 방식과 JIT Compiler 방식이 존재합니다.
1) Interpreter : 실행엔진은 바이트코드를 명령어단위 별로 읽어와서 실행합니다.2) JIT Compiler : 바이트코드에서 반복되는 코드 부분은 미리 네이티브 코드로 변환시켜 놓습니다.인터프리터로 읽을 때의 속도 효율성을 보완하는 형태 입니다.
3. JAVA 프로그래밍의 실행과정을 설명해주세요.
1) Java Compiler : 개발자가 작성한 코드(.java)파일을 컴파일하여 JVM이 해석할 수 있는 byte(.class)코드로 만들어 .class파일에 저장하는 역할을 합니다.
2) Class Loader : 그리고 .class 파일을 읽어와 운영체제로부터 할당받은 메모리공간인 Runtime Data Area 공간에 배치하는 역할을 합니다.
3) 그리고 적재된 클래스파일들을 읽어와 기계어로 변경하여 실행합니다.
4. Java에서는 메모리관리가 어떻게 이루어지나요?
Java에서는 Garbage Collector의 동작에 의해 메모리 관리가 이루어 집니다. Garbage Collector란
더이상 쓰이지 않는 객체가 할당된 메모리를 자동으로 해제해주는 역할을 수행합니다.
'👩🏻💻Technical things > Questions' 카테고리의 다른 글
추상클래스 VS 인터페이스 (0) | 2020.08.11 |
---|---|
[ JAVA 개념정리 ] Part 4 ( Collection ~ END) (1) | 2020.08.05 |
[ JAVA 개념정리 ] Part 3 (인터페이스~Constructor) (0) | 2020.08.05 |
[ JAVA 개념정리 ] Part 2 (객체지향 프로그래밍) (0) | 2020.08.05 |
[ Data Structure ] (0) | 2020.07.22 |