📚 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 문고 원본 코드 연구 (모음, 병행 등) 이해 심화
세부 주목: 상식적 함정 및 최고 실행 방식 장악, 문자열 비교, 모음 수정 등
예시 설명: 면접 시 구체적 예시 사용 개념 설명, 표현 능력 증강