본문 바로가기

자료구조

백엔드 개발자에게 자료구조와 알고리즘 학습이 필요한 이유 백엔드 개발자가 왜 자료구조와 알고리즘을 공부해야 하는지에 대해 정리해 보았다. 자료구조 자료구조(Data structure)는 데이터를 효율적으로 저장, 관리하고 처리하기 위한 구조로서, 개발자의 자료구조에 대한 이해도와 선택에 따라 소프트웨어의 성능과 리소스 사용량에 많은 영향을 미치게 된다. 성능 최적화 필요한 데이터를 빠짐없이 다루기만 하면 문제가 없을 것 같지만, 데이터를 저장하고 접근하는 방법은 실제로 애플리케이션의 성능에 큰 영향을 미친다. 따라서 적절한 자료구조를 선택하는지의 여부가 성능 향상에 크게 기여할 수 있다. 예를 들어, 배열과 Linked List는 동일한 데이터를 저장할 수 있지만 둘의 CRUD 연산은 서로 다른 성능을 보인다. 자료구조를 심도 있게 학습한 개발자는 각 자료구조.. 더보기
프로그래밍에서 자료형(Data type)이 필요한 이유(in Java) 자료형(Data type)은 데이터를 분류하는 방법이다. 자료형을 통해 해당 자료의 처리되는 데이터 종류, 메모리 할당 과정, 연산 수행 방법을 인지할 수 있다. 예를 들어, Primitive type(기본형)인 int(정수) 타입은 언뜻 보면 불필요해 보인다. double(실수) 타입이 int 타입보다 더 넓은 범위의 값을 담을 수 있기 때문이다. 하지만 동일한 수치를 가지는 데이터도 자료형마다 컴퓨터의 이해, 처리하는 방식이 다르기 때문에 서로 다른 자료형으로 구분되어야 한다. Python과 JavaScript의 경우 동적 타입 언어(Java는 정적 타입 언어)로서, 코드 실행 시 Interpreter 또는 Compiler가 타입 추론(Type Inference)을 통해 타입을 자동으로 추론하고 결정.. 더보기
Heap 구조의 이해 Heap의 개념 Heap은 트리 구조 기반의 자료구조로서 일반적으로 배열로 구현되며, node 번호와 배열의 index가 일치한다. 최댓값 또는 최솟값을 빠르게 찾는 데 사용된다. Heap은 추출 과정을 통해 최댓값 또는 최솟값을 삭제하고 반환하며, 추출 이후에도 Heap의 구조를 유지해야 한다. 또한 삽입 과정을 통해 마지막 node에 새로운 값을 삽입하며, 마찬가지로 Heap의 구조를 유지한다. 최댓값을 가지는 Heap은 max heap, 최솟값을 가지는 Heap은 min heap이라고 한다. max heap의 경우 부모 node의 우선순위가 자식 node의 우선순위보다 항상 크거나 같다. 반대로 min heap의 경우 부모 node의 우선순위가 자식 노드의 우선순위보다 항상 작거나 같다. 최상위 n.. 더보기
Linked List 구조의 이해 Linked List의 개념 Linked List는 데이터를 저장하는 자료구조로, 각각의 데이터들은 노드(Node)라는 객체로 구성된다. node는 data와 다음 노드를 가리키는 pointer로 이루어져 있다. data의 저장과 조작에 index를 활용하는 Array나 Array List와는 달리, 앞 Linked List는 앞 뒤 data의 주소(pointer)를 통해 저장과 조작을 수행한다. 이러한 구조는 Linked List가 삽입, 삭제 과정에서 시간 복잡도상 유리함(O(1))을 가지게 해 주지만, data의 검색과 변경에서는 취약함(O(N), 빅오 표기법 기준)을 보인다. 또한 Array와 달리 객체 생성 시점에 data가 저장될 길이를 미리 할당할 필요가 없으며, 동적 크기를 가지므로 길이가.. 더보기
Hash Map 구조의 이해 Hash Map의 개념 Hash Map 자료구조는 key-value 쌍을 저장할 때 사용하는 방법 중 하나로서, 빠른 검색 속도와 효율적인 메모리 사용의 장점으로 인해 자주 사용된다. Hash Map은 객체 식별을 위해 hashcode() 메소드와 equals() 메소드를 이용한 동등 비교를 수행한다. hashcode() 메소드를 통해 각 key에 대해 고유한 hashcode를 생성하고, 이 값을 배열의 index로 사용하여 데이터를 저장한다. 이후 검색을 할 때에도 hashcode() 메소드를 통해 key를 hashcode로 변환하여 index를 찾고, 해당 index에 저장된 데이터를 찾아서 반환한다. 해당 과정은 O(1)의 시간 복잡도로 이루어지기 때문에 매우 빠른 검색 속도를 보장하는 장점이 있다.. 더보기
배열(Array) 구조의 이해 Array의 개념 Array는 저장해야 할 값이 많고, 그 값들의 type이 같은 유형인 경우 사용하는 자료구조이다. 따라서 하나의 Array에 각기 다른 여러 type의 value들을 담을 수 없다. Array의 값들은 index를 통해서 접근할 수 있으므로, Linked List와 달리 value의 검색과 변경의 속도가 빠르다(시간 복잡도 O(N) = 1). Array List와 같은 시간 복잡도를 가지지만 Array List는 길이가 고정되어 있지 않아 value의 추가, 삭제가 자유롭다. 하지만 Array는 primitive type으로서 object type인 List에 비해 작업의 속도가 빠르므로, Array List로 완전히 대체할 수는 없다. 실제 Array와 Array List가 자주 쓰.. 더보기
큐(Queue) 구조의 이해 Queue의 개념 큐(Queue)는 데이터를 일렬로 저장하고, 반대편에서 순서대로 처리되는 선형 자료구조이다. 큐에 삽입된 데이터는 일종의 대기열로 생각할 수 있으며, 먼저 도착한 데이터가 먼저 처리되는 선입선출법(FIFO, First In - First Out)의 구조를 가진다. Stack과 반대되는 구조라고 할 수 있다. Queue 구조에서의 명칭 한쪽에서 데이터를 삽입하는 것을 Enqueue, 반대편에서 삭제하는 것을 Dequeue라고 한다. 각각 Enqueue는 offer와 add 메소드, Dequeue는 poll과 remove 메소드를 이용한다. 추가로 front 메소드는 첫 번째 요소를 삭제하지 않고 반환한다. Queue의 응용 Java에서의 활용 예시 Queue queue = new Link.. 더보기
스택(Stack) 구조의 이해 Stack의 개념 Stack은 마치 데이터를 쌓아 뒀다가 산출하는 것 같은 형태의 후입선출 구조를 따르는 선형 자료구조이다. Stack이라는 명칭은 쌓인 더미의 형태를 뜻한다. 카드나 접시 혹은 동전을 쌓아 두었다면 중간 혹은 아래의 것부터 꺼낼 수 없고 위의 것부터 꺼낼 수밖에 없다. Stack은 이와 같은 구조를 가지기 때문에 해당 명칭으로 명명되었다. Stack 구조에서의 명칭 데이터를 삽입할 때는 Push, 삭제될 때는 Pop이라고 하며, 선입선출법(FIFO, First In - First Out)의 구조를 가지는 큐(Queue)와는 명칭이 다르다. 위 그림과 같이 Stack의 데이터는 나중에 Push된 순으로만 Pop할 수 있다. 또한 Stack이 가득 찬 상태를 Full, 비어 있는 상태를 E.. 더보기