session 3주차. [Data Structure] #1. Intro, Array & Tuple (1)

이지연·2020년 8월 3일
0

이번주부터 시작해서 wecode에서 자료구조를 1주간 1번씩 배울 예정입니다.

#1. Intro, Array & Tuple

이번 차수:
✔️ Data Structure의 개념 필요성, 그리고 다양한 종류의 자료구조에 대해 이해한다.
✔️ Array의 개념과 장점, 단점, 그리고 언제 사용하면 좋은지 이해한다.
✔️ Tuple의 개념과 장점, 단점, 그리고 언제 사용하면 좋은지 이해한다.

  1. 자료구조? 그게 뭔데 알아야 할까요?🤣

자료 구조란 데이터의 편리한 접근과 조작을 가능하게 하는 데이터를 저장하거나 조직하는 방법입니다.

쉽게 말해 저는 얼마전에 자취하기 위해서 자취방에서 사용해야 할 물건들을 담을 수 있는 무언가가 필요했습니다. 여러 종류의 가방 중 가장 적절한 가방은 무엇일까요? 네 바로 캐리어입니다.
이처럼, 그 상황에 맞게 적절하게 데이터를 담을 수 있는 적절한 구조라고 생각하시면 됩니다.

문맥과 데이터의 종류에 따라 적절한 자료 구조를 사용하는 것은 전체 개발 시스템에 큰 영향을 끼칩니다.

그렇기 때문에 자료구조의 다양한 종류와 각각의 장점과 한계를 잘 이해하고 상황에 맞게 올바른 자료 구조를 선택하고 사용하는 것이 중요합니다.

무엇보다!! 회사 면접시에 백엔드 지망생에게는 더욱더 필수적으로 느껴진다고 합니다.
이왕 배우는 거 제대로 짚고 넘어갈 수 있도록 학습하겠습니다.😁

1) 자료 구조의 분류

  • Primitive Data Structure(단순 구조)
    : 프로그래밍에서 사용되는 기본 데이터 타입
  • None-Primitive Data Structure(비단순 구조)
    : 단순한 데이터를 저장하는 구조가 아니라 여러 데이터를 목적에 맞게 효과적으로 저장하는 자료 구조

**inear Data Structure(선형 구조)
:저장되는 자료의 전후 관계가 1:1 (ex. List, Stacks, Queues)
선형구조는 데이터가 연속적으로 연결되어 있는 모양으로 구성하는 방법입니다.

출처: https://server-engineer.tistory.com/130 [HelloWorld]

** Non-Linear Data Structure(비선형 구조)
: 데이터 항목 사이의 관계가 1:n 또는 n:m (ex. Graphs, Trees )
반대로 비선형구조는 데이터가 그 특정한 자료구조에 따라 모양으로 연결되어 구성되어있는 방법입니다.

2) 일반적으로 가장 자주 사용 되는 자료 구조

  • Array(Python에서는 List)
  • Tuple
  • Set
  • Dictionary
  • Stack & Queue
  • Tree
  1. Array, 배열 그것은 무엇입니까? 🙄
    배열은 제가 JavaScript를 잠깐 공부했을 때 썼습니다. 지금 파이썬을 쓰고있는 데 list와 기능적으로 거의 동일합니다. 메모리 효율면에서는 array가 유리합니다. 다만 list가 사용하기 훨씬 편리하다고 합니다.

1) Array 특징

array는 순차적(ordered)으로 데이터를 저장하는 자료 구조입니다.

  • 자료구조에 저장하는 데이터는 일반적으로 요소(element)라고 합니다.
  • 순서가 상관 없더라도 서로 연결된 데이터들을 저장할때 일반적으로 사용됩니다.
  • 삽입 순서대로 저장됩니다.
  • 동일한 값도 여러번 삽입이 가능합니다. 즉, 중복이 가능합니다.
  • 이미 생성된 리스트도 수정이 가능합니다.
  • 다중차원 배열로 array를 많이 사용합니다.

2) Array 내부 구조

  • Array의 가장 큰 특징이 무엇이라고 했죠??????
    바로 순차적으로 데이터를 저장하는 것입니다!!기억해야 해요★ 가장 중요한 특징입니다.

  • index는 0부터 시작하고, index는 -부호를 가질 수 있습니다. -1은 맨 마지막 요소부터 시작합니다.

  • 왜 Array가 순차적으로 데이터를 저장해야 할 수 밖에 없을 까요?
    실제 메모리 상에서! 물리적으로 데이터가 순차적으로 저장되기 때문입니다.

이렇게 데이터의 순서가 있기 때문에 우리는 인덱스에서 3가지를 더 알아야 합니다.
첫째, index가 존재합니다. ->index
둘째, index를 사용해 특정 요소를 array(list)로부터 읽어 들이는 것이 가능합니다. ->indexing
셋째, 요소의 특정 부분, 즉 n번째 index부터 m번째 index까지 따로 분리해 조작하는 것이 가능 ->slicing

그런데!! 항상 사람이든 사물이든 단점도 존재하기 마련입니다.

중간에 있는 데이터를 삭제하거나 , 중간에 데이터를 삽입해야할 경우 삭제한 이후부터의 요소를 앞으로 당겨야 할 것이고, 추가해야할 인덱스 자리부터 뒤로 옮겨야 합니다.

코드에서는 한줄 뿐인데, 어째서 실제 메모리상에서는 일이 많아지는 걸까요??ㅠㅠㅠㅠㅠ

그렇기 때문에 우리는 Array를 사용할 때는 정보가 자주 삭제되거나 추가되는 데이터를 담지 않는 것이 point입니다.

3) Array Resizing
resizing이란? 말그대로 사이즈를 다시 조정한다는 뜻입니다.

pre-allocation이라고 배열이 처음 생성될 떄 어느 정보 메모리를 미리 할당하는데 ,메모리를 pre-allocation 함으로써 새로 추가되는 요소들도 순차적으로 메몰에 저장될 수 있습니다.

하지만 요소들이 처음 할당한 메모리 이상으로 많아진다면 resizing이 필요합니다.

  • 그렇게 되면 메모리를 더 할당해야하고, 그렇게 되면 배열의 resizing은 상대적으로 더 오래걸리는 operation입니다.
  • 즉, array는 사이즈 예측이 잘 안되는 데이터를 다루기에는 적절하지 않습니다.

4)언제 사용하면 좋을까요?

  • 순차열적인 데이터를 저장할 때
    • ex) 주식 가격. 어제의 2만원과 오늘의 2만원이 다름 >>> 값보다는 순서가 중요한 데이터
  • 다차원 데이터를 다룰 때 >>> Multi-dimensional Array
  • 어떠한 특정 요소를 빠르게 읽어야 할 때 >> index를 통해 곧바로 읽을 수 있기 때문
  • 데이터의 사이즈가 급변하게 자주 변하지 않을 때
  • 요소가 자주 삭제 되거나 추가되지 않을 때
profile
Everyday STEP BY STEP

0개의 댓글