취업대비반 7일차(스택,큐 / 절차지향,객체지향,함수형프로그래밍)

LeeJaewon·2023년 4월 4일
0

Stack과 Queue 그리고 Array와 Linked List 자료구조에 대해 말씀해주시고 차이점에 대해 설명해주세요.

Stack:

Stack이란 쌓다라는 의미로, 데이터를 차곡차곡 쌓아 올린 자료구조를 말합니다. 데이터가 순서대로 쌓이고 가장 마지막에 쌓인 자료가 가장 먼저 삭제되는 구조로 후입선출LIFO(Last In First Out)원칙을 따르는 데이터 구조입니다. Stack에서 삽입 연산은 push(), 삭제 연산은 pop()입니다. Stack 사용의 대표적인 사례는 웹 브라우저 방문기록 또는 뒤로가기입니다. Stack은 Array 또는 Linked List를 사용하여 구현할 수 있습니다.

Queue:

Queue는 스택과 다르게 먼저 들어온 것이 먼저 나가는 선입선출FIFO(First-In-First-Out) 원칙을 따르는 데이터 구조입니다. 이것은 Queue에 추가된 첫 번째 항목이 제거될 첫 번째 항목임을 의미합니다. Queue에서 삽입 연산은 push(), 삭제 연산은 shift()입니다. Queue 사용의 대표적인 사례는 놀이기구를 기다리는 줄, 음식점 번호표 같은 것이 있습니다. Queue는 Array 또는 Linked List를 사용하여 구현할 수 있습니다.

선형 큐: 선형 큐는 선형 데이터 구조를 따르는 기본 유형의 큐입니다. 전면과 후면이 있으며 후면에 새로운 요소가 추가되고 전면에서 제거됩니다. "FIFO(First In, First Out)" 원칙에 따라 작동합니다.
순환 큐: 순환 큐는 선형 큐와 유사하지만 마지막 요소가 첫 번째 요소에 연결되어 순환 구조를 형성합니다. 이를 통해 공간을 효율적으로 사용할 수 있으며 대기열을 쉽게 둘러쌀 수 있습니다.
우선순위 큐: 우선순위 대기열은 각 요소에 할당된 우선순위가 있는 대기열 유형입니다. 우선 순위가 가장 높은 요소가 먼저 제거됩니다. 이 유형의 대기열은 스케줄링 및 리소스 할당에 자주 사용됩니다.
Deque(Double Ended Queue): Deque는 양쪽 끝에서 삽입과 삭제를 허용하는 일종의 대기열입니다. 사용 방법에 따라 Stack 또는 Queue로 사용할 수 있습니다.
블로킹 큐: 블로킹 큐는 빈 큐에서 요소를 제거하거나 가득 찬 큐에 요소를 추가하려고 할 때 차단되는 큐 유형입니다. 이 유형의 대기열은 동시 프로그래밍에서 스레드를 조정하는 데 자주 사용됩니다.
동시 큐: 동시 큐는 여러 스레드에서 동시에 액세스할 수 있는 스레드로부터 안전한 대기열입니다. 이 유형의 대기열은 스레드 간에 데이터를 공유하기 위해 동시 프로그래밍에서 자주 사용됩니다.

각 유형의 대기열에는 고유한 장점과 단점이 있으며 사용할 유형의 선택은 애플리케이션의 특정 요구 사항에 따라 다릅니다.

Array:

Array는 입력된 동일한 유형의 데이터들이 메모리 공간에서 연속적으로 저장되어 있는 자료구조이며 메모리상에서 연속적으로 저장되어 있는 특징을 갖기 때문에 index를 통한 접근이 용이하다는 장점이 있으나 삽입/삭제가 오래 걸리고 배열 중간의 데이터가 삭제 되면 공간 낭비가 발생할 수 있는 단점이 존재합니다. Array는 많은 양의 데이터를 효율적으로 저장하고 조작하는 데 사용됩니다. Array의 크기는 고정되어 있으며 일단 정의되면 크기를 변경할 수 없습니다.

Linked List:

Linked List는 여러 개의 노드들이 순차적으로 연결된 형태를 갖는 자료구조이며 각 노드는 데이터와 다음 노드를 가리키는 포인터로 이루어져 있는 트리(tree)구조의 근간이 되는 자료구조입니다. Array와 달리 Linked List는 크기가 고정되어 있지 않으며 런타임 중에 동적으로 확장되거나 축소될 수 있습니다. Array와 달리 메모리를 연속적으로 사용하지 않아 삽입/삭제에 용이하다는 장점이 있습니다. 그러나 index로 임의 접근이 불가하며 처음부터 탐색을 해야하는 단점이 있습니다. 따라서 Array는 빠른 접근이 요구되고, 데이터의 삽입과 삭제가 적을 때 사용하고 Linked List는 삽입과 삭제 연산이 잦고, 검색 빈도가 적을 때 사용합니다. Linked List는 Stack, Queue 및 기타 데이터 구조를 구현하는 데 사용할 수 있습니다. 단일 연결 목록, 이중 연결 목록 및 순환 연결 목록과 같은 다양한 유형의 연결 목록이 있으며 각각 고유한 특성과 장점이 있습니다.

연결된 목록은 일련의 노드로 구성된 데이터 구조이며 각 노드에는 값과 시퀀스의 다음 노드에 대한 참조가 포함됩니다.

단일 연결 목록는 각 노드에 값과 시퀀스의 다음 노드에 대한 참조가 있는 연결 리스트 유형입니다. 단일 연결 리스트에서는 헤드(시퀀스의 첫 번째 노드)에서 시작하여 테일(시퀀스의 마지막 노드)에 도달할 때까지 다음 포인터를 따라 한 방향으로만 목록을 탐색할 수 있습니다.

이중 연결 목록는 각 노드에 값, 시퀀스의 다음 노드에 대한 참조 및 시퀀스의 이전 노드에 대한 참조가 있는 연결 리스트 유형입니다. 이중 연결 목록에서는 헤드 또는 테일에서 시작하여 다음 또는 이전 포인터를 따라 양방향으로 목록을 순회할 수 있습니다.

원형 연결 목록꼬리 노드가 헤드 노드에 대한 참조를 가지며 순환을 형성하는 연결 리스트 유형입니다. 순환 연결 목록에서는 모든 노드에서 시작하여 시작 노드에 다시 도달할 때까지 다음 포인터를 따라 목록을 순회할 수 있습니다. 이렇게 하면 일련의 요소를 계속 반복해야 하는 상황에서 순환 연결 목록이 유용합니다.

절차지향 / 객체지향 / 함수형 프로그래밍이란 무엇이고 차이점은 무엇인가?

절차지향 프로그래밍(Procedural Programming):

절차적 프로그래밍은 특정 작업을 수행하는 재사용 가능한 코드 블록인 절차 또는 서브루틴을 중심으로 프로그램이 구성되는 프로그래밍 패러다임입니다. 절차적 프로그래밍에서 초점은 문제를 더 작고 관리하기 쉬운 하위 문제로 나누고 각 하위 문제에 대한 솔루션을 별도의 절차로 구현하여 문제를 해결하는 데 있습니다.

절차지향 프로그래밍은 운영 체제, 과학 응용 프로그램 및 기타 복잡한 시스템의 개발에 널리 사용되었습니다. 그러나 소프트웨어 시스템이 점점 더 복잡해짐에 따라 객체 지향 프로그래밍이 보다 대중화되었습니다. 보다 모듈화되고 유연한 코드 구성 방법을 제공하기 때문입니다.

C, Fortran 및 Pascal과 같은 절차지향 프로그래밍 언어는 이 프로그래밍 패러다임을 지원하도록 설계되었습니다. 이러한 언어는 함수, 프로시저, 루프 및 조건문과 같은 제어 구조와 같은 구조를 제공하여 절차적 코드를 보다 쉽게 구성하고 구조화할 수 있습니다.

객체지향 프로그래밍(Object-oriented programming):

OOP는 "객체" 개념을 기반으로 하는 프로그래밍 패러다임입니다. 객체는 데이터와 해당 데이터에 대해 수행할 수 있는 작업 또는 메서드로 구성된 독립적인 엔티티입니다. OOP에서 초점은 문제를 절차로 분해하는 것보다 실제 엔티티와 해당 관계를 모델링하는 데 있습니다.

OOP에서 프로그램은 작업을 수행하기 위해 서로 상호 작용하는 객체 모음으로 설계됩니다. 이러한 객체는 객체를 만들기 위한 청사진 또는 템플릿과 같은 클래스의 인스턴스입니다. 클래스는 객체의 속성과 메서드를 정의하고 객체는 인스턴스화를 통해 클래스에서 생성됩니다.

OOP에는 객체가 다른 객체로부터 속성과 메서드를 상속하고 사용되는 컨텍스트에 따라 다른 방식으로 동작할 수 있도록 하는 상속 및 다형성의 개념도 포함됩니다.

Java, Python 및 C++과 같은 객체 지향 프로그래밍 언어는 객체 생성 및 작업에 대한 내장 지원을 제공합니다. OOP는 향상된 데이터 캡슐화 및 추상화뿐만 아니라 보다 모듈화되고 유연한 코드 구성 방법을 제공하여 크고 복잡한 소프트웨어 시스템을 보다 쉽게 작성하고 유지 관리할 수 있습니다. 대규모 프로젝트 및 팀 협업에도 적합합니다.

함수형 프로그래밍(Functional Programming):

함수형 프로그래밍은 부작용을 일으키지 않고 입력 값을 받아 출력 값을 생성하는 수학 함수의 원칙을 기반으로 합니다. FP에서는 부작용이 없고 변경 가능한 상태가 없는 순수한 함수를 작성하는 데 중점을 둡니다. 이렇게 하면 동일한 입력이 항상 동일한 출력을 생성하므로 프로그램의 동작에 대해 더 쉽게 추론할 수 있습니다. 함수형 프로그래밍은 불변성, 고차 함수 및 재귀 사용을 강조합니다. 대량의 데이터 및 병렬 처리를 처리하는 데 특히 적합합니다.

함수형 프로그래밍(FP)은 함수를 소프트웨어의 기본 빌딩 블록으로 사용하는 것을 강조하는 프로그래밍 패러다임입니다. FP에서 함수는 1급 객체로 취급됩니다.

  • 1급 객체(First-class citizen)
    • 변수나 데이타에 할당 할 수 있어야 한다.
    • 객체의 인자로 넘길 수 있어야 한다.
    • 객체의 리턴값으로 리턴 할수 있어야 한다.

Haskell, Lisp 및 ML(Meta Language)과 같은 기능적 프로그래밍 언어는 고차 함수, 람다 식 및 지연 평가와 같은 기능적 프로그래밍 구문에 대한 지원을 제공합니다. 이러한 구조를 사용하면 절차적 또는 객체 지향 프로그래밍 언어로 작성된 코드보다 더 선언적이고 덜 명령적인 간결하고 표현적인 코드를 더 쉽게 작성할 수 있습니다.

함수형 프로그래밍은 최근 몇 년 동안, 특히 코드의 동작에 대해 추론하는 능력이 중요한 분산 시스템 및 병렬 컴퓨팅의 맥락에서 인기를 얻었습니다. 또한 변경 가능한 상태를 수정하는 것보다 데이터 컬렉션을 조작하는 데 중점을 두는 데이터 처리 및 변환과 같은 특정 유형의 문제에 적합합니다.

이러한 프로그래밍 패러다임의 주요 차이점은 문제 해결에 대한 접근 방식과 데이터 및 동작을 처리하는 방식입니다. 절차적 프로그래밍은 문제를 절차 또는 함수로 분해하는 데 중점을 두고, 객체 지향 프로그래밍은 실제 객체와 해당 상호 작용을 모델링하는 데 중점을 두고, 함수형 프로그래밍은 수학적 함수 평가에 중점을 둡니다. 각 프로그래밍 패러다임에는 고유한 강점과 약점이 있으며 사용할 패러다임의 선택은 당면한 문제의 특정 요구 사항에 따라 다릅니다.

profile
한 걸음 한 걸음 꾸준히

0개의 댓글