Interview - Java

Interview - Java

Q1. 가비지 컬렉션이란?

가비지 컬렉션은 자바의 메모리 관리 방법 중의 하나로 JVM의 Heap 영역에서 동적으로 할당했던 메모리 중 필요 없게 된 메모리 객체를 모아 주기적으로 제거하는 프로세스를 말합니다.

GC 알고리즘 종류로는 Serial GC, Parallel GC, G1 GC, ZGC를 알고 있습니다.


Q2. 동일성과 동등성에 대해 설명해주세요.

동등성은 논리적으로 객체의 내용이 같은지를 비교하는 개념입니다. 자바에서는 equals() 메서드를 사용하여 객체의 동등성을 비교합니다.

동일성은 두 객체가 메모리 상에서 같은 객체인지 비교하는 개념입니다. 자바에서는 == 연산자를 사용하여 객체의 동일성을 비교합니다. == 연산자는 객체의 레퍼런스(참조)를 비교하므로, 두 변수가 동일한 객체를 가리키고 있는지를 확인합니다.


Q3. 일급 컬렉션이 무엇인가요?

일급 컬렉션(First-Class Collection)은 하나의 컬렉션을 감싸는 클래스를 만들고, 해당 클래스에서 컬렉션과 관련된 비즈니스 로직을 관리하는 패턴을 말합니다. 일급 컬렉션 클래스에 로직을 포함하거나 비즈니스에 특화된 명확한 이름을 부여할 수 있습니다. 또한, 불필요한 컬렉션 API를 외부로 노출하지 않도록 할 수 있으며, 컬렉션을 변경할 수 없도록 만든다면 예기치 않은 변경으로부터 데이터를 보호할 수 있습니다.


Q4. Checked Exception과 Unchecked Exception에 대해서 설명해주세요.

Checked Exception은 컴파일 시점에 확인되며, 반드시 처리해야 하는 예외입니다.

자바에서는 IOException, SQLException 등이 이에 속합니다.

Checked Exception을 유발하는 메서드를 호출하는 경우, 메서드 시그니처에 throws를 사용하여 호출자에게 예외를 위임하거나 메서드 내에서 try-catch를 사용하여 해당 예외를 반드시 처리해야 합니다.

Unchecked Exception은 런타임 시점에 발생하는 예외로, 컴파일러가 처리 여부를 강제하지 않습니다. 자바에서는 RuntimeException을 상속한 예외들이 해당됩니다. 일반적으로 프로그래머의 실수나 코드 오류로 인해 발생합니다.


Q5. Error와 Exception의 차이는 무엇인가요?

Error는 주로 JVM에서 발생하는 심각한 문제로, OutOfMemoryError, StackOverflowError 등 시스템 레벨에서 발생하는 오류입니다. 이는 일반적으로 프로그램에서 처리하지 않으며, 회복이 어려운 오류에 속하며, 애플리케이션 코드에서 복구할 수 없는 심각한 문제를 나타냅니다. 따라서 예외 처리를 하지 않으며, 보통 프로그램을 종료해야 합니다.

반면, Exception은 프로그램 실행 중 발생할 수 있는 오류 상황을 나타냅니다. 대부분의 경우 회복 가능성이 있으며, 프로그램 내에서 예외 처리를 통해 오류 상황을 제어할 수 있습니다. Exception은 다시 Checked ExceptionUnchecked Exception으로 나눌 수 있습니다.


Q6. JVM에서 GC 대상 객체를 판단하는 기준은 무엇인가요?

GC는 특정 객체가 사용 중인지 아닌지 판단하기 위해서 도달 가능성(Reachability) 라는 개념을 사용하는데요. 특정 객체에 대한 참조가 존재하면 도달할 수 있으며, 참조가 존재하지 않는 경우에 도달할 수 없는 상태로 간주합니다. 이때, 도달할 수 없다는 결론을 내린다면 해당 객체는 GC의 대상이 됩니다.

도달 가능성 판단에 있어 힙 영역에 있는 객체에 대한 참조를 확인하게 되는데요. 이 경우는 4가지 케이스가 존재합니다.힙 내부 객체 간의 참조, 스택 영역의 변수에 의한 참조, JNI에 의해 생성된 객체에 대한 참조(네이티브 스택 영역), 메서드 영역의 정적 변수에 의한 참조가 이에 해당됩니다. 이때, 힙 내부 객체 간의 참조를 제외한 나머지를 Root Set이라고 합니다. Root Set으로부터 시작한 참조 사슬에 속한 객체들은 도달할 수 있는 객체이며, 이 참조 사슬과 무관한 객체들은 도달하기 어렵기 때문에 GC에 대상이 됩니다.


Q7. 자바에서 클래스 정보는 어떻게 알아낼 수 있나요?

자바에서 클래스 정보를 가져오기 위해서 Reflection API를 사용할 수 있습니다. reflection 패키지에서 제공하는 클래스를 사용하면, JVM에 로딩되어 있는 클래스와 메서드의 정보를 읽어올 수 있습니다. 대표적으로 Class 클래스, Method 클래스, Field 클래스가 존재합니다.

Reflection API를 사용하면 구체적인 클래스의 타입을 몰라도, 클래스의 정보에 접근할 수 있습니다. 개발자는 이러한 특성을 이용하여 인스턴스를 감싸는 프록시를 만들거나, 사용자로부터 전달된 값을 처리할 메서드를 유연하게 선택하는 등 다양한 구현을 할 수 있습니다. Reflection API는 특히 프레임워크나 라이브러리를 개발하는 과정에서 사용되는 경우가 많습니다. 프레임워크나 라이브러리의 개발자는 사용자가 작성한 클래스에 대한 정보를 알 수 없기 때문입니다.


이 페이지는 면접 준비를 위한 정리 페이지입니다.