2025 CS 스터디

10 minute read

=== JAVA 핵심 개념 정리 ===

[1] JVM 구조

  • 정의: 자바 바이트코드를 실행하는 가상 머신으로, 스택 기반으로 동작하며 자동 메모리 관리를 제공
  • 장점: 운영체제 독립성, 가비지 컬렉션(GC)을 통한 메모리 자동 관리
  • 단점: 실행 속도가 상대적으로 느림, 다중 상속 불가, 타입 제약 존재

[2] GC (Garbage Collection) 처리 방법

  • 역할: 더 이상 사용하지 않는 객체의 메모리를 자동으로 회수
  • 특징: GC 중에는 다른 스레드가 일시 중지되고, 정리 후 재개됨 (Stop-the-world)

[3] HashMap vs HashTable vs ConcurrentHashMap

  • HashMap: 동기화 미지원 (싱글 스레드용), null 허용
  • HashTable: 동기화 지원 (멀티 스레드용), 전체 성능 낮음
  • ConcurrentHashMap: 부분 동기화 지원, null 허용 안 됨, 멀티 스레드에 적합

[4] 접근 제어자 종류

  • public: 어디서든 접근 가능
  • protected: 같은 패키지 + 다른 패키지의 상속 클래스에서 접근 가능
  • default: 같은 패키지 내에서만 접근 가능
  • private: 해당 클래스 내부에서만 접근 가능

[5] Interface vs Abstract Class

  • 공통점: 인스턴스 생성 불가, 하위 클래스에서 구현 필요
  • Interface: 메서드 강제 구현, 다중 상속 가능
  • Abstract Class: 공통 로직 구현 가능, 단일 상속만 가능

[6] String vs StringBuilder vs StringBuffer

  • String: 불변 객체, 문자열 변경 시 새로운 객체 생성
  • StringBuilder: 가변 객체, 동기화 미지원 (싱글 스레드용)
  • StringBuffer: 가변 객체, 동기화 지원 (멀티 스레드용)

[7] try-with-resource

  • 설명: try 블록에 선언한 자원은 자동으로 close 처리됨
  • 장점: finally 없이 자원 정리 가능 → 코드 간결화 및 가독성 향상

[8] synchronized 키워드

  • 목적: 동시성 문제 방지를 위해 메서드나 블록을 동기화
  • 주의: 과도한 동기화는 성능 저하 유발 가능

[9] static 변수 메모리 영역

  • 저장 위치: JVM의 Method Area (또는 Class Area)
  • 생명주기: 클래스 로딩 시 생성되고, 프로그램 종료 시까지 유지

[10] 컬렉션 프레임워크 요약

  • List: 순서 O, 중복 O → ArrayList, LinkedList
  • Set: 순서 X, 중복 X → HashSet, TreeSet
  • Map: 키-값 저장 → HashMap, TreeMap
  • Queue: FIFO 구조 → PriorityQueue 등dk

[11] 제네릭(Generic)

  • 개념: 클래스나 메서드에서 사용할 타입을 외부에서 지정
  • 장점: 타입 안정성 증가, 코드 재사용성 증가

[12] Vector vs ArrayList vs LinkedList

  • Vector: 동기화 O, 성능 ↓
  • ArrayList: 동기화 X, 랜덤 접근 ↑
  • LinkedList: 삽입/삭제 ↑, 랜덤 접근 ↓

[13] 오버로딩 vs 오버라이딩

  • 오버로딩: 같은 메서드 이름 + 매개변수 다름
  • 오버라이딩: 상위 클래스 메서드를 하위 클래스에서 재정의

[14] Checked vs Unchecked Exception

  • CheckedException: 컴파일 시 체크됨 (IOException, SQLException 등)
  • UncheckedException: 런타임 예외, 체크 불필요 (NPE, IndexOutOfBounds 등)

[15] final / finally 차이

  • final: 상수 선언 / 메서드 오버라이딩 금지 / 클래스 상속 금지
  • finally: 예외 발생 여부와 관계없이 반드시 실행되는 블록
  1. [new String() vs 리터럴(“”) 차이]
    • new String(“abc”): 매번 새로운 객체 (Heap 저장)
    • “abc”: String Constant Pool 재사용
  2. [직렬화 (Serialization)]
    • 객체를 바이트로 변환 → 파일 저장, 전송 가능
    • 역직렬화: 바이트 → 객체
    • 사용: 파일 저장, 네트워크 전송, 캐시
    • 구현: Serializable, ObjectOutputStream
  3. [불변 객체 (Immutable)]
    • 생성 후 상태 변경 불가
    • 예시: String, Integer, LocalDateTime
    • 조건:
  4. 필드 모두 private final
  5. 생성자로 초기화
  6. 상태 변경 시 새 객체 반환

  7. [인스턴스 생성 과정]
    • new 사용 → 생성자 호출 → 힙에 메모리 할당
    • 예시: Person p = new Person("홍길동");
  8. [다형성 메소드 예시]
    • System.out.println(Object) → toString 오버라이딩
    • Collections.sort(List) → Comparable에 따라 다르게 정렬
    • Object.equals(Object) → 타입별 동작 다름
  9. [Mutex vs Semaphore]
    • Mutex: 한 쓰레드만 접근 (synchronized, ReentrantLock)
    • Semaphore: 여러 쓰레드 접근 제한 (예: 최대 3개) → new Semaphore(3)
  10. [프로세스 vs 스레드]
    • 프로세스: OS 자원 독립적
    • 스레드: 프로세스 내 실행 단위, 메모리 공유
  11. [병렬 스트림 주의사항]
    • ForkJoinPool 공유 → 성능 저하 가능
    • 상태 공유 시 race condition
    • 해결: 상태 없는 작업에만 사용, 커스텀 스레드풀 설정
  12. [클래스 vs 객체]
    • 클래스: 설계도 (class Car {})
    • 객체: 인스턴스 (new Car())
  13. [Mutable vs Immutable 객체]
    • Mutable: 상태 변경 가능 (ArrayList 등)
    • Immutable: 상태 변경 불가 (String 등), 멀티스레드에 유리
  14. [스레드 간 공유 영역]
    • 공유 가능: 힙 (객체, 배열)
    • 공유 불가: 스택 (지역 변수)
    • 동기화 방법: synchronized, Lock, Atomic
  15. [Stack vs LinkedList vs List]
    • Stack: LIFO
    • LinkedList: 노드 연결
    • List: 인터페이스 (ArrayList/LinkedList 구현체 포함)
  16. [병렬 작업 시 주의]
    • 공유 자원 동기화 필수
    • ThreadPool 적절 설정
    • 데드락 방지 설계 필요
  17. [Heap vs Stack 메모리]
    • Heap: 객체 저장, GC 대상
    • Stack: 지역 변수 저장, 메서드 호출 시 사용

** 스프링 **

1) 스프링 IoC (Inversion of Control) 제어의 역전이란 객체의 생성 및 제어를 개발자가 직접 하지 않고, 스프링 컨테이너가 대신 관리하는 것

2) OOP와 AOP의 차이 OOP: 캡슐화, 상속, 다형성 등을 활용한 객체 중심 설계 AOP: 공통 관심사를 분리하여 모듈화 (로깅, 트랜잭션 등)

3) AOP의 장단점 장점: 중복 코드 제거, 유지보수성 향상, 핵심 로직과 부가 기능 분리 단점: 설정이 복잡하고 코드 흐름 파악이 어려울 수 있음

4) POJO (Plain Old Java Object) 특정 기술에 종속되지 않는 순수 자바 객체로, 재사용성과 테스트 용이성이 높음

5) MVC 패턴 흐름 클라이언트 요청 → DispatcherServlet 수신 → HandlerMapping으로 컨트롤러 찾기 → 컨트롤러 실행 → ModelAndView 반환 → ViewResolver를 통해 View 응답

6) 프레임워크 vs 라이브러리 프레임워크: 흐름 제어 (IoC) 중심, 개발자가 특정 부분만 작성 라이브러리: 개발자가 직접 호출하여 사용

7) DI (Dependency Injection) 스프링 컨테이너가 의존성을 관리하고 주입 사용 예: @Autowired, @Inject, @Bean 등

8) RESTful API REST 원칙을 따르는 API

  • 자원은 URI로 표현
  • HTTP 메서드로 동작 명시 (GET, POST, PUT, DELETE)

9) 디자인 패턴 3가지

  • 싱글톤: 하나의 인스턴스만 유지
  • 팩토리: 객체 생성 로직을 서브 클래스에 위임
  • 템플릿: 공통 구조 제공 + 변경 부분은 하위 클래스가 정의r
  • 빌더 패턴도 객체 생성 시 자주 활용

10) CORS (Cross-Origin Resource Sharing) 도메인 간 자원 공유 보안 정책 서버에서 Access-Control-Allow-Origin 설정 필요

11) OAuth 2.0 인증 흐름

  1. 클라이언트가 인증 요청
  2. 권한 서버에서 Authorization Code 발급
  3. Code로 Access Token 요청
  4. Access Token으로 보호 자원 요청

12) Call By Value vs Call By Reference

  • Call By Value: 값 복사 → 원본 영향 없음
  • Call By Reference: 참조 전달 → 원본 영향 있음

13) DAO vs DTO vs VO

  • DAO: DB 접근 로직 처리
  • DTO: 계층 간 데이터 전달 (getter/setter만 존재)
  • VO: 불변 객체, 읽기 전용 데이터

14) MVC 패턴의 장점

  • Model: 비즈니스 로직
  • View: UI 처리
  • Controller: 흐름 제어 → 역할 분리로 유지보수성 향상

15) 서블릿 컨테이너란? 서블릿의 생성/실행/소멸을 담당하는 환경 요청마다 쓰레드를 생성하여 처리 (멀티쓰레드) 예: Tomcat

16) 디스패처 서블릿(DispatcherServlet)이란? 모든 요청을 받아 적절한 컨트롤러에 전달하는 Front Controller Spring MVC의 핵심 요소

17) 웹소켓(WebSocket) HTTP와 달리 실시간 양방향 통신 지원 사용 예: 채팅, 주식 시스템, 게임 등

18) OAuth 2.0 흐름 정리

  • 클라이언트 → 인증 요청
  • 사용자 로그인 → Authorization Code 발급
  • Code → Access Token 교환
  • Access Token → 보호된 리소스 접근

19) OAuth란? 제3자 인증 방식 비밀번호 직접 제공 없이 인증 가능 소셜 로그인에 주로 사용 (Google, Naver 등)

20) Autowiring 과정 스프링이 자동으로 의존 객체를 주입 어노테이션: @Autowired, @Inject, @Resource → 일치하는 빈 검색, 없으면 예외 또는 @Qualifier/@Primary 사용

21) Spring 구동 시 메서드 실행 방법

  • CommandLineRunner / ApplicationRunner 구현
  • @PostConstruct
  • ApplicationReadyEvent 리스너 등록
  • InitializingBean.afterPropertiesSet()
  • @Bean(initMethod = “initMethodName”)

22) 웹플럭스(WebFlux)와 Mono

  • WebFlux: 비동기 논블로킹 웹 프레임워크
  • Mono: 0 또는 1개의 데이터 처리
  • Flux: 0개 이상의 스트림 처리 → 고성능 실시간 처리에 적합

23) AOP (Aspect-Oriented Programming) 공통 관심사를 핵심 로직과 분리하여 모듈화

주요 개념:

  • Aspect: 관심사 정의 (예: 로깅)
  • Advice: 실행 시점 코드 (Before, After 등)
  • Pointcut: 대상 메서드 정의
  • JoinPoint: 실행 지점
  • Weaving: 적용 과정

예시: @Aspect @Component public class LoggingAspect { @Before(“execution(* com.example.service..(..))”) public void logBefore(JoinPoint joinPoint) { System.out.println(“Method 실행: “ + joinPoint.getSignature().getName()); } }

📘 데이터베이스 기술 면접 요약 정리

──────────────────────────────

  1. Connection Pool을 사용하는 이유 ──────────────────────────────
    • DB 연결 시 3-way, 4-way handshake 반복 → 리소스 소모
    • 매번 새로운 연결 생성 시 성능 저하
    • Connection Pool은 미리 연결을 생성하고 재사용 → 성능 향상

──────────────────────────────

  1. 데이터베이스 언어 (DDL, DML, DCL) ──────────────────────────────
    • DDL (정의어): CREATE, ALTER, DROP
    • DML (조작어): SELECT, INSERT, UPDATE, DELETE
    • DCL (제어어): GRANT, REVOKE, COMMIT, ROLLBACK

──────────────────────────────

  1. Trigger란? ──────────────────────────────
    • 테이블에 대한 INSERT, DELETE, UPDATE 시 자동 실행
    • 로깅, 무결성 유지, 복잡한 검증 로직에 활용

──────────────────────────────

  1. LEFT OUTER JOIN ──────────────────────────────
    • 왼쪽 테이블의 모든 행 유지, 일치하는 오른쪽 테이블의 값 병합
    • 일치하지 않으면 NULL 반환

예시: SELECT A., B. FROM A LEFT OUTER JOIN B ON A.id = B.a_id;

──────────────────────────────

  1. RDBMS vs NoSQL ────────────────────────────── [RDBMS]
    • 스키마 존재, 정규화, JOIN 가능, ACID 보장
    • 트랜잭션이 중요한 시스템에 적합

[NoSQL]

  • 스키마 없음, 유연한 구조 (Document, Key-Value 등)
  • 대용량 데이터 분산 처리, 수평 확장 용이
  • 가용성 중시, 빅데이터/실시간 분석에 적합

──────────────────────────────

  1. Index 개념 및 장단점 ──────────────────────────────
    • 장점: 검색 속도 향상, WHERE/ORDER BY 성능 개선
    • 단점: 삽입/수정/삭제 시 오버헤드 발생, 인덱스 과다 생성 시 성능 저하

──────────────────────────────

  1. SQL Injection ──────────────────────────────
    • 사용자 입력으로 SQL이 조작되는 보안 취약점

예시 (취약 코드): SELECT * FROM users WHERE username = ‘admin’ AND password = ‘’ OR ‘1’ = ‘1’;

[예방 방법]

  • Prepared Statement 사용
  • ORM 사용 (JPA 등)
  • 입력값 검증

──────────────────────────────

  1. ORM (Object-Relational Mapping) ──────────────────────────────
    • 객체와 RDBMS 테이블 간 매핑
    • SQL 없이 데이터 조작 가능

예시 (JPA): @Entity public class User { @Id @GeneratedValue private Long id; private String name; }

──────────────────────────────

  1. N+1 문제와 해결 방법 ──────────────────────────────
    • Lazy Loading으로 인해 N개의 추가 쿼리 발생

[해결책]

  • Fetch Join 사용 (JOIN FETCH)
  • @BatchSize 사용
  • EntityGraph 활용

──────────────────────────────

  1. 트랜잭션(Transaction) ──────────────────────────────
    • 데이터 변경의 논리적 단위
    • 하나라도 실패 시 전체 롤백

──────────────────────────────

  1. ACID 원칙 ──────────────────────────────
    • Atomicity: 원자성 (전체 성공 or 전체 실패)
    • Consistency: 일관성 유지
    • Isolation: 고립성 보장
    • Durability: 내구성 (시스템 장애 후에도 보존)

──────────────────────────────

  1. 트랜잭션 격리 수준 (Transaction Isolation) ────────────────────────────── 1) READ UNCOMMITTED
    • 커밋되지 않은 데이터 읽기 가능
    • Dirty Read 발생 가능 (성능↑)

2) READ COMMITTED

  • 커밋된 데이터만 읽기 가능
  • Non-repeatable Read 발생 가능
  • 대부분 RDBMS 기본

3) REPEATABLE READ

  • 조회한 데이터는 트랜잭션 내에서 고정
  • Phantom Read 발생 가능

4) SERIALIZABLE

  • 가장 높은 격리 수준
  • 모든 현상 방지, 성능 ↓

──────────────────────────────

  1. 정규화 (Normalization) ──────────────────────────────
    • 중복 최소화, 무결성 유지

1NF: 원자값으로 분해 2NF: 부분 함수 종속 제거 3NF: 이행 함수 종속 제거

──────────────────────────────

  1. UNION vs UNION ALL ──────────────────────────────
    • UNION: 중복 제거, 성능 ↓
    • UNION ALL: 중복 허용, 성능 ↑

예시: SELECT name FROM employees UNION SELECT name FROM managers;

SELECT name FROM employees UNION ALL SELECT name FROM managers;

**네트워크**

  1. TCP와 UDP의 차이
    • TCP (Transmission Control Protocol) 연결형 프로토콜 (3-way Handshake) 데이터 전송의 신뢰성 보장 (순서 보장, 재전송, 흐름제어) 속도가 상대적으로 느림 예시: 파일 전송, 이메일, 웹 브라우징
    • UDP (User Datagram Protocol) 비연결형 프로토콜 (Handshake 없음) 데이터 손실 가능성 있음 (순서 보장 없음, 재전송 없음) 속도가 빠름 예시: 실시간 스트리밍, 온라인 게임
  2. HTTP와 HTTPS 차이 및 HTTPS에서 S의 계층
    • HTTP (HyperText Transfer Protocol): 평문 데이터 전송, 보안 취약
    • HTTPS (HTTP Secure): SSL/TLS 암호화 적용, 보안 강화
    • SSL/TLS 계층: 전송 계층과 응용 계층 사이에서 동작
  3. 쿠키와 세션의 차이
    • 쿠키: 클라이언트(브라우저)에 저장, 서버의 부담이 적음
    • 세션: 서버에 저장, 보안성 높지만 서버 자원 사용
  4. 3-Way Handshake & 4-Way Handshake
    • 3-Way Handshake (TCP 연결 수립)
    1. 클라이언트 → 서버: SYN
    2. 서버 → 클라이언트: SYN + ACK
    3. 클라이언트 → 서버: ACK - 4-Way Handshake (TCP 연결 종료)
    4. 클라이언트 → 서버: FIN (데이터 전송 종료 요청)
    5. 서버 → 클라이언트: ACK (확인 응답)
    6. 서버 → 클라이언트: FIN (서버도 종료 요청)
    7. 클라이언트 → 서버: ACK (확인 응답 후 종료)
  5. GET vs POST & CRUD 개념
    • GET: 데이터 조회, URL에 데이터 포함 (길이 제한), 빠름
    • POST: 데이터 등록, 요청 본문(body)에 데이터 포함, 보안성 높음
    • CRUD (Create, Read, Update, Delete) Create → POST Read → GET Update → PUT / PATCH Delete → DELETE
  6. TCP와 IP의 차이
    • TCP: 4계층(전송 계층), 신뢰성 보장 (데이터 순서, 재전송 등)
    • IP: 3계층(네트워크 계층), 데이터 전달만 담당 (신뢰성 보장 X)
  7. HTTP Methods 정리
    • GET: 데이터 조회
    • POST: 데이터 등록
    • PUT: 데이터 전체 수정 (없으면 생성)
    • PATCH: 데이터 일부 수정
    • DELETE: 데이터 삭제
  8. Connection Timeout vs Read Timeout
    • Connection Timeout: 서버 연결 시도 시간이 초과됨
    • Read Timeout: 서버 응답이 지연되어 클라이언트가 대기 시간 초과
  9. OSI 7계층
    • 물리 계층: 하드웨어 전송 (비트, 케이블, 허브)
    • 데이터 링크 계층: MAC 주소 기반 통신 (프레임, 스위치)
    • 네트워크 계층: IP 주소 기반 통신 (패킷, 라우터)
    • 전송 계층: TCP/UDP 기반 통신 (세그먼트)
    • 세션 계층: 연결 설정 및 유지 (세션)
    • 표현 계층: 데이터 변환 (암호화, 압축)
    • 응용 계층: 사용자와 직접 연결 (HTTP, FTP, DNS)
  10. 무중단 배포(Zero Downtime Deployment) 방법 무중단 배포는 시스템이 서비스 중단 없이 새로운 코드로 변경될 수 있도록 하는 배포 방식입니다.

대표적인 무중단 배포 전략 Blue-Green Deployment

기존(Blue)과 새로운(Green) 환경을 동시에 운영 배포 후 트래픽을 점진적으로 Green으로 전환 후 Blue 종료 빠른 롤백 가능 Canary Deployment

일부 트래픽(예: 10%)을 새로운 버전으로 유도 후 점진적 확대 A/B 테스트 및 성능 모니터링 가능 Rolling Deployment

기존 서버를 하나씩 교체하면서 점진적으로 새로운 버전 배포 트래픽 분배를 통해 시스템 부하 최소화 Feature Toggle

새로운 기능을 미리 배포한 후 설정값을 변경하여 활성화 ✅ 무중단 배포 고려 사항

로드 밸런서 설정: 트래픽을 분산하여 장애 방지 DB 마이그레이션 전략: 버전 간 데이터 구조 충돌 방지 Health Check: 배포된 서비스의 정상 동작 여부 확인

Java 코딩 테스트 및 기술 면접 요약

  1. List vs Set
    • List: 중복 허용, 순서 보장
    • Set: 중복 불가, 순서 보장 안함 (LinkedHashSet, TreeSet은 순서 보장)
  2. 배열 vs LinkedList
    • 배열: 인덱스 접근 빠름, 크기 고정, 중간 삽입/삭제 비효율
    • LinkedList: 중간 삽입/삭제 용이, 인덱스 접근 느림
  3. Stack vs Queue
    • Stack: LIFO, 예) Undo, 웹 뒤로가기
    • Queue: FIFO, 예) 프린터 대기열, 콜센터 대기열
  4. Object의 equals() vs hashCode()
    • equals(): 논리적 동등성 비교
    • hashCode(): 해시 기반 컬렉션에서 사용
    • equals() == true → hashCode() 같아야 함
  5. StringBuilder vs StringBuffer
    • StringBuilder: 비동기, 빠름 (싱글스레드에 적합)
    • StringBuffer: 동기화 처리됨, 느림 (멀티스레드에 적합)
  6. System.out.println()의 단점
    • synchronized + Blocking I/O → 성능 병목 발생 가능
  7. ArrayList 내부 구조
    • 배열 기반, 동적 확장 (기존 배열의 1.5배 크기)
  8. 스레드의 장단점
    • 장점: 동시 처리 가능
    • 단점: 생성 비용, 컨텍스트 스위칭, 과도한 생성 → 성능 저하
  9. 동시성 문제: i++에서 값 불일치
    • 이유: 읽기 → 증가 → 쓰기 간에 race condition 발생
    • 해결: synchronized, AtomicInteger, Lock
  10. 동시성 키워드
    • synchronized: 원자성 보장, 성능 저하
    • volatile: 가시성 보장, 원자성 미보장
  11. Blocking I/O vs Non-Blocking I/O
    • Blocking: I/O 완료까지 대기, CPU 낭비
    • Non-Blocking: 이벤트 기반, 높은 동시성
    • 예: Netty, Spring WebFlux
  12. Serializable (직렬화)
    • 객체를 바이트 스트림으로 변환
    • 사용처: 파일 저장, 네트워크 전송
    • 방식: Serializable, Externalizable, JSON, Protobuf 등

Comments