Java 상식적 면접 질문 완전 해석

📚 Java 기초

1. Java 의 특점은 어떤가?

Java 언어의 핵심 특징 이해

  • 면향 대상: 캡슐화, 계승, 다형성 등 특성 지원
  • 플랫폼 독립성: Write Once, Run Anywhere (WORA)
  • 자동 메모리 관리: 쓰레기 회수 기제 자동 메모리 해제
  • 다중 스레드 지원: 내장 스레드 기제, 병행 프로그래밍 편의
  • 안전성 강함: 타입 확인, 예외 처리 등 안전 기제 제공
  • 동적 특성: 실행 시간 타입 확인 및 동적 적재

2. JDK、JRE、JVM 의 차이?

Java 실행 환경 삼층 구조 이해

  • JVM (Java Virtual Machine): 가상 기계, 바이트 코드 실행 추상 컴퓨터, 크로스 플랫폼 특성 실현
  • JRE (Java Runtime Environment): 실행 환경, JVM 과 실행 필요한 클래스 라이브러리 포함
  • JDK (Java Development Kit): 개발 공구 모음, JRE + 컴파일러 + 조정 공구 등 개발 공구 포함
  • 포함 관계: JDK > JRE > JVM

3. 바이트 코드란? Java 가 크로스 플랫폼 가능한가?

Java 크로스 플랫폼 기제 원리 심층 이해

  • 바이트 코드 정의: Java 원본 코드 컴파일 생성 중간 코드, 파일 확장명 .class
  • 크로스 플랫폼 원리: Java 원본 코드 → 바이트 코드 → 다양한 플랫폼 JVM 실행
  • 우점: 한 번 컴파일, 여전히 실행; 개발자 다양한 플랫폼 대해 재설정 코드 작성 필요 없다
  • 실행 흐름: javac 컴파일러 .java 파일을 .class 파일로 컴파일, 다시 각 플랫폼 JVM 설명 실행

4. Java 중의 기본 데이터 타입은 어떤가?

Java 타입 체계 장악

  • 정수형: byte (1 바이트), short (2 바이트), int (4 바이트), long (8 바이트)
  • 부동 점형: float (4 바이트), double (8 바이트)
  • 문자형: char (2 바이트, Unicode 지원)
  • 불린형: boolean (1 바이트, true/false)
  • 기본값: 정수 0, 부동점 0.0, 불린 false, char '\\u0000'
  • 포장 클래스: Integer, Long, Float, Double, Boolean 등 해당 참조 타입

5. final、finally、finalize 의 차이?

세 가지 유사하나 완전히 다른 개념 구분

  • final (키워드): 클래스 수정 계승 불가, 방법 수정 재작성 불가, 변수 수정 재부여 불가
  • finally (키워드): try-catch-finally 중 코드 블록, 예외 여부 무관 모두 실행, 종종 자원 해제에 쓰임
  • finalize (방법): Object 클래스 방법, 대상 쓰레기 회수 전에 호출, 자원 청소 (이미 과시)
  • 응용 장면: final 불변성 제어에 쓰임, finally 예외 안전에 쓰임, finalize 이미 try-with-resources 대체

🎯 면향 대상 프로그래밍

6. 면향 대상이란? 네 가지 특성은 무엇인가?

OOP 핵심 이념 이해

  • 면향 대상 정의: 대상 단위 프로그래밍 사고, 대상 속성 및 행위 강조
  • 네 가지 특성:
  • 추상: 사물 공동 특징 추출, 본질 아닌 세부 무시
  • 캡슐화: 내부 실현 세부 숨김, 필요한 인터페이스 드러냄, 안전성 향상
  • 계승: 자식 클래스 부모 클래스 속성 및 방법 계승, 코드 재용 실현
  • 다형성: 같은 인터페이스 다양한 실현, 실행 시간 동적 결합

7. 다형성이란? 다형성의 실현 방식은 어떤가?

Java 다형성 기제 심층 이해

  • 다형성 정의: 한 개 대상이 다양한 형태 가짐, 같은 방법 호출 다양한 대상 위에서 다양한 표현
  • 실현 방식:
  • 컴파일 시간 다형성 (중복): 같은 이름 방법, 매개변수 다름, 컴파일 시간 확정 호출
  • 실행 시간 다형성 (재작성): 부모 클래스 참조 자식 클래스 대상 지시, 실행 시간 확정 실제 호출 방법
  • 실행 시간 다형성 조건: 계승, 재작성, 향상 전환
  • 우점: 코드 유연성 및 유지 보수성 향상, 인터페이스 프로그래밍 지원

8. 인터페이스와 추상 클래스의 차이?

두 가지 추상 기제의 다양한 비교

  • 추상 클래스: abstract 수정, 추상 방법과 구체적 방법 가질 수 있음
  • 인터페이스: interface 정의, 기본 방법 public abstract (Java 8+ 기본 실현 지원)
  • 계승 관계: 클래스 단 한 개 추상 클래스 계승, 그러나 여럿 인터페이스 실현
  • 접근 수정자: 추상 클래스 private/protected 쓸 수 있음, 인터페이스 구성원 기본 public
  • 변수: 추상 클래스 인스턴스 변수, 인터페이스 단지 정적 상수
  • 사용 장면: 추상 클래스 공유 코드에 쓰임, 인터페이스 규범 정의에 쓰임

9. 중복 (Overload) 과 재작성 (Override) 이란?

두 가지 유사하나 다른 개념 구분

  • 중복 (Overload):
  • 같은 클래스 중, 방법 이름 같음, 매개변수 타입/개수/순서 다름
  • 컴파일 시간 확정, 정적 결합 속성
  • 반환 값 타입 다를 수 있음 (그러나 반환 값만으로 구분 불가)
  • 재작성 (Override):
  • 자식 클래스 다시 부모 클래스 방법 실현, 방법 서명 완전 같음
  • 실행 시간 확정, 동적 결합 속성
  • 반환 값 타입과 예외 반드시 호환

10. 접근 수정자는 어떤가? 작용 범위는 무엇인가?

Java 접근 제어 기제 장악

  • public: 공개, 모든 클래스 접근 가능
  • protected: 보호됨, 같은 패키지 및 자식 클래스 접근 가능
  • default (수정자 없음): 기본, 같은 패키지 접근 가능
  • private: 개인, 단지 클래스 내부 접근 가능
  • 접근 범위 대비: public > protected > default > private
  • 최고 실행 방식: 최소화 접근 권한, 캡슐화 원칙 따르기

💾 메모리 관리 및 쓰레기 회수

11. Java 메모리 구조는 어떤가?

JVM 메모리 배분 이해

  • 힙 (Heap): 대상 인스턴스 저장, 모든 스레드 공유, 쓰레기 회수 주요 구역, 크기 설정 가능
  • 스택 (Stack): 지역 변수 및 방법 호출 저장, 각 스레드 독점, 자동 메모리 해제
  • 방법 구역 (Method Area): 클래스 구조 정보, 실행 시간 상수 풀, 정적 변수 저장 등, 모든 스레드 공유
  • 프로그램 계산기: 현재 스레드 실행 바이트 코드 명령 주소 기록
  • 현지 방법 스택: 현지 방법 (C/C++ 코드) 실행

12. 쓰레기 회수란? 쓰레기 회수 알고리즘은 어떤가?

GC 기제 심층 이해

  • 쓰레기 회수 정의: 자동 회수 더 이상 사용 대상 점유 메모리
  • 주요 알고리즘:
  • 표시 청소: 존활 대상 표시, 쓰레기 청소, 조각 생성
  • 복사 알고리즘: 두 개 메모리로 분할, 청소 시 존활 대상 복사, 조각 없으나 메모리 낭비
  • 표시 정리: 표시 후 압축 정리, 조각 없으나 성능 상대적 차다
  • 분대 알고리즘: 대상 분 신생대 및 구생대, 다양한 대 다양한 전략 쓰임
  • 우점: 자동 메모리 관리, 메모리 누수 피하기

13. 힙과 스택의 차이?

두 개 중요 메모리 구역 대비

  • 저장 내용: 힙 대상 저장, 스택 기본 타입 및 참조 저장
  • 스레드: 힙 모든 스레드 공유, 각 스레드 독립 스택
  • 관리: 힙 쓰레기 회수기 관리, 스택 자동 해제
  • 크기: 힙 일반적 더 크다, 스택 상대적 작다
  • 성능: 스택 배분 속도 빠르다, 힙 배분 상대적 느리다
  • 예외: 힙 넘침 OutOfMemoryError, 스택 넘침 StackOverflowError

14. 메모리 누수란? 피하는 방법은?

상식적 메모리 문제 인식

  • 메모리 누수 정의: 프로그램 신청 메모리 해제 불가능, 장기간 메모리 점유
  • 상식적 원인:
  • 장수명 주기 대상 참조 단기 수명 대상
  • 모음 중 대상 제때 청소 안 함
  • 청취자 또는 회신 취소 등록 안 함
  • 정적 모음 무한 증가
  • 피하는 방법: 제때 참조 해제, try-with-resources 사용, 정기적 메모리 사용 확인

15. 강한 참조、소프트 참조、약한 참조、가상 참조란?

Java 네 가지 참조 타입 이해

  • 강한 참조: 보통 참조, 대상 회수 안 됨, 강한 참조 없을 때까지
  • 소프트 참조 (SoftReference): 메모리 부족 시 회수됨, 캐시에 쓰임
  • 약한 참조 (WeakReference): 다음 GC 시 회수됨, WeakHashMap 에 쓰임
  • 가상 참조 (PhantomReference): 어느 시간 회수 가능, 참조 대기열과 함께 쓰여야 함, 대상 회수 추적에 쓰임
  • 회수 우선권: 가상 참조 > 약한 참조 > 소프트 참조 > 강한 참조

📦 모음 프레임워크

16. Java 모음 프레임워크 구조?

모음 프레임워크 전체 개념 장악

  • Collection 인터페이스:
  • List: 순서 있고 반복 가능, ArrayList、LinkedList 등
  • Set: 순서 없고 반복 불가, HashSet、TreeSet 등
  • Queue: 대기열, LinkedList、PriorityQueue 등
  • Map 인터페이스:
  • 키값 쌍 매핑: HashMap、TreeMap、ConcurrentHashMap
  • 전체 계층: Iterable → Collection/Map → 구체적 실현 클래스

17. ArrayList 와 LinkedList 의 차이?

두 가지 상식적 목록 실현 대비

  • 데이터 구조: ArrayList 배열 기반, LinkedList 쌍방향 연결리스트 기반
  • 임의 접근: ArrayList O(1), LinkedList O(n)
  • 삽입 삭제: ArrayList O(n), LinkedList O(1)
  • 메모리 점유: ArrayList 연속, LinkedList 분산 (포인터 개황)
  • 스레드 안전: 둘 다 비동기, Collections.synchronizedList() 또는 CopyOnWriteArrayList 쓸 수 있음
  • 선택: 자주 조회하면 ArrayList 쓰임, 자주 삽입 삭제하면 LinkedList 쓰임

18. HashMap 의 원리와 성능?

HashMap 일할 기제 심층 이해

  • 데이터 구조: 배열 + 연결리스트 + 빨강검은색 나무 (JDK 8+)
  • 일할 원리: hash(key) % table.length 배열 아래 첨자 계산, 충돌 시 연결 또는 나무화
  • 적재 인자: 기본 0.75, 이미 사용 용량 ≥ 용량 × 적재 인자 시 확대
  • 확대 기제: 용량 배로, 요소 다시 해시 위치 정하기
  • 시간 복잡도: 평균 O(1), 최악 O(n) (대량 충돌 시)
  • 스레드 안전: 비동기, 다중 스레드 쓰면 ConcurrentHashMap 또는 Collections.synchronizedMap() 쓰임

19. HashSet 어떻게 반복 피하는가?

Set 제거 중복 기제 이해

  • 저층 실현: HashMap 기반, 키 요소, 값 고정 Object
  • 제거 중복 기제: 먼저 hashCode() 비교, 다시 equals() 판정 같은가
  • 더하기 흐름: hash 계산 → 존재 여부 확인 → 불존재 더하기 → 존재 무시
  • 맞춤형 대상: 반드시 equals() 와 hashCode() 재작성, 일관성 보장
  • 성능: 더하기, 삭제, 조회 평균 O(1), hash 품질에 따라 정함

20. fail-fast 와 fail-safe 란?

모음 반복자 안전 기제 이해

  • fail-fast:
  • 반복 과정 중 모음 수정하면 ConcurrentModificationException 던짐
  • modCount 와 expectedModCount 통해 검출
  • ArrayList、HashMap 등 (비 스레드 안전)
  • fail-safe:
  • 반복 모음 스냅샷 또는 사본 기반, 원래 모음 수정해도 반복 영향 안 받음
  • CopyOnWriteArrayList、ConcurrentHashMap 등
  • 사용 건의: 반복 시 반복자의 remove() 쓰임, 또는 fail-safe 모음 쓰임

⚠️ 예외 처리

21. Java 예외 체계?

Java 예외 분류 이해

  • Throwable (근 클래스):
  • Exception (예외): 회복 가능 예외
  • Error (오류): 가상 기계급 오류, 회복 불가능
  • Exception 분류:
  • 확인 예외 (Checked): 반드시 포획 또는 선언, IOException 등
  • 미확인 예외 (Unchecked): 포획 안 해도 됨, NullPointerException、IndexOutOfBoundsException 등
  • 상식적 예외: NPE、ClassCastException、ArrayIndexOutOfBoundsException 등

22. try-catch-finally 실행 순서?

예외 처리 실행 흐름 장악

  • 정상 상황: try → finally → 정상 반환
  • 예외 상황: try → 예외 발생 → catch → finally → 예외 전달 또는 반환
  • finally 특성: 반드시 실행, 비록 catch 중 return、throw、System.exit()
  • 예외 상황: finally 중 return 은 try/catch 의 return 덮어씀
  • 자원 해제: try-with-resources 쓰기 추천, 자동 자원 닫기
  • 최고 실행 방식: finally 중 반환 값 바꾸지 않기, 예외 손실 야기됨

23. throws 와 throw 의 차이?

두 가지 예외 처리 키워드 구분

  • throw:
  • 수동 예외 인스턴스 던짐, 반드시 방법 내 쓰임
  • 형식: throw new Exception("message")
  • throws:
  • 방법 서명 중 가능 던질 예외 선언
  • 형식: public void method() throws IOException
  • 처리 방식: throw 는 throws 선언, throws 는 호출자 처리
  • 응용: throw 구체적 예외 처리에 쓰임, throws 예외 전달에 쓰임

24. 어떻게 맞춤형 예외를 정의하는가?

사업 특정 예외 클래스 창조

  • 계승 관계: Exception (확인 예외) 또는 RuntimeException (미확인 예외) 계승
  • 필요한 부분:
  • 무매개변수 구성기 제공
  • 함유 message 구성기 제공
  • 함유 message 와 cause 구성기 제공
  • 코드 예시: public class CustomException extends Exception { ... }
  • 최고 실행 방식: 명확한 명칭, 분명한 문서, 적당한 예외 클래스 계승

25. try-with-resources 문법의 좋은 점?

자원 자동 관리 이해

  • 문법: try (InputStream is = ...) { ... } 자동 자원 닫기
  • 요구: 자원 반드시 AutoCloseable 인터페이스 실현
  • 우점:
  • 자동 close() 방법 호출, 수동 관리 필요 없음
  • 예외 압제 시 올바른 처리 가능
  • 코드 더 간결, 자원 누수 피하기
  • 응용 장면: File、Stream、Connection、Statement 등 자원 클래스

🔤 String、StringBuilder、StringBuffer

26. String 불변성 및 그 원인?

String 설계 심층 고려 이해

  • 불변 정의: String 대상 창조 후 수정 불가능, 모든 수정 조작 신 대상 반환
  • 실현 방식: value 배열 final 수정, setter 방법 없음
  • 불변 원인:
  • 문자열 완충 풀 최적화, 반복 창조 피하기
  • 스레드 안전, 동기 필요 없음
  • hashCode 완충 지원, HashMap 키 되기 적합
  • 단점: 자주 수정 시 대량 중간 대상 창조

27. String、StringBuilder、StringBuffer 의 차이?

적당한 문자열 조작 클래스 선택

  • String: 불변, 스레드 안전, 성능 차이 (자주 수정)
  • StringBuilder: 가변, 비 스레드 안전, 성능 우수 (단일 스레드)
  • StringBuffer: 가변, 스레드 안전 (동기 방법), 성능 일반 (다중 스레드)
  • 성능 대비: StringBuilder > StringBuffer > String
  • 사용 건의:
  • 단일 스레드 문자열 연결 StringBuilder 쓰임
  • 다중 스레드 문자열 연결 StringBuffer 쓰임
  • 수정 필요 없으면 String 쓰임

28. 문자열 상수 풀이란?

문자열 완충 기제 이해

  • 정의: JVM 유지 문자열 완충, 문자열 문자 저장
  • 위치: JDK 7+ 힙 중, 이전 방법 구역
  • 창조 기제:
  • 문자 같은 "abc" 자동 완충 들어옴
  • new String("abc") 만약 "abc" 풀 중 없으면 더하기
  • intern() 방법: 문자열 완충 더하기 또는 현재 참조 반환
  • 최적화 효과: 메모리 절약, 문자열 비교 빠르게

29. 어떻게 문자열 같은가 비교하는가?

문자열 비교 방법 장악

  • == 비교: 참조 같은가 비교, 내용 비교 안 함
  • equals() 비교: 문자열 내용 같은가 비교, 추천 쓰임
  • equalsIgnoreCase() 비교: 대소문자 무시 내용 비교
  • compareTo() 비교: 사전 순서 비교, 정수 반환
  • Objects.equals(): null 값 처리 안전 비교
  • 최고 실행 방식: 문자열 내용 비교하면 equals() 쓰임, == 쓰지 않기

30. String 연결의 성능 문제?

문자열 연결 성능 최적화

  • 문제: String s = "a" + "b" + "c" 다양한 중간 대상 및 복사 생성
  • 원인: String 불변, 매번 연결이 신 대상 창조
  • 성능 영향: 반복 연결 시 O(n²) 시간 복잡도
  • 최적화 방안:
  • 직접 + 반복 외면: 컴파일기 StringBuilder 로 최적화
  • 현저히 StringBuilder 또는 StringBuffer 쓰임
  • String.join()、StringJoiner 등 공구 쓰임

🔄 다중 스레드 및 병행

31. 스레드란? 스레드는 어떻게 창조하는가?

스레드 기본 개념 및 창조 방식 장악

  • 스레드 정의: 프로세스 내 독립 실행 흐름, 메모리 공유 그러나 독립 스택
  • 창조 방식:
  • 계승 Thread: public class MyThread extends Thread { public void run() {} }
  • 실현 Runnable: public class MyRunnable implements Runnable { public void run() {} }
  • 실현 Callable: 반환 값 및 예외 지원
  • 구분: Runnable 추천, 단일 계승 제한 피하기
  • 시작: thread.start() 호출, 직접 run() 호출 불가

32. 스레드 생명 주기 및 상태?

스레드 다양한 상태 전환 이해

  • NEW: 스레드 창조 그러나 미시작
  • RUNNABLE: 실행 가능 상태 (실행 기다림 또는 실행 중)
  • BLOCKED: 차단 상태, 잠금 획득 기다림
  • WAITING: 기다림 상태, 다른 스레드 통지 기다림
  • TIMED_WAITING: 정해진 시간 기다림
  • TERMINATED: 스레드 종료
  • 상태 전환: NEW → RUNNABLE → BLOCKED/WAITING → TERMINATED

33. synchronized 일할 원리?

Java 내장 잠금 기제 이해

  • 동기 기제: 대상 내장 잠금 사용 동기 실현
  • 사용 방식:
  • 동기 방법: public synchronized void method() {}
  • 동기 블록: synchronized(obj) { ... }
  • 일할 원리:
  • 각 대상 감시 (monitor) 가짐
  • 스레드 잠금 획득 한계 구역 들어옴, 상호 배타적 실행
  • 바이트 코드: monitorenter、monitorexit
  • 특성: 재들어옴, 배타적, 자동 해제

34. volatile 키워드 작용?

메모리 가시성 및 명령 재배치 금지 이해

  • 작용:
  • 가시성: 수정 다른 스레드에게 즉시 가시 보증
  • 재배치 금지: 컴파일기 및 CPU 재배치 최적화 차단
  • 실현: 메모리 방벽, 주 메모리에서 강제 읽기쓰기
  • 제한: 원자성 보증 불가, synchronized 대체 불가
  • 응용 장면: 표지 비트, 쌍 확인 단일 예시, 상태 표시
  • 대비 synchronized: volatile 더 경량 그러나 기능 제한

35. wait()、notify()、notifyAll() 작용 및 차이?

스레드 간 통신 기제 장악

  • wait():
  • 현재 스레드 잠금 해제 기다림 들어옴, 깨어날 때까지
  • 반드시 동기 블록 내 호출
  • notify():
  • 한 개 기다림 스레드 깨움 (임의 선택)
  • 잠금 해제 안 함, 동기 블록 결말 때 해제
  • notifyAll():
  • 모든 기다림 스레드 깨움
  • 사용 모형: Producer-Consumer 모형, 감시기 모형

💡 면접 준비 건의

기초 심화: 단지 개념 아는 것 아니라, 더욱 원리 및 실현 세부 이해

많이 연습: 코딩 실행을 통해 지식 공고, 특별 다중 스레드 및 병행 관련

원본 코드 읽기: Java 문고 원본 코드 연구 (모음, 병행 등) 이해 심화

세부 주목: 상식적 함정 및 최고 실행 방식 장악, 문자열 비교, 모음 수정 등

예시 설명: 면접 시 구체적 예시 사용 개념 설명, 표현 능력 증강