군만두의 IT 공부 일지

신입 개발자 기술면접 예상 질문 정리 - 자바(1) 본문

기타/기술면접

신입 개발자 기술면접 예상 질문 정리 - 자바(1)

mandus 2024. 11. 5. 20:17

1. 동일성과 동등성의 차이를 설명해 보세요.

동일성(identity)두 객체의 메모리 주소가 같은지를 비교하는 것이고, 동등성(equality)두 객체의 내용이 같은지를 비교하는 것입니다.

Java에서 == 연산자는 동일성을, equals() 메서드는 동등성을 비교합니다. 따라서 문자열이나 커스텀 객체의 내용을 비교할 때는 equals() 메서드를 오버라이드하여 사용해야 합니다. 예를 들어, 두 개의 서로 다른 String 객체가 같은 내용을 가지더라도 ==은 false를 반환하지만, equals()는 true를 반환합니다.

동일성과 동등성의 차이를 설명하라는 면접 질문에는 ==로 비교하면 동일성을 비교할 수 있고, equals()로 비교하면 동등성을 비교할 수 있다고 답변할 수 있습니다. 일반적으로 이런 질문은 지식에 대한 검증 그 자체가 목적이 됩니다. 여기까지는 사고력이나 추론이 필요한 영역이 아닙니다. 정말로 단순히 어떤 지식을 알고 있느냐 모르고 있느냐를 물어보는 질문이죠. 자 그런데 여기서 더 나아가서 사고력 추론 능력에 대한 질문으로 이어질 수도 있습니다.

2. JVM이란 무엇이고 왜 필요한지 설명해 보세요.

JVM(Java Virtual Machine)자바 바이트코드를 실행하는 가상 머신으로, 플랫폼에 독립적인 실행 환경을 제공합니다.

자바 프로그램은 먼저 바이트코드로 컴파일되고, JVM이 이를 실행함으로써 운영체제와 무관하게 실행될 수 있습니다. 이는 자바가 "Write Once, Run Anywhere"라는 특징을 갖게 해줍니다. JVM은 또한 메모리 관리 및 가비지 컬렉션을 통해 프로그램의 안정성을 높입니다.

*JVM에 대한 자세한 내용은 https://inpa.tistory.com/entry/JAVA-☕-JVM-내부-구조-메모리-영역-심화편#자바_가상_머신jvm의_구조 참고

JVM(Java Virtual Machine)은 자바 프로그램을 실행하는 가상 머신입니다. 자바는 OS의 종속성에서 벗어나기 위해 사용되어, 각 OS에 맞는 JVM을 통해 같은 소스 코드로도 다른 OS에서 정상 실행이 가능합니다. GC를 통해 프로그램의 메모리 관리를 해 준다는 이점이 있습니다.

3. Java가 컴파일되는 과정에 대해 설명해 보세요.

Java 코드는 먼저 자바 컴파일러에 의해 바이트코드(.class 파일)로 컴파일됩니다. 이후 JVM이 이 바이트코드를 해석하여 실행합니다. 이 과정에서 JIT(Just-In-Time) 컴파일러가 바이트코드를 네이티브 코드로 변환하여 성능을 향상시킵니다. 이러한 두 단계의 과정을 통해 자바는 효율적인 실행과 이식성을 동시에 갖추게 됩니다. 또한, 바이트코드는 클래스 로더에 의해 메모리에 로드되며, 실행 시 필요한 클래스와 라이브러리들을 동적으로 로딩합니다.

*컴파에 대한 자세한 내용은 https://inpa.tistory.com/entry/CS-🖥%EF%B8%8F-컴파일-트랜스파일-인터프리터-비교-쉽게-설명 참고

자바 컴파일 과정은 크게 다섯 가지로 구분할 수 있습니다. 로드, 검증, 준비, 분석, 초기화인데요. 이를 자세히 말해보겠습니다.

로드 과정에 대해 설명해 보겠습니다.
로드 과정은 클래스 파일을 가져와 JVM의 메모리에 로드하는 과정입니다. 자바 소스 코드(.Java)가 작성되면 자바 컴파일러가 이 소스 코드를 읽어 바이트 코드(.class)로 컴파일한 뒤 이를 클래스 로더에게 전달합니다. 클래스 로더는 동적 로딩으로 필요한 클래스들을 링크하여 JVM 메모리에 업로드해 런타임 데이터를 구성합니다.

검증 과정에서는 자바 언어 명세와 JVM 명세에 구성이 맞는지 검증합니다.이후 준비 과정에서는 클래스가 필요로 하는 메모리를 할당하며, 분석 과정에서는 클래스의 상수 풀 내 모든 심볼릭 레퍼런스를 다이렉트 레퍼런스로 변경합니다. 마지막으로 초기화 과정에서는 클래스 변수들을 적절한 값으로 초기화합니다.이러한 과정이 모두 완료되면, 실행 엔진은 JVM 메모리에 업로드된 바이트 코드를 명령어 단위로 가져와 실행합니다.

실행 엔진은 인터프리터 방식과 JIT 컴파일러 사용 방식, 두 가지 방식으로 작동하는데요.
인터프리터 방식은 바이트 코드 명령어를 한 개씩 읽고 실행하는 방식입니다. 명령어별 실행은 빠르지만 전체적인 속도는 느리다는 단점이 있습니다.

이 단점을 개선하기 위해 등장한 것이 JIT 컴파일러 사용 방식인데요. JIT 컴파일러는 바이트 코드 전체를 컴파일하여 바이너리 코드로 변경하고, 해당 메서드를 바로 바이너리 코드로 실행합니다. 그렇기 때문에 전체적인 실행 속도가 인터프리터 방식보다 훨씬 빠릅니다.

4. Garbage Collector의 역할, 원리에 대해 아는 만큼 설명해 보세요.

Garbage Collector(GC)더 이상 참조되지 않는 객체를 자동으로 메모리에서 해제하여 메모리 누수를 방지하는 역할을 합니다.

Java의 GC는 주로 Mark-and-Sweep 알고리즘을 사용합니다. 이 알고리즘은 먼저 사용 중인 객체를 마킹하고, 참조되지 않는 객체를 제거합니다. 이 과정에서 스탑-더-월드(Stop-the-World) 현상이 발생할 수 있어, 이를 최소화하는 다양한 튜닝 기법이 존재합니다.

또한, Java에는 여러 가지 GC 정책(Garbage Collection Policy)이 있으며, G1 GC, CMS GC와 같은 방식들이 성능에 따라 선택적으로 사용될 수 있습니다.

*Garbage Collector에 대한 자세한 내용은 https://inpa.tistory.com/entry/JAVA-☕-가비지-컬렉션GC-동작-원리-알고리즘-💯-총정리 참고

Garbage Collector(GC)는 자바에서 자동으로 메모리를 관리하는 시스템입니다. 프로그램에서 생성된 객체가 더 이상 참조되지 않으면 GC가 해당 객체가 차지하는 메모리를 회수하여 재사용할 수 있도록 합니다.

첫 번째로, GC는 객체가 참조 가능한 상태인지 확인합니다. 이 과정을 통해 도달 가능한 객체와 도달 불가능한 객체를 구분합니다.

두 번째로, 마킹-스윕(Mark-and-Sweep) 단계를 거칩니다. 도달 가능한 객체를 마크하고, 도달 불가능한 객체는 메모리에서 제거합니다. 이 과정은 '마킹 단계'와 '스윕 단계'로 나뉩니다.

세 번째로, 압축을 실행합니다. 메모리에서 객체가 제거된 후, 남아 있는 객체들을 이동시켜 메모리 블록을 연속적으로 만듭니다. 이를 통해 메모리 단편화를 줄이고 효율성을 높입니다.

마지막으로, 객체 분류에 맞는 작업을 수행합니다. GC는 객체를 Young Generation(새로 생성된 객체), Old Generation(오래된 객체) 등으로 분류하여, 각 세대에 맞는 수집 방식을 사용합니다. Young Generation에서는 주기적으로 Minor GC를 수행하고, Old Generation에서는 Major GC를 수행합니다.\
GC 가비지 컬렉션은 프로그래머가 동적으로 할당한 메모리 영역 중 더 이상 쓰이지 않는 가비지 영역을 찾아서 해제하는 기능을 의미합니다. 답변 시 Full GC에 대해서도 설명할 수 있으면 좋습니다.
자바 메모리는 Young, Old, Perm 세 영역으로 나뉩니다. 이 중 Perm(Permanent) 영역은 거의 사용되지 않으며 Yong(Eden, Survivor), Old 2가지 영역으로 나뉘어있습니다. 객체는 처음 생성되었을 때 Yong 영역에 있다가 Old 영역으로 넘어가게 되는데, Old 영역이 꽉 찼을 때 Full GC 가 발생하게 됩니다. Full GC가 발생하면 애플리케이션에 부하가 발생하여 성능이 Full GC 발생 순간에 저하됩니다. 자바 성능상 이슈를 유발할 수 있는 Full GC의 이론에 대해 알아두면 좋습니다.

⭐참고자료

1) 한빛출판네트워크, "백엔드 기술 면접 TIP: 자바 기본 문법 예상 질문 5가지와 해설", 2024.02.08, https://www.hanbit.co.kr/channel/category/category_view.html?cms_code=CMS1626582373&cate_cd=

2) 제로베이스, "현직자가 말하는 신입 백엔드 개발 면접 질문 | 백엔드 스쿨", https://zero-base.co.kr/event/media_BE_school_qna

3) 스파르타코딩클럽, "2024 백엔드 면접 질문 문제은행 - 개발자 면접 준비 101", 2024.08.22, https://spartacodingclub.kr/blog/2024-backend-jobinterview-question

이 글은 참고자료를 바탕으로 각 질문에 대한 답변을 정리한 것으로, 틀린 부분이 있을 수도 있습니다.
Comments