본문 바로가기
Programming/기술 면접

[CS Study] Programming (프로그래밍 공통)

by Mandy's 2025. 8. 11.

1. OOP(Object-Oriented Programming)에 대해 설명하시오

객체지향 프로그래밍(OOP, Object-Oriented Programming)은 데이터를 객체(object)로 추상화하여,

객체 간의 상호작용을 통해 문제를 해결하는 프로그래밍 패러다임

🔹 OOP의 4대 핵심 특성

특징 설명

캡슐화 (Encapsulation) 데이터(속성)와 기능(메서드)을 하나로 묶고, 외부로부터 내부 구현을 숨김
상속 (Inheritance) 기존 클래스(부모)의 속성과 기능을 새로운 클래스(자식)가 물려받음
다형성 (Polymorphism) 하나의 인터페이스로 여러 기능을 구현할 수 있음
추상화 (Abstraction) 복잡한 구현은 숨기고, 필요한 기능만 인터페이스로 노출

✅ OOP -> 코드의 재사용성, 유지보수성, 확장성


🧠 SOLID 원칙이란?

객체지향 설계의 5가지 핵심 원칙으로, 유지보수와 확장에 강한 설계 가능

🔤 SOLID 원칙 요약

약어 원칙 이름 설명

S SRP (Single Responsibility Principle) 클래스는 하나의 책임만 가져야 함
O OCP (Open/Closed Principle) 확장에는 열려 있고, 수정에는 닫혀 있어야 함
L LSP (Liskov Substitution Principle) 자식 클래스는 부모 클래스를 대체할 수 있어야 함
I ISP (Interface Segregation Principle) 사용하지 않는 인터페이스는 구현하지 않아야 함
D DIP (Dependency Inversion Principle) 추상화에 의존해야지, 구체화에 의존하면 안 됨

2. 블로킹과 논블로킹의 차이는 무엇인가요?

  • 블로킹(Blocking) → 현재 작업이 완료될 때까지 다음 작업을 멈추고 기다림
  • 예: 파일을 다 읽을 때까지 대기
  • 논블로킹(Non-blocking) → 작업이 완료되지 않아도 다른 작업을 수행할 수 있음
  • 예: 파일 읽기 요청을 보내고, 결과가 올 때까지 다른 작업 수행

🔑 스레드의 제어권을 차단하느냐가 핵심입니다.


3. 동기와 비동기 방식의 차이에 대해 서술하세요.

  • 동기(Synchronous) → 요청한 작업의 완료를 기다린 후 다음 작업 실행
  • 순차적이고 직관적이나 느릴 수 있음
  • 비동기(Asynchronous) → 작업이 끝나지 않아도 다음 작업을 바로 수행
  • 콜백, 이벤트 기반 처리로 병렬 작업 가능

⏱️ ‘기다리는가’ 여부에 따라 구분됩니다.


4. 동기/비동기, 블로킹/논블로킹을 엮어서 설명해주세요.

구분 설명

동기 + 블로킹 가장 기본적인 처리 방식. 순서대로 처리하면서 대기
동기 + 논블로킹 순서대로 처리하지만, 다른 작업을 병행 가능
비동기 + 논블로킹 병렬적이고 효율적. 콜백, 이벤트 기반
비동기 + 블로킹 거의 사용하지 않음. 비효율적

✔ 동기/비동기는 작업 흐름 관점, 블로킹/논블로킹은 스레드 실행 관점입니다. 예: JavaScript setTimeout()은 비동기 + 논블로킹 구조입니다.


5. 절차지향과 객체지향 프로그래밍에 대해 설명하세요.

  • 절차지향 프로그래밍 → 프로그램을 순차적 흐름(함수 중심)으로 구성
  • 예: C언어, 단순한 스크립트
  • 객체지향 프로그래밍 → 데이터(객체)와 그 동작(메서드)을 중심으로 구성
  • 예: Java, Python, C++

구분 절차지향 객체지향

단위 함수 중심 객체 중심
재사용성 낮음 높음
유지보수 어렵다 용이함

6. Call by Value와 Call by Reference에 대해 설명하세요.

  • Call by Value: 함수에 값 자체를 복사하여 전달 → 원본 변수는 영향 없음
  • Call by Reference: 함수에 참조(주소)를 전달 → 원본 변수에 영향 가능

Python은 기본적으로 Call by Object Reference (값이 참조되는 방식)


7. 프레임워크와 라이브러리의 차이점에 대해 설명하세요.

항목 프레임워크 라이브러리

제어 흐름 프레임워크가 흐름을 주도 (제어의 역전) 개발자가 직접 흐름을 제어
사용 방식 내가 프레임워크에 맞춰야 함 내가 필요할 때 호출해서 사용
예시 Django, Spring jQuery, NumPy

✅ 프레임워크는 "틀"이고, 라이브러리는 "도구"입니다.


8. DDD(Domain-Driven Design)에 대해 설명하세요. ****

도메인 주도 설계(DDD)는 복잡한 시스템을 업무 중심 모델로 분리하고 설계하는 방법

  • 도메인 모델 중심으로 아키텍처 구성
  • 유비쿼터스 언어: 개발자와 비즈니스 전문가가 동일한 언어로 의사소통
  • Bounded Context: 도메인의 의미가 일관된 경계

✔ DDD는 복잡한 비즈니스 로직이 많은 서비스에 특히 효과적입니다.


9. MSA(Microservice Architecture)에 대해 설명해주세요.

마이크로서비스 아키텍처(MSA)는 애플리케이션을 독립적으로 배포 가능한 작은 서비스 단위로 분리하여 개발하는 아키텍처입니다.

  • 각 서비스는 독립적 데이터베이스, 로직, 배포를 가짐
  • 장애 격리, 빠른 배포 가능
  • ex) 사용자 서비스, 결제 서비스, 알림 서비스 등 분리

✅ 단일 장애점 감소, 유연한 확장, DevOps 환경에 적합


10. 함수형 프로그래밍에 대해 설명하세요.

함수형 프로그래밍(Functional Programming)은 상태를 변경하지 않고, 순수 함수의 조합으로 프로그램을 구성하는 패러다임입니다.

  • 순수 함수: 동일 입력 → 동일 출력 (부작용 없음)
  • 불변성(immutability): 값 변경 없이 처리
  • 고차 함수: 함수를 인자로 받거나 반환 가능

예시 언어: Haskell, Elixir Python, JS도 지원


11. 메모리 구조의 네 가지 영역에 대해 설명하세요.

영역 설명

Code 실행할 프로그램의 코드 (함수 등)
Data 전역변수, static 변수 저장
Heap 동적 메모리 할당 공간 (malloc, new)
Stack 함수 호출 시 지역 변수, 리턴 주소 등 저장

메모리 구조 도식

+----------------------+ ← 낮은 주소
|     Code 영역         |
+----------------------+
|     Data 영역         |
+----------------------+
|     Heap 영역         | ↓ 아래로 확장
|                      |
+----------------------+
|                      |
|     Stack 영역        | ↑ 위로 확장
+----------------------+ ← 높은 주소

🔍 Heap과 Stack은 메모리의 같은 공간을 공유하며, 충돌 시 Stack Overflow 등 오류 발생 가능