JVM의 구조와 Java의 실행방식을 설명
JVM이란 : (자바 가상 머신)의 약자이다.
JVM역할 : 자바 애플리케이션을, 클래스 로더를 통해 읽어, 자바 API와 함께 실행하는 것
또한 메모리 관리(GC)를 수행하며, 스택기반의 가상 머신이다.
JVM 구조 : Class Loader, Execution engine, Runtime Data Area, JNI, Native Method Library로 이루어져 있다.
1) Class Loader: JVM내로 클래스를 로드하고, 링크를 통해 배치하는 작업을 수행하는 모듈
2) 실행 엔진: 바이트 코드를 실행시키는 역할
- 인터프리터: 바이트 코드를 한줄씩 실행
- JIT컴파일러: 인터프리터가 반복되는 코드 발견하면, JIT컴파일러가 반복되는 코드를 네이티브 코드로 바꿔줌. 인터프리터는 네이티브로 컴파일된 코드 바로 사용함.
3) Runtime Data Areas: 프로그램 실행 중에 사용되는 다양한 영역
- PC Register: Tread가 시작될때 생성됨. 현재 수행중인 JVM명령의 주소 가지고 있음.
- Stack Area: 지역변수, 파라미터 등이 생성되는 영역. 실제 객체는 Heap에 할당되고, 해당 레퍼런스만 Stack에 저장됨.
-Heap Area: 동적으로 생성된 오브젝트와 배열이 저장되는 곳. GC의 대상 영역
-Method Area: 클래스 멤버변수, 메소드 정보, Type정보, Constant Poll, static, final 변수 등이 생성됨.
4)JNI(Java Native Interface): 자바 어플리케이션에서, C, C++, 어셈블리어로 작성된 함수를 사용할 수 있는 방법을 제공해줌. Native키워드 사용하여 메서드 호출.
ex) Thread - currentThread()
5) Native Method Library: C, C++로 작성된 라이브러리
GC가 무엇인지, 필요한 이유는 무엇인지, 동작방식에 대해 설명
GC란 : 힙 영역에서 사용하지 않는 객체들을 제거하는 작업을 말함.
GC 구분: Minor GC, Major GC로 구분 가능
- Minor GC: Young영역에서 일어남, Eden영역이 가득참에서 부터 시작됨. Eden 영역에서 참조가 남아있는 객체를 mark하고 survivor 영역으로 복사 --> Eden영역 비움. Survivior영역 가득차면 --> 다른 Survivor영역에 복사하고 비움. 계속 반복해서 살아남는 객체는 Old영역으로 이동!
- Major GC: Old영역에서 일어남. 삭제되어야 하는 객체를 mark하고 지움(sweep) --> Mark-Seep-Compact알고리즘이라고도 함.
Stop-the-world란? : GC를 수행할때, GC를 수행하는 스레드 이외의 스레드는 모두 정지하는 것.
컬렉션 프레임워크에 대해서 설명
Java Collection: 자료구조(객체, 데이터들을 효율적으로 관리할 수 있는)들이 있는 라이브러리
ex) List, Set은 Collection인터페이스 상속받음
반면에 Map Interface: 별도로 정의
제네릭에 대해서 설명
제러릭:자바의 타입 안정성을 맡음. 컴파일 과정에서 타입체크 해주는 기능.
--> 객체의 타입 안정성 높임, 형변환의 번거로운 줄여줌.
애노테이션에 대해서 설명
애노테이션: 클래스에 특별한 의미 부여하거나, 기능을 주입할 수 있다. (인터페이스 기반으로 한 문법)
ex) @Override
오버라이딩과 오버로딩이 무엇이며 어떤 차이가 있을까?
오버라이딩:
class Parent {
void showMessage() {
System.out.println("부모 클래스의 메서드");
}
}
class Child extends Parent {
@Override
void showMessage() {
System.out.println("자식 클래스에서 오버라이딩한 메서드");
}
}
public class Main {
public static void main(String[] args) {
Parent obj = new Child(); // 다형성 적용
obj.showMessage(); // "자식 클래스에서 오버라이딩한 메서드" 출력
}
}
오버로딩 :
class MathUtil {
int add(int a, int b) {
return a + b;
}
double add(double a, double b) { // 매개변수 타입 다름
return a + b;
}
int add(int a, int b, int c) { // 매개변수 개수 다름
return a + b + c;
}
}
public class Main {
public static void main(String[] args) {
MathUtil util = new MathUtil();
System.out.println(util.add(5, 10)); // int형 add 호출 → 15
System.out.println(util.add(5.5, 2.3)); // double형 add 호출 → 7.8
System.out.println(util.add(1, 2, 3)); // 3개 인자 add 호출 → 6
}
}
오버라이딩 vs 오버로딩 차이점 정리

추상클래스와 인터페이스의 차이점에 대해 설명
추상 클래스란: 공통적인 기능을 하는 객체의 추상화, 자신의 기능을 하위 클래스로 확장시키는 느낌.
객체 생성할 필요 없고, 다중상속 불가! Extend 키워드 사용!
인터페이스란: 특정 기능을 강제하는 규약 역할을 함. 각 클래스의 목적에 맞게 기능을 구현하는 느낌.
다중 구현이 가능, implements 키워드 사용!

클래스는 무엇이고 객체(Object)는 무엇?
클래스(Class)란: 객체를 정의하는 틀/ 설계도
객체(Object)란: 클래스를 기반으로 생성된 실체화 된 존재/ 인스턴스(Instance)