1. 자바는 어떻게 실행될까?
J V M 실행과정
1 . 컴파일러가 자바소스를 바이트코드로 변환.
JAVA Source Files (.java) -> JAVA Complier(.javac) -> JAVA Byte Code(.class)
2 . JVM의 Class Loader가 바이트 코드를 런타임 데이터 영역으로 로드시키고,
로딩된 바이트 코드는 실행엔진(Execution Engine)에 의해 실행되게 됩니다.
(바이트코드는 01010000...같은 코드가 아니라 jvm에서 운영체제 별로 돌아가게 짜놓은 언어명이다.)
+1) JVM이란?
MAC, WINDOW 다른 운영체제 위에서 똑같은 자바소스코드를 운영체제에 맞게 컴파일해주는 모듈.
+2) 실행엔진(Execution Engine)
Loading 된 클래스의 Bytecode를 해석한다. 이 과정에서 ByteCode가 BinaryCode로 변경된다. 일반적인 윈도우 프로그램의 경우 Assembier가 Assembly언어로 쓰인 코드 파일을 BinaryCode로 변경한다.
2. 자바메모리구조는 어떻게 되어있나요?
1. 스레드별
- PC Register : 현재 수행중인 명령어(jvm에서)
각 스레드마다 하나씩 생성된다. CPU의 Register와 역할이 비슷하다. 현재 수행 중인 JVM명령의 주소 값이 저장된다.
- JVM Stack : 함수
각 스레드마다 하나씩 생성된다. Method안에서 사용되는 값들(매개변수, 지역변수, 리턴 값 등)이 저장되는 구역, 메서드가 호출될 때 LIFO로 하나씩 생성되고, 메서드 실행이 완료되면 LIFO로 하나씩 지워진다.
- Native Method Stack : 자바내부에서
각 스레드마다 하나씩 생성된다. 다른 언어(C/C++ 등)의 메서드 호출을 위해 할당되는 구역 언어에 맞게 Stack이 형성되는 구역이다. JNI(Java Native Interface)라는 표준 규약을 제공한다.
2. 공통
- Method Area : 클래스별로 가지고 있는 정적변수, 전역변수, 지역변수,메서드의 정보가 할당되는 곳.
모든 Thread에게 공유된다. 클래스 정보, 변수 정보, Method정보, static변수 정보, 상수 정보 등이 저장되는 영역
- Heap : 메모리가 동적으로 할당되는 곳.
모든 Thread에게 공유된다. new 명령어로 생성된 인스턴스와 객체가 저장되는 구역, 공간이 부족해지면 Garbage Collection이 실행된다.
정리_
우선, 스레드마다 PC Register, JVM Stacck 그리고 Native Method Stack 이 있고,
스레드 공통으로는 Heap과 Method Area가 있습니다.
PC Register는 현재 수행중인 JVM 명령어가 들어가있고, Native Method Stack은 자바외의 언어인 C나 C++같은 것들을 수행하기 위한 영역이고, 그리고 Method Area는 클래스 별로 전역변수, 정적변수, 메소드 정보들이 저장되게 됩니다.
마지막으로, Heap 영역은 런타임 중 생성되는 객체들이 동적으로 할당되는 곳입니다.
3. 가비지 콜렉션은 무엇인가요? 메모리를 관리해주는 것은 무엇인가요?
- JVM 에서 메모리 관리해주는 모듈 (JVM의 G.C가 자동으로 메모리를 관리해줌.)
(예전엔 개발자가 직접 메모리를 관리해줘야했음. delete a 처럼 데이터를 비워주는 것까지 해줬어야함)
- 장점
: 메모리에 소스코드가 꽉 차면 실행을 잠시 멈추고 참조되지 않는, 사용하지않는 데이터를 찾아 지워줌.
(개발 속도 향상)
- 단점
: 참조하지 않는 메모리를 찾는 중 스레드 중단으로 성능문제가 생김.
GC는 JVM에서 메모리를 관리해주는 모듈입니다.
Heap 메모리를 재활용하기 위해서 더이상 참조되지않는 객체들을 메모리에서 제거하는 모듈입니다.
그래서 개발자가 직접 메모리를 정리하지 않아도 되어서 개발 속도가 향상되는 장점이 있지만
Mark and Sweep이라는 과정에서 참조되지 않는 객체를 찾는 과정에서 스레드가 잠깐 중단되어 성능이 떨어진다는 단점이 있습니다.
Q4. 객체지향 프로그래밍이 뭘까요?
A. 현실 세계의 사물같은 객체를 만들고, 객체에 필요한 특징을 뽑아 프로그래밍 수행하는 것입니다.
객체지향 프로그래밍은 총 4가지 특징이 있는데 추상화 캡슐화, 상속성, 다형성입니다.
추상화는 ~이고, 캡슐화는 ~, 상속성은 ~, 다형성은 ~을 의미한다.
Q5. 추상클래스와 인터페이스의 차이점.
추상클래스 : abstract로 지시자로 정의되며 추상메소드가 하나이상 포함.
인터페이스 : interface지시자로 정의하며 모든 메소드가 추상메소드로 정의(하지만 자바 8 버전부터 메소드를 구현할 수 있게 됨.)
그럼 뭐가 다른 걸까.
추상과 인터페이스는 본질, 그 존재의 목적에 차이가 있다.
추상클래스는 상속, 인터페이스는 보장을 위해 존재한다.
즉, 추상클래스는 부모가 만들어놓은 기능을 상속을 통해 재사용하기 위해서 사용하고 인터페이스는 부모의 기능을 모두 구현해 보장하는데에 목적이 있다.
정리_
추상클래스는 abstract로 지시자로 정의되며 추상메소드가 하나이상 포함되는 클래스이고,
인터페이스는 interface지시자로 정의하며 모든 메소드가 추상메소드로 정의되게 됩니다.
추상클래스와 인터페이스의 차이는 그 존재의 목적에 있습니다.
우선, 추상클래스는 상속받아서 기능을 재활용하고 확장시키는데 목적이 있다면, 인터페이스는 함수의 구현을 강제해서
구현한 객체들이 같은 동작을 하는 것을 보장하는 것에 목적이 있습니다.
참조_
https://www.youtube.com/watch?v=VE_CDb00bc0
'CS' 카테고리의 다른 글
웹 페이지 로딩 과정 이해하기 (0) | 2022.09.30 |
---|