HomeAboutMeBlogGuest
© 2025 Sejin Cha. All rights reserved.
Built with Next.js, deployed on Vercel
📖
공부한 책
/
📖
한 권으로 읽는 컴퓨터 구조와 프로그래밍
/
🗄️
7. 데이터 구조와 처리
🗄️

7. 데이터 구조와 처리

참조 지역성 : 필요한 데이터를 (메모리에서) 서로 근처에 유지하라. 금방 사용할 데이터라면 더 가까운 곳에 저장하라

단일 연결리스트

  • 배열은 물건 목록을 유지하는 가장 효율적인 방법이지만 데이터 양이 정해져 있지 않은 경우에는 적합하지 않음. 배열 크기보다 더 크게 데이터가 들어오면 새로 더큰 배열을 만들고 복사해야하기 때문.
  • linked list 는 목록에 들어갈 원소 개수를 모르는 경우 배열보다 더 잘 작동함

동적 메모리 할당

  • 배열 등의 변수가 사용하는 메모리는 정적. 이미 사이즈가 정해져있으므로. 주소도 바뀌지 않음
  • 프로그램은 힙을 관리할 수 있어야 함. 프로그램은 사용중인 메모리를 알아야 하고, 사용 가능한 메모리도 알아야 함
  • C에는 malloc 과 free 함수가 있음
  • malloc을 사용해서 메모리를 할당을 하면서 시간이 지나면, 메모리 공간이 파편화되게 됨 → 메모리공간을 다 사용하지도 않았는데 너무 작은 가용 블록들만 남아서 malloc으로 요청받은 메모리를 돌려줄 수 없게 됐다는 뜻

가비지 컬렉션

  • 가비지 컬렉션을 사용하는 언어는 데이터 요소를 만들어내면서 이 요소가 사용할 메모리도 할당하는 new 연산자를 제공하는 경우가 자주 있음
  • 데이터 요소 삭제하는 경우는 언어의 런타임 환경이 변수 사용을 추적해서 더 이상 사용하지 않는 메모리는 자동으로 해제함

이중 연결 리스트

  • 노드에 다음 원소에 대한 포인터뿐만 아니라 이전 원소에 대한 포인터도 들어있는 리스트

계층적인 데이터 구조

  • 많은 애플리케이션의 경우 선형적인 데이터구조로 충분하지만 데이터를 효율적으로 가져오고 싶을 때에 그렇지 않음 ← 그 이유는 모든 데이터를 다 순회해야 하기때문
  • 2진 트리. 연결리스트에서는 길이가 n이면 n번만 비교하면 되지만 균형 잡힌 트리에서는 log_2(n)만큼만 비교하면 됨

데이터베이스

인덱스

  • 정렬된 데이터에 접근하면 더 효율적임
  • 인덱스의 경우 유지보수를 해야한다는 트레이드 오프가 있지만 (데이터가 바뀔 때마다 모든 인덱스를 갱신해야하기에) 데이터 변경보다는 데이터 검색이 더 자주 벌어지기 때문에 이런 갱신비용은 지불할 만함

해시

정렬

효율성과 성능

샤딩

  • 성능과 효율이 분리된 상황을 응용하는 방법으로 데이터베이스 샤딩(=수평 파티셔닝)
  • 데이터베이스를 각각 다른 기계에서 실행되는 여러 샤드로 나누는 방식을 말함
  • 인터페이스를 통해 요청이 들어온 데이터베이스 연산을 모든 샤드에 전달, 컨트롤러가 결과를 하나로 모음
notion image