Java·객체지향 — 백엔드 면접 (실제 기출 기반·심화)
한국 백엔드는 Java/Spring이 사실상 표준이라 Java가 깊게 나온다. "JVM이 뭐고 무슨 일을 하나", "오버로딩 vs 오버라이딩", "equals와 hashCode", "String이 불변인 이유", "HashMap 내부 동작", "GC 동작과 종류" — 단골이고, VSFe 패턴으로 정의 → 작동 원리 → 한계/대안까지 파고든다.
"equals만 재정의하고 hashCode를 빼면?", "null 대입이 즉시 메모리를 해제하나?" 같은 함정형이 단골이다.
1. JVM·메모리 영역 (★★ 단골)
실제 질문: "JVM이 정확히 무엇이고 무슨 일을 하나요?" · "**Java의 메모리 영역(Runtime Data Area)**을 설명하라." · "어떤 변수가 어디 저장되나(static·지역·인스턴스)?" (VSFe·gyoogle)
- JVM: 바이트코드(.class)를 실행. 이식성(WORA) + 메모리 관리(GC). 클래스 로더가 동적 로딩 → 실행 엔진이 인터프리터 + JIT 컴파일러(핫스팟 메서드는 기계어로 컴파일).
- Runtime Data Area 5영역:
| 영역 | 무엇 | 공유 |
|---|---|---|
| Method(Class) Area | 클래스 메타·static 변수·런타임 상수 풀·메서드 바이트코드 | 전체 공유 |
| Heap | new 객체·배열 (GC 대상) | 전체 공유 |
| Stack | 메서드 프레임·지역변수·인자·힙 객체의 참조 | 스레드별 |
| PC Register | 다음 명령 주소 | 스레드별 |
| Native Method Stack | 네이티브(JNI) | 스레드별 |
꼬리질문: "JVM 위에 다른 언어?" → Kotlin·Scala·Groovy(JVM 언어). / "static 변수는 어디?" → Method Area(메타스페이스) — Heap 아님. / "OOM은 어느 영역?" → Heap(객체)·Metaspace(클래스).
함정: ❌ "JVM은 인터프리팅만 한다" → 인터프리터 + JIT. ❌ "static 변수는 Heap에 있다" → Method Area. ❌ "Stack도 GC가 정리한다" → GC 대상은 Heap뿐(Stack은 프레임 pop).
2. 오버로딩 vs 오버라이딩 (★ 단골)
실제 질문: "오버로딩과 오버라이딩의 차이는?" · "반환타입만 다르면 오버로딩 되나요?" · "오버라이딩 시 접근제어자를 더 좁힐 수 있나요?" (gyoogle·VSFe)
- 오버로딩(Overloading): 같은 이름·다른 매개변수(타입/순서/개수). 반환타입 무관. 컴파일타임 정적 바인딩.
- 오버라이딩(Overriding): 부모 메서드 재정의(이름·매개변수·반환 동일). 런타임 동적 바인딩.
꼬리질문: "반환타입만 다르면?" → 오버로딩 안 됨(컴파일 에러). / "접근제어자를 좁히면?" → 오버라이딩에서 부모보다 좁히면 컴파일 에러(넓히는 건 가능). / "부모보다 넓은 예외를?" → 던질 수 없음.
함정: ❌ "반환타입만 다르면 오버로딩" → 불가. ❌ "오버라이딩은 접근제어자 자유" → 좁히기 불가.
3. 추상 클래스 vs 인터페이스 (★ 단골)
실제 질문: "추상 클래스와 인터페이스의 차이는?" · "왜 클래스는 단일 상속인데 인터페이스는 2개 이상 구현 가능한가요?" (VSFe)
- 추상 클래스: 단일 상속·인스턴스 변수(상태) 보유·공통 구현 공유("is-a").
- 인터페이스: 다중 구현·상수만(필드 X)·행위 계약("can-do"). Java 8 default/static, Java 9 private 메서드로 구현을 일부 가짐.
깊이: 클래스 다중 상속을 막는 이유 = 다이아몬드 문제(상태/구현 충돌). 인터페이스는 상태가 없어(상수만) 다중 구현해도 충돌이 적다.
꼬리질문: "default 메서드 추가로 둘이 같아졌나?" → 인터페이스도 구현을 갖지만 상태(필드)는 여전히 없음. / "언제 추상 클래스, 언제 인터페이스?" → 공통 상태·뼈대=추상 클래스, 능력 계약·다중=인터페이스.
함정: ❌ "인터페이스는 구현이 전혀 없다" → default 이후 거짓.
4. equals와 hashCode (★★ 단골·최다 함정)
실제 질문: "equals와 hashCode를 설명하라." · "equals만 재정의하면 무슨 문제가 생기나요?" · "hashCode를 직접 정의한다면 무엇을 염두에 둘 건가요?" (VSFe·tecoble)
- 동일성(==·메모리 주소) vs 동등성(equals·논리적 값).
- 규약: equals가 true면 hashCode도 반드시 같아야 한다(역은 성립 안 해도 됨).
- HashMap 동작: 먼저 hashCode로 버킷을 찾고 → 그 안에서 equals로 최종 판정.
깊이 — equals만 재정의 함정(★ 최다): equals만 재정의하고 hashCode를 안 하면, 같은 값의 객체가 다른 버킷으로 가서 HashSet/HashMap 키로 못 찾는다. → 둘을 항상 함께 재정의.
꼬리질문: "hashCode가 같으면 동일 객체?" → 아니다(충돌 가능 → equals까지 봐야). / "equals 규약?" → 반사·대칭·추이·일관·null-아님. / "lombok @EqualsAndHashCode?" → 자동 생성(필드 선택 주의).
함정: ❌ "equals만 재정의하면 충분" → hashCode 누락 시 해시 컬렉션에서 실패.
5. String·불변성·컬렉션 (★★ 단골)
실제 질문: "String, StringBuilder, StringBuffer의 차이는?" · "String이 불변이면 어떤 장점이 있나요?" · "HashMap의 내부 동작을 설명하라." (gyoogle·VSFe)
- String(불변): 연산마다 새 객체 → 반복 연산 시 성능 저하·String Pool 캐싱. 불변 장점 = 스레드 안전·캐싱·보안·hashCode 캐싱.
- StringBuilder(가변·비동기·단일 스레드 빠름) vs StringBuffer(가변·동기화·멀티스레드 안전).
- HashMap 내부: 해시 → 버킷 → 체이닝(Java8+ 한 버킷 8개↑ + 용량 64↑면 트리화 O(log N)) → load factor 0.75 초과 시 리해싱.
꼬리질문: "String a="x"; a+="y"의 객체 수?" → 새 객체 생성(기존 불변). / "String Pool(intern)?" → 리터럴은 풀에서 재사용. / "HashMap vs Hashtable vs ConcurrentHashMap?" → 동기화 여부·null 허용·동시성(버킷 락/CAS).
함정: ❌ "String도 += 하면 같은 객체가 바뀐다" → 새 객체. ❌ "StringBuffer를 항상 써야 안전" → 단일 스레드면 StringBuilder가 빠름.
6. 가비지 컬렉션 (★★ 단골·심화)
실제 질문: "GC의 동작 원리와 종류를 설명하라." · "어떤 변수가 null이 되면 GC 대상이 되나요?" · "finalize()를 수동 호출하면 왜 문제인가요?" (VSFe·johngrib)
- 대상: Heap. **Reachability(도달 가능성)**로 살아있는 객체 판별(루트에서 참조 끊기면 수거 대상).
- 세대: Young(Eden→Survivor)·Old. Minor GC(Young·짧음)·Major/Full GC(Old·김). 세대별 알고리즘이 다름 — Young=복사(mark-copy·Eden→Survivor), Old=Mark-Sweep-Compact(둘 다 STW 동반).
- GC 종류: Serial(단일)·Parallel(멀티)·CMS(동시·JDK9 deprecated·JDK14 제거)·G1(Region 단위·JDK9 기본)·ZGC(STW 1ms 미만·힙 크기 무관·대용량 저지연).
꼬리질문: "null 대입하면 즉시 해제?" → 아니다(★). 참조가 끊겨 GC 대상이 될 뿐, 실제 수거는 GC 시점. / "GC가 메모리 누수를 완전히 막나?" → 아니다(정적 컬렉션·리스너 미해제로 누수 가능). / "왜 G1·ZGC?" → STW 시간을 예측·짧게(대용량 힙).
함정: ❌ "null = 즉시 메모리 해제" → GC 시점. ❌ "GC가 있으니 메모리 누수 없음" → 도달 가능한 누수 존재.
7. 제네릭·예외·동시성 (★ 단골)
실제 질문: "제네릭의 **타입 소거(type erasure)**란?" · "Checked와 Unchecked 예외의 차이는?" · "volatile은 무엇을 보장하나요?" (VSFe·gyoogle)
- 제네릭: 컴파일타임 타입 안전 + 캐스팅 제거. 타입 소거 — 런타임엔 타입 정보가 지워진다(하위 호환).
- 예외: Checked(컴파일러 강제·IOException·복구 가능) vs Unchecked(RuntimeException·강제 X). → 스프링은 Unchecked만 기본 롤백(Checked는 커밋·
rollbackFor필요 — Spring 편). - volatile: 가시성(메인 메모리에서 읽기)만 보장·원자성은 아님 → 복합 연산은
synchronized·Atomic.
꼬리질문: "List<Object>와 List<?> 차이?" → 후자는 읽기 전용에 가까움(타입 불명). / "예외를 흐름 제어로?" → 스택트레이스 비용·지양. / "volatile vs synchronized?" → 가시성 vs 가시성+원자성(상호배제).
함정: ❌ "제네릭은 런타임에 타입을 유지" → 소거. ❌ "volatile이면 count++가 안전" → 원자성 아님.
흔한 오답·함정 정리
- static 변수는 Heap → Method Area(메타스페이스).
- null 대입 = 즉시 해제 → GC 시점에 수거.
- equals만 재정의하면 충분 → hashCode 누락 시 해시 컬렉션 실패.
- String += 하면 같은 객체 수정 → 새 객체(불변).
- volatile이면
count++안전 → 원자성 아님. - GC가 있으니 메모리 누수 없음 → 도달 가능한 누수 가능.
한국 면접 단골 Q&A (답변 골격)
| 질문 | 핵심 답 |
|---|---|
| JVM·메모리 영역 | 이식성+GC·Method/Heap/Stack/PC/Native·static=Method Area |
| 인터프리터만? | 인터프리터+JIT |
| 오버로딩 vs 오버라이딩 | 매개변수 다름(정적) vs 재정의(동적) |
| 추상클래스 vs 인터페이스 | 단일·상태 vs 다중·계약·다이아몬드 |
| equals/hashCode | 동등성·둘 함께·버킷→equals |
| String 불변 | 새 객체·풀·스레드 안전 |
| HashMap 내부 | 체이닝·트리화·load factor 0.75 |
| GC 동작·종류 | reachability·Young/Old·Serial~ZGC |
| null 즉시 해제? | 아니다·GC 시점 |
| Checked vs Unchecked | 강제 여부·스프링 Unchecked만 롤백 |
| volatile | 가시성만·원자성 아님 |
꼬리질문 대비 (상 난이도)
- "GC가 STW를 왜 하나?" → 객체 그래프 변경 중 일관성 → G1/ZGC가 동시·짧게.
- "HashMap이 트리화되는 조건?" → 한 버킷 8개↑ + 용량 64↑(RB 트리).
- "String Pool은 어디?" → 힙의 별도 영역(JDK7+).
- "Checked 예외가 롤백 안 돼 데이터가 남았다?" →
@Transactional(rollbackFor=Exception.class). - "동시성 컬렉션?" → ConcurrentHashMap(버킷 락/CAS)·CopyOnWriteArrayList.
한 줄 요약 — JVM=이식성+GC·인터프리터+JIT·메모리 5영역(static=Method Area·GC는 Heap). 오버로딩(매개변수·정적)↔오버라이딩(재정의·동적). 추상클래스(단일·상태)↔인터페이스(다중·계약·다이아몬드). equals/hashCode는 함께(버킷→equals). String 불변(새 객체·풀)·HashMap(체이닝·트리화·0.75). GC=reachability·Young/Old·Serial~G1/ZGC·null≠즉시 해제. 제네릭 소거·Checked/Unchecked(스프링 Unchecked만 롤백)·volatile은 가시성만.
(출처 — 한국 면접 기출·교차검증 2026-06: VSFe/Tech-Interview — JAVA_SPRING·gyoogle — Java/JVM/Hash·tecoble — equals/hashCode·johngrib — GC tuning · JLS·Effective Java(Item 11)·Oracle JVM Spec 교차검증.)