Primitive Data Structure vs. Non-Primitive Data Structure

Primitive Data Structure

Primitive data structure는 프로그래밍 언어에 내장된 가장 단순하고 기본적인 데이터 타입이다.
이들은 단일 값을 표현하며, 더 이상 분해할 수 없는 가장 작은 단위의 데이터 구조이다.

주요 특징

  1. 단순성: 가장 기본적이고 이해하기 쉬운 데이터 타입이다.
  2. 고정 크기: 일반적으로 고정된 메모리 크기를 가진다.
  3. 효율성: 메모리 사용과 접근 시간 측면에서 매우 효율적이다.
  4. 직접 표현: 컴퓨터 하드웨어에서 직접 지원되는 데이터 타입이다.
  5. 값 의미론: 변수에 실제 값이 직접 저장된다.
  6. 스택 할당: 주로 스택 메모리에 할당되어 빠른 접근이 가능하다.

주요 primitive data structure들을 비교 분석하여 정리한 표:

데이터 타입설명비트 수값 범위특징JavaJavaScriptPythonGo
Boolean참/거짓 값을 나타내는 논리 데이터 타입1 비트 또는 1 바이트true/false조건문과 논리 연산에 사용booleanBooleanboolbool
Character단일 문자를 나타내는 데이터 타입16 비트 (Java), 8 비트 (대부분)U+0000 ~ U+FFFF (Java)문자 인코딩에 따라 다름char--byte (uint8)
String문자열을 나타내는 데이터 타입가변제한 없음 (메모리 한계까지)불변(Java, Python), 가변(JavaScript)StringStringstrstring
Float (Half Precision)16비트 부동 소수점16 비트±6.10 × 10^−5 ~ ±6.55 × 10^4정밀도 낮음, 저장 공간 절약---float16 (패키지)
Float (Single Precision)32비트 부동 소수점32 비트±1.18 × 10^−38 ~ ±3.4 × 10^38일반적인 실수 계산에 사용floatNumberfloatfloat32
Float (Double Precision)64비트 부동 소수점64 비트±2.23 × 10^−308 ~ ±1.80 × 10^308높은 정밀도 필요 시 사용doubleNumberfloatfloat64
Float (Quadruple Precision)128비트 부동 소수점128 비트±3.36 × 10^−4932 ~ ±1.18 × 10^4932매우 높은 정밀도, 특수 용도--Decimal (모듈)-
Integer (Byte)8비트 정수8 비트-128 ~ 127작은 범위의 정수에 사용byte-intint8
Integer (Short)16비트 정수16 비트-32,768 ~ 32,767중간 범위의 정수에 사용short-intint16
Integer (Int)32비트 정수32 비트-2^31 ~ 2^31 - 1가장 일반적으로 사용되는 정수 타입intNumberintint
Integer (Long)64비트 정수64 비트-2^63 ~ 2^63 - 1매우 큰 정수 값에 사용longBigIntintint64

사용법:

  • Java:
    • Boolean: boolean b = true;
    • Character: char c = 'A';
    • String: String s = "Hello";
    • Float: float f = 3.14f; double d = 3.14;
    • Integer: byte b = 100; short s = 1000; int i = 10000; long l = 1000000L;
  • JavaScript:
    • Boolean: let b = true;
    • String: let s = "Hello";
    • Number: let n = 3.14; (모든 숫자는 64비트 부동 소수점)
    • BigInt: let bi = 1234567890123456789n;
  • Python:
    • Boolean: b = True
    • String: s = "Hello"
    • Float: f = 3.14
    • Integer: i = 10000 (자동으로 크기 조정)
  • Go:
    • Boolean: var b bool = true
    • String: var s string = "Hello"
    • Float: var f float32 = 3.14 var d float64 = 3.14
    • Integer: var i int = 10000 var l int64 = 1000000

각 언어별 특징:

  • Java: 가장 세분화된 데이터 타입 지원
  • JavaScript: 동적 타입 언어로, 대부분의 숫자를 Number로 처리
  • Python: 동적 타입 언어로, 정수와 부동소수점을 자동으로 처리
  • Go: 정적 타입 언어로, 명시적인 타입 선언 필요

Non-Primitive Data Structure

Non-primitive data structure(비원시 자료구조)는 원시 자료형을 기반으로 만들어진 더 복잡하고 고급화된 자료구조를 의미한다. 이는 프로그래밍 언어에서 기본적으로 제공하는 원시 자료형을 조합하여 만든 사용자 정의 자료구조라고도 볼 수 있다.

주요 특징

  1. 복합성: 여러 원시 자료형을 조합하여 만들어진 복합적인 구조를 가진다.
  2. 유연성: 데이터의 저장, 접근, 수정이 더 유연하게 이루어질 수 있다.
  3. 동적 크기: 대부분의 비원시 자료구조는 크기가 동적으로 변할 수 있다.
  4. 참조 타입: 변수에 값 대신 메모리 주소를 저장한다.

분류

Non-primitive data structure는 크게 두 가지로 분류된다.

구분Linear Data StructureNon-Linear Data Structure
정의데이터 요소가 순차적으로 배열되어 각 요소가 이전 및 다음 요소와 연결된 구조데이터 요소가 계층적으로 구성되어 여러 경로로 연결될 수 있는 구조
특징- 단일 레벨 구조
- 한 번의 실행으로 모든 요소 순회 가능
- 구현이 상대적으로 간단
- 메모리 사용이 덜 효율적
- 다중 레벨 구조
- 한 번의 실행으로 모든 요소 순회 불가
- 구현이 상대적으로 복잡
- 메모리 사용이 더 효율적
주요 유형Array, Linked List, Stack, Queue, DequeGraph, Hash-based Structure, Tree, Heap
각 데이터 구조의 특징과 주요 프로그래밍 언어에서의 지원 여부 및 사용법
데이터 구조유형특징JavaJavaScriptPythonGo
ArrayLinear연속된 메모리 위치에 요소 저장, 인덱스로 빠른 접근 가능기본 지원기본 지원기본 지원 (List)기본 지원
Linked ListLinear노드가 다음 노드를 가리키는 구조, 삽입/삭제 효율적java.util.LinkedList라이브러리 필요라이브러리 필요container/list
StackLinearLIFO 원칙, 푸시/팝 연산java.util.Stack배열로 구현 가능리스트로 구현 가능슬라이스로 구현 가능
QueueLinearFIFO 원칙, 인큐/디큐 연산java.util.Queue배열로 구현 가능queue 모듈container/list
DequeLinear양쪽 끝에서 삽입/삭제 가능java.util.Deque배열로 구현 가능collections.dequecontainer/list
GraphNon-Linear노드와 엣지로 구성, 복잡한 관계 표현사용자 정의 필요라이브러리 필요networkx 라이브러리사용자 정의 필요
Hash-based StructureNon-Linear키-값 쌍으로 데이터 저장, 빠른 검색java.util.HashMapObject, Mapdictmap
TreeNon-Linear계층적 구조, 루트와 자식 노드로 구성사용자 정의 필요사용자 정의 필요사용자 정의 필요사용자 정의 필요
HeapNon-Linear완전 이진 트리 기반, 최대/최소 값 빠른 접근java.util.PriorityQueue사용자 정의 필요heapq 모듈container/heap

각 언어별 특징:

  • Java: 대부분의 데이터 구조를 기본적으로 지원하거나 java.util 패키지를 통해 제공한다.
  • JavaScript: 배열과 객체를 기본으로 제공하며, 다른 구조는 사용자 정의나 라이브러리를 통해 구현해야 한다.
  • Python: 리스트, 딕셔너리, 세트 등 다양한 데이터 구조를 기본으로 제공하며, 추가 모듈을 통해 더 많은 구조를 지원한다.
  • Go: 배열, 슬라이스, 맵을 기본으로 제공하며, container 패키지를 통해 list, heap 등을 지원한다.

이 데이터 구조들은 각각의 특성에 따라 다양한 상황에서 효율적으로 사용될 수 있으며, 프로그래밍 언어별로 지원 방식이 다르므로 적절한 선택이 중요하다.

Primitive Data Structure vs. Non-Primitive Data Structure 비교

특성Primitive Data StructureNon-Primitive Data Structure
정의프로그래밍 언어에 내장된 기본 데이터 타입기본 데이터 타입을 사용하여 구축된 복잡한 데이터 구조
예시정수, 실수, 문자, 불리언배열, 연결 리스트, 스택, 큐, 트리, 그래프
크기고정 크기동적 크기 가능
복잡성단순함복잡함
메모리 효율성높음상대적으로 낮음
구현언어에 내장됨사용자 정의 가능
NULL 값일반적으로 허용하지 않음허용 가능
연산기본 연산만 지원복잡한 연산 및 메서드 지원
추상화 수준낮음높음
사용 목적단순한 데이터 표현복잡한 데이터 관계 및 구조 표현

공통점:

  1. 둘 다 데이터를 저장하고 관리하는 데 사용된다.
  2. 프로그래밍에서 중요한 역할을 한다.
  3. 특정 연산과 조작이 가능하다.

차이점:

  1. 복잡성: Primitive는 단순하고, Non-Primitive는 복잡하다.
  2. 크기: Primitive는 고정 크기, Non-Primitive는 동적 크기가 가능하다.
  3. 구현: Primitive는 언어에 내장되어 있고, Non-Primitive는 사용자가 정의할 수 있다.
  4. 유연성: Non-Primitive는 더 유연하고 다양한 데이터 관계를 표현할 수 있다.
  5. 메모리 사용: Primitive가 일반적으로 더 효율적이다.
  6. 기능: Non-Primitive는 더 복잡한 연산과 메서드를 제공한다.

Primitive data structure는 기본적이고 효율적인 데이터 표현에 사용되며, Non-Primitive data structure는 복잡한 데이터 관계와 구조를 표현하는 데 사용된다. 프로그래밍에서는 두 유형을 적절히 조합하여 효율적이고 강력한 애플리케이션을 구축한다.


참고 및 출처