신입 면접에서 자주 묻는 질문 정리 - 자바(JAVA)편
2025. 10. 4. 17:47

※ 지인들이나 제가 경험했었던 면접들에서 주로 질문받았던 내용들입니다.

제 경험상 기본적인 CS지식과 프로젝트 관련 지식, 그리고 인성관련 질문 크게 3가지로 나뉘었으며,

CS지식부터 순차적으로 정리해나갈 예정입니다.

 

 

1. Java 구동원리

Java 소스코드(.java)를 javac 컴파일러가 바이트코드(.class)로 변환. 이 바이트코드를 JVM이 각 운영체제에 맞게 해석하여 실행. 이를 통해 "Write Once, Run Anywhere" 원칙을 구현하며, 플랫폼 독립성을 제공.

2. JVM, JRE, JDK의 관계

  • JVM (Java Virtual Machine): 바이트코드를 실행하는 가상머신으로, 메모리 관리와 GC를 담당
  • JRE (Java Runtime Environment): JVM + 실행에 필요한 라이브러리들의 집합
  • JDK (Java Development Kit): JRE + 개발도구(javac, javadoc 등)를 포함
  • 관계: JDK ⊃ JRE ⊃ JVM

3. 객체지향 프로그래밍(OOP)과 객체, 클래스

OOP는 현실 세계의 사물을 객체로 모델링하여 프로그래밍하는 패러다임. 데이터와 동작을 하나로 묶어 캡슐화하고, 재사용성과 유지보수성을 향상.

  • 클래스: 객체를 만들기 위한 설계도이자 틀
  • 객체: 클래스를 기반으로 생성된 실체(인스턴스)

4. OOP의 4대 속성과 SOLID 원칙

4대 속성

  1. 캡슐화: 데이터와 메서드를 하나로 묶고 외부 접근을 제한
  2. 상속: 부모 클래스의 속성과 메서드를 자식 클래스가 물려받음
  3. 다형성: 같은 인터페이스로 다양한 구현체를 사용 (오버로딩, 오버라이딩)
  4. 추상화: 공통적인 특성을 추출하여 불필요한 세부사항을 숨김

SOLID 원칙

  1. S (Single Responsibility): 클래스는 하나의 책임만 가져야 함
  2. O (Open-Closed): 확장에는 열려있고 수정에는 닫혀있어야 함
  3. L (Liskov Substitution): 자식 클래스는 부모 클래스를 대체 가능해야 함
  4. I (Interface Segregation): 클라이언트는 사용하지 않는 인터페이스에 의존하지 않아야 함
  5. D (Dependency Inversion): 구체적인 것이 아닌 추상적인 것에 의존해야 함

5. 오버로딩과 오버라이딩

  • 오버로딩: 같은 이름의 메서드를 매개변수의 타입, 개수, 순서를 다르게 하여 여러 개 정의 (컴파일 타임 다형성)
  • 오버라이딩: 부모 클래스의 메서드를 자식 클래스에서 재정의 (런타임 다형성)

6. 가비지 컬렉터(GC)

정의

더 이상 참조되지 않는 객체를 자동으로 메모리에서 제거하는 JVM의 메모리 관리 기능.

작동 원리

  • Mark-Sweep 알고리즘: Root로부터 도달 가능한 객체를 마킹(Mark)하고, 마킹되지 않은 객체를 제거(Sweep)
  • 세대별 GC: Heap을 Young Generation(Eden, Survivor), Old Generation으로 구분. 대부분 객체는 금방 unreachable 상태가 되므로 Young 영역에서 Minor GC로 빠르게 처리하고, 오래 살아남은 객체는 Old 영역으로 이동시켜 Major GC로 처리

7. Call by Value와 Call by Reference

  • Call by Value: 값 자체를 복사하여 전달. 원본 데이터 변경 불가
  • Call by Reference: 주소값을 전달하여 원본 데이터에 직접 접근. 원본 데이터 변경 가능
  • Java는 Call by Value만 지원: 참조 타입도 참조값(주소)을 복사하여 전달하므로 Call by Value

8. 얕은 복사와 깊은 복사

  • 얕은 복사: 객체의 주소값만 복사. 복사본과 원본이 같은 객체를 참조하여 한쪽 수정 시 다른 쪽도 영향을 받음
  • 깊은 복사: 객체의 실제 값을 새로운 메모리 공간에 복사. 복사본과 원본이 독립적으로 존재

9. 접근제어자

클래스, 메서드, 변수의 접근 범위를 제한하는 키워드.

  • public: 모든 곳에서 접근 가능
  • protected: 같은 패키지 + 상속받은 클래스에서 접근 가능
  • default: 같은 패키지 내에서만 접근 가능
  • private: 해당 클래스 내에서만 접근 가능

10. final과 static

final

  • 변수: 상수로 선언되어 값 변경 불가
  • 메서드: 오버라이딩 불가
  • 클래스: 상속 불가

static

  • 클래스 레벨에 속하며 인스턴스 생성 없이 접근 가능
  • 모든 인스턴스가 공유하는 변수나 메서드
  • 프로그램 시작 시 메모리(Method Area)에 할당되어 종료 시까지 유지

11. 추상클래스와 인터페이스

추상클래스 (abstract class)

  • 추상 메서드를 하나 이상 포함하는 클래스
  • 일반 메서드와 필드를 가질 수 있음
  • 단일 상속만 가능
  • "is-a" 관계 (공통 기능을 가진 클래스들의 추상화)

인터페이스 (interface)

  • 추상 메서드의 집합 (Java 8부터 default, static 메서드 포함 가능)
  • 다중 구현 가능
  • "can-do" 관계 (구현 객체의 행위 명세)

12. String, StringBuilder, StringBuffer

String

  • 불변(immutable) 객체. 값 변경 시 새로운 객체 생성
  • Thread-safe
  • 문자열 변경이 적을 때 사용

StringBuilder

  • 가변(mutable) 객체. 기존 객체에서 값 수정
  • Thread-unsafe (동기화 미지원)
  • 단일 스레드 환경에서 문자열 변경이 많을 때 사용

StringBuffer

  • 가변 객체
  • Thread-safe (동기화 지원)
  • 멀티 스레드 환경에서 문자열 변경이 많을 때 사용

13. List, Set, Map

List

  • 순서가 있고 중복을 허용하는 컬렉션
  • 인덱스로 요소 접근 가능
  • 구현체: ArrayList, LinkedList, Vector

Set

  • 순서가 없고 중복을 허용하지 않는 컬렉션
  • 구현체: HashSet, TreeSet, LinkedHashSet

Map

  • Key-Value 쌍으로 데이터를 저장. Key는 중복 불가, Value는 중복 가능
  • 구현체: HashMap, TreeMap, LinkedHashMap, HashTable

14. ArrayList와 LinkedList

ArrayList

  • 내부적으로 배열 기반
  • 조회: O(1) - 인덱스로 직접 접근
  • 삽입/삭제: O(n) - 중간 삽입 시 요소 이동 필요
  • 검색이 빈번할 때 유리

LinkedList

  • 노드가 포인터로 연결된 구조
  • 조회: O(n) - 순차 탐색 필요
  • 삽입/삭제: O(1) - 포인터만 변경 (위치 찾는 시간 제외)
  • 삽입/삭제가 빈번할 때 유리

15. 예외처리

프로그램 실행 중 발생하는 오류를 처리하는 메커니즘.

  • Checked Exception: 컴파일 시점에 확인. 반드시 처리 필요 (IOException, SQLException 등)
  • Unchecked Exception: 런타임 시점에 확인. 처리 선택 가능 (NullPointerException, ArrayIndexOutOfBoundsException 등)
  • 처리 방법: try-catch-finally, throws로 예외 전가

16. ==와 equals()

== 연산자

  • 기본형: 값 자체를 비교
  • 참조형: 주소값(참조값)을 비교하여 동일 객체인지 확인

equals()

  • 객체의 내용(논리적 동등성)을 비교
  • Object 클래스의 기본 구현은 ==와 동일하나, String 등 많은 클래스에서 내용 비교로 오버라이딩됨
  • 사용자 정의 클래스에서 논리적 동등성 비교를 위해 오버라이딩 가능