[Interview] 면접 관련 정리15
동적 프로그래밍
- 동적 프로그래밍(Dynamic Programming)은 주어진 문제를 풀기 위해, 문제를 여러 개의 하위 문제로 나누어 푼 다음에 다시 결합하여 해결하는 방식이다.
- 어떤 부분 문제가 다른 문제들을 해결하는데 사용될 수 있어, 답을 여러 번 계산하는 대신에 한 번만 계산하고, 그 결과를 재활용하는 메모이제이션(Memoization) 기법으로 속도를 향상 시킬 수 있다.
- 간단한 작은 문제들 속에서 계속 반복되는 연산을 활용하여 빠르게 풀 수 있는 것이 핵심
Memoization : 한 번 계산한 문제는 다시 계산하지 않도록 저장해두고 활용하는 방식
조건
동적 프로그래밍으로 문제를 해결하기 위해서는 주어진 문제가 다음의 조건을 만족해야 한다.
- Overlapping Subproblem(중복되는 부분문제) : 주어진 문제는 같은 부분 문제가 여러번 재사용된다.
- Optimal Substructure(최적 부분구조) : 새로운 부분 문제의 정답을 다른 부분 문제의 정답으로부터 구할 수 있다.
구현 방식
- Bottom-up : 작은 문제부터 차근차근 구하는 방법
- 해결이 용이하지만 가독성이 떨어진다.
- Top-down : 큰 문제를 풀다가 풀리지 않은 작은 문제가 있다면 그때 해결하는 방법
- 가독성이 좋지만, 코드 작성이 어렵다.
- 재귀를 이용한 방식
절차지향 VS 객체지향
- 절차지향 프로그래밍
- 물이 위에서 아래로 흐르는 것 처럼, 순차적인 처리를 중요시하는 프로그래밍 기법이다.
- 대표적인 언어로 C언어가 있다.
- 컴퓨터의 처리구조와 유사해 실행속도가 빠르다.
- 코드의 순서가 바뀌면 동일한 결과를 보장하기 어렵다.
- 객체지향 프로그래밍
- 실제 세계의 사물들을 객체로 모델링하여 개발을 진행하는 프로그래밍 기법
- 대표적인 언어로 Java가 있다.
- 캡슐화, 상속, 다형성 등과 같은 기법을 이용할 수 있다.
- 다형성은 하나의 메소드나 클래스가 다양한 방법으로 동작하는 것을 의미한다.
- 절차지향 언어보다 실행속도가 느리다.
메모리 구조
- 코드 영역
- 실행할 프로그램의 코드가 저장되는 영역으로 텍스트 영역이라고도 부른다.
- 사용자가 프로그램 실행 명령을 내리면 OS가 HDD에서 메모리로 실행 코드를 올리게 되고, CPU는 코드 영역에 저장된 명령어를 하나씩 처리하게 된다.
- 데이터 영역
- 프로그램의 전역 변수(global)와 정적 변수(static)가 저장되는 영역.
- 데이터 영역은 프로그램 시작과 함께 할당되며, 프로그램이 종료되면 소멸한다.
- 힙 영역
- 프로그래머가 직접 관리할 수 있는 메모리 영역으로 이 공간에 메모리를 할당하는 것을 동적 할당이라고 부른다.
- Java에서는 GC가 자동으로 해제해준다.
- 힙 영역은 스택 영역과 달리 낮은 주소에서 높은 주소로 메모리가 할당된다.
- 스택 영역
- 함수의 호출과 함께 할당되며 지역 변수와 매개 변수가 저장되는 영역.
- 스택 영역에 저장되는 함수의 호출 정보를 스택 프레임이라고 한다.
- 스택 영역은 함수의 호출이 완료되면 소멸한다.
- 스택 영역은 높은 주소에서 낮은 주소로 메모리가 할당된다.
힙과 스택 영역이 서로 반대로 데이터를 채워 나가기 때문에 서로의 영역을 침범할 수 있다.
- Stack Overflow : 스택이 힙 영역을 침범함
- Hip Overflow : 힙이 스택 영역을 침범함
힙과 스택 차이
- 스택
- 빠른 엑세스
- 변수의 명시적 할당 해제 필요 X
- 지역 변수
- 힙
- 느린 엑세스
- 변수 할당 후 해제 필요(메모리 관리 필수)
- Java는 GC가 자동으로 메모리 관리
- 변수는 C언어 - realloc, Java - new
- 메모리 크기에 제한 X
Parameter / Argument
- Parameter : 함수를 선언할 때 사용된 변수
- Argument : 함수가 호출되었을 때 파라미터로 전달된 실제 값
call by value / call by reference
- call by value
- 인자로 받은 값을 복사하여 처리하는 방식
- call by value에 의해 넘어온 값을 변경시켜도 원래의 값이 보존된다.
- 값을 복사하여 넘기기 때문에 메모리 사용량이 늘어난다.
- call by reference
- 인자로 받은 값의 주소를 참조하여 직접 값에 영향을 주는 방식
- 값을 복사하지 않고, 직접 참조하기 때문에 속도가 빠르다.
- 원래의 값에 영향을 주는 리스크가 존재한다.
Message Queue
Queue 자료구조를 이용하여 데이터(메세지)를 관리하는 시스템으로, 비동기 통신 프로토콜을 제공하여 메세지를 빠르게 주고 받을 수 있게 해준다.
메세지 큐에서는 Producer(생산자)가 Message를 Queue에 넣어두면, Consumer가 Message를 가져와 처리하게 된다.
메세지 큐 : Kafka, Rabbit MQ, AMPQ 등
우선순위 큐
가장 우선순위가 높은 데이터를 먼저 꺼내기 위해 고안된 자료구조로, 구현하기 위해 일반적으로 힙을 사용한다.
힙은 완전이진트리를 통해서 구현되었기 때문에, 우선순위 큐의 시간복잡도는 O(logn)이다.
Docker & Kubernates
Docker는 컨테이너 기반의 가상화 기술이다.
기존에는 HW를 가상화하였기 때문에 Host OS 위에 Guest OS를 설치해야 했는데, 이러한 방식은 상당히 무겁고, 느려 한계가 존재했다.
이를 극복하고자, 프로세스를 격리시킨 컨테이너를 통해 가상화를 하는 Docker와 같은 기술들이 등장하게 되었고, Doker를 통해 구동되는 컨테이너를 관리하기 위한 Kubernates가 등장하게 되었다.
Docker 장단점
- 장점
- 쉽고 빠르게 실행 환경 구축
- 하드웨어 자원 절감
- Docker Hub와 같은 공유 환경 제공
- 단점
- 개발 초기의 오버헤드
- Linux 친화적
TDD
TDD(Test-Driven Development)방식은 개발자는 우선 요구되는 기능에 대한 테스트 케이스를 작성하고, 그에 맞는 코드를 작성하여 테스트를 통과한 후에 상황에 맞게 리팩토링하는 테스트 주도 개발 방식을 의미한다.
개발자는 테스트를 작성하기 위해 해당 기능의 요구사항을 확실히 이해해야 하기 때문에 개발 전에 요구사항에 집중할 수 있도록 도와주지만, 테스트를 위한 진입 장벽과 작성해야 하는 코드의 증가는 단점이다.
장단점
- 장점
- 작업과 동시에 테스트를 진행하면서, 실시간으로 오류 파악이 가능
- 짧은 개발 주기를 통해 고객의 요구사항을 빠르게 수용할 수 있다.
- 단점
- 기존 개발 프로세스에 테스트케이스 설계가 추가되므로 생산 비용 증가
- 테스트의 방향성, 프로젝트 성격에 따른 테스트 프레임워크 선택 등 추가로 고려해야 할 부분이 증가.
댓글남기기