Skip to content

데이터 구조

Go 언어는 문법이 간단하지만 내장된 다양한 강력한 핵심 데이터 구조를 가지고 있습니다. 이러한 데이터 구조는 Go 프로그램의 기본 구성 요소이며, 구현 원리를 깊이 이해하는 것은 더 효율적인 코드를 작성하는 데 도움이 됩니다. 본 문서에서는 Go 에서 가장 일반적으로 사용되는 몇 가지 데이터 구조와 그 하부 구현을 소개합니다.

기본 데이터 구조

slice 슬라이스

슬라이스는 Go 언어에서 가장 일반적으로 사용되는 데이터 구조로, 배열에 대한 추상화 및 캡슐화입니다. 주요 특징:

  • 동적 크기: 슬라이스의 길이는 동적으로 증가할 수 있습니다.
  • 참조 의미론: 슬라이스 전달 시 구조체만 복사되고 하부 배열은 복사되지 않습니다.
  • 확장 메커니즘: 용량이 부족할 때 자동으로 확장됩니다.

슬라이스는 런타임에서 slice 구조체로 표현되며, 하부 배열을 가리키는 포인터, 길이, 용량 세 가지 필드를 포함합니다.

string 문자열

문자열은 Go 에서 가장 기본적인 데이터 유형 중 하나로, 주요 특징은 다음과 같습니다.

  • 불변성: 문자열은 한 번 생성되면 수정할 수 없습니다.
  • UTF-8 인코딩: 일반적으로 UTF-8 인코딩된 텍스트를 나타냅니다.
  • 제로 값 안전: 문자열의 제로 값은 빈 문자열 "" 이지 nil 이 아닙니다.

문자열은 런타임에서 stringStruct 구조체로 표현되며, 바이트 배열을 가리키는 포인터와 길이를 포함합니다.

컨테이너 데이터 구조

map 맵

map 은 Go 언어 내장 키 - 값 쌍 컨테이너로, 하부에는 해시 테이블이 구현되어 있습니다. 주요 특징:

  • 해시 테이블 구현: 해시 함수를 통해 요소를 빠르게 위치시킵니다.
  • 자동 확장: 부하 인자가 너무 높을 때 자동으로 확장됩니다.
  • 비동시성 안전: 동시 읽기/쓰기에는 추가 동기화 메커니즘이 필요합니다.

map 은 런타임에서 hmap 구조체로 표현되며, 버킷 배열, 해시 시드, 요소 카운트 등의 필드를 포함합니다.

syncmap 동시성 맵

sync.Map 은 표준 라이브러리에서 제공하는 동시성 안전 맵으로, 읽기가 많고 쓰기가 적은 상황에 적합합니다. 주요 특징:

  • 읽기/쓰기 분리: read 와 dirty 두 개의 map 을 사용하여 읽기/쓰기를 분리합니다.
  • 원자 연산: read map 은 원자 연산을 사용하며 잠금이 필요 없습니다.
  • 점진적 마이그레이션: miss 카운트가 임계값에 도달하면 dirty 를 read 로 승격시킵니다.

sync.Map 은 공간으로 시간을 교환하는 방식으로 특정 상황에서 map + mutex 보다 더 나은 성능을 제공합니다.

동시성 데이터 구조

channel 채널

channel 은 Go 언어의 CSP 사상을 구현한 대표적인 것으로, 고루틴 간 통신에 사용됩니다. 주요 특징:

  • 고루틴 통신: channel 을 통해 고루틴 간 데이터 전달을 구현합니다.
  • 동기화 메커니즘: 버퍼 없는 channel 은 고루틴 동기화에 사용할 수 있습니다.
  • 잠금 큐: 하부에는 잠금이 있는 순환 큐가 있습니다.

channel 은 런타임에서 hchan 구조체로 표현되며, 순환 버퍼, 대기 큐 등의 필드를 포함합니다.

select 다중화

select 는 여러 channel 의 상태를 동시에 모니터링하여 다중화를 구현합니다. 주요 특징:

  • 논블로킹: 여러 channel 의 사용 가능 여부를 논블로킹으로 확인할 수 있습니다.
  • 무작위 선택: 여러 channel 이 동시에 사용 가능할 때 무작위로 하나를 선택하여 실행합니다.
  • 타임아웃 제어: time.After 와 함께 사용하여 타임아웃 메커니즘을 구현합니다.

select 는 런타임에서 각 분기에 대해 scase 구조체로 표현되며, 순환 메커니즘을 통해 channel 상태를 확인합니다.

학습 제안

다음 순서대로 학습하는 것을 권장합니다.

  1. 먼저 slice 슬라이스string 문자열 를 학습하여 기본 데이터 구조를 이해합니다.
  2. 다음으로 map 맵 을 학습하여 해시 테이블 구현을 이해합니다.
  3. 그런 다음 channel 채널 을 학습하여 고루틴 통신 메커니즘을 이해합니다.
  4. 이어서 select 다중화 를 학습하여 다중화 기술을 습득합니다.
  5. 마지막으로 syncmap 동시성 맵 을 학습하여 동시성 안전 구현 방식을 이해합니다.

Golang by www.golangdev.cn edit