[면접 준비] Java 언어의 특징이 무엇인가요?
안녕하세요. 요즘 예비군 훈련을 받고 있는데 날씨가 따뜻했다가 추웠다가 왔다 갔다해서 고생하고 있습니다 ㅋㅋㅋ
이번에는 Java를 공부하고 있는 지인을 위해서 Java에 대한 기본 지식들을 물어보는 면접 질문지를 만들어 보려고 합니다.
Java에 대한 기본적인 이해를 묻는 질문들을 한 곳에 모아보고 있는데 저도 공부가 되어서 좋네요!
- 실제로 진행되는 면접처럼 꼬리 질문들을 만들어서 최종적으로는 비주얼 노벨 게임 같은 질문지를 만들면 재밌을 것 같습니다 ㅎㅎㅎ
Q1. Java 언어의 특징이 무엇인가요?
A. 키워드: 객체 지향 프로그래밍 언어, 플랫폼 독립성, 메모리 관리
- 객체 지향 프로그래밍 언어 (OOP)
- Java는 객체 지향 프로그래밍 언어로서, 모든 것을 객체로 처리합니다. 이는 코드의 재사용성, 모듈성 및 유지 보수성을 향상시키며, 큰 프로젝트에서 특히 유리합니다.
- 플랫폼 독립성
- Java는 '한 번 작성하면, 어디서나 실행된다(Write Once, Run Anywhere - WORA)'의 철학을 가지고 있습니다. Java로 작성된 애플리케이션은 JVM(Java Virtual Machine) 위에서 실행되기 때문에, 어떤 플랫폼에서도 동일하게 동작합니다.
- 메모리 관리
- 자동 가비지 컬렉션 기능 덕분에 개발자는 메모리 관리에 신경 쓰지 않아도 됩니다. 메모리 누수를 방지하고, 프로그램의 안정성을 높입니다.
[별로 안 물어볼 질문] Q1.1. Java를 객체 지향 프로그래밍 언어라고 설명해주셨는데 순수 객체 지향 프로그래밍 언어는 아닐까요?
A.
순수 객체 지향 프로그래밍 언어는 프로그래밍 언어 내 모든 타입이 객체여야 하고, 객체에 적용되는 모든 연산은 객체의 메소드를 사용해야 합니다.
Java는 위의 두 조건을 모두 만족하지 않습니다.
첫번째로 primitive data type(원시 자료형)인 int, boolean, char, float 등의 타입은 객체가 아닙니다.
두번째로 static 키워드를 사용하면 객체의 메소드를 사용하지 않더라도 객체를 수정할 수 있습니다.
참고 링크: https://prutor.ai/why-java-is-not-a-purely-object-oriented-language/
Q1.2. Java의 특징 중 하나로 플랫폼 독립성을 말씀해주셨는데 C 언어나 Python도 여러 플랫폼에서 실행되지 않나요? 차이가 있을까요?
A.
결과적으로 여러 플랫폼에서 실행할 수 있다는 점에서 C 언어, Python 동일합니다만 각각의 언어가 플랫폼 독립성을 만족시키는 방법이 다릅니다.
Java 코드를 컴파일하면 플랫폼에 종속되지 않는 Java 바이트 코드가 생성되는데 JVM이 Java 바이트 코드를 실행해줍니다. 그래서 Java 코드는 플랫폼에 상관 없이 똑같은 코드를 사용할 수 있습니다.
+++ 물론 파일시스템에 접근하거나 플랫폼에 종속된 명령을 사용한 경우에는 플랫폼에 알맞게 코드를 수정해야 합니다!
파이썬은 인터프리터, C 언어 같은 경우에는 플랫폼 전용 컴파일러를 이용해서 여러 플랫폼을 지원하고 있습니다.
Q1.3. Java의 가비지 컬렉션을 말씀해주셨는데요. 가비지 컬렉션이 무엇인지, 가비지 컬렉션에 어떤 기법들이 있는지, Java는 어떤 기법을 사용하고 있는지 자세히 설명 부탁드립니다.
A. 키워드: 포인터 추적 방식, Mark and Sweep, Generational GC(세대 단위 GC)
가비지 컬렉션은 메모리 관리 기법 중 하나로 프로그램이 동적으로 할당한 메모리 중에서 사용하지 않는 부분을 자동으로 해제하여 메모리 누수 같은 문제를 예방합니다.
가비지 컬렉션은 크게 포인터 추적 방식(tracing), 참조 횟수 계산 방식(reference couting)이 있는데 Java는 tracing 방식에서 세대 단위 GC와 Mark and Sweep을 함께 사용하고 있습니다.
세대 단위 GC는 '최근에 할당된 메모리일수록 더욱 빨리 해제된다' 라는 가설을 바탕으로 만들어진 기법으로 메모리의 세대에 따라서 영역을 구분하여 가비지 컬렉션을 실행할 범위를 줄여서 속도를 개선할 수 있습니다.
Mark and Sweep은 그래프 탐색 알고리즘을 기반으로 사용되지 않고 있는 메모리를 찾습니다.
가비지 컬렉션이 편의성만 제공하는 것은 아닙니다. 성능 저하라는 단점도 있습니다.
메모리 영역을 관리하기 때문에 가비지 컬렉션이 실행되는 동안에는 프로그램이 멈출 수 밖에 없는데 Java 개발진들은 이를 개선하기 위해서 다양한 시도를 하고 있는 것으로 알고 있습니다.
[여기까지 답변한다면 최고 👍] Q.1.4. Mark and Sweep 기법에 대해서 구체적으로 설명해주세요.
A. 키워드: DFS
Mark and Sweep 알고리즘은 DFS 알고리즘을 바탕으로 Mark 단계와 Sweep 단계를 거치면서 사용되지 않는 메모리를 해제합니다.
Mark 단계에서는 사용되지 않는 메모리를 찾고, Sweep 단계에서는 Mark 단계에서 식별된 메모리를 해제합니다. pseudo 코드는 다음과 같습니다.
# Mark 단계
def mark(obj):
if not is_marked(obj):
set_marked(obj, True)
for other_obj in find_obj_referenced_by(obj):
mark(other_obj)
# Sweep 단계
def sweep(obj):
if is_marked(obj):
set_marked(obj, False)
else:
release_memory(obj)
def is_marked(obj):
return obj.marked
def set_marked(obj, mark):
obj.marked = mark
def find_obj_referenced_by(obj):
return obj.referenced_obj
def release_memory(obj):
# 메모리 해제하는 코드
pass