위코드-TIL-12-Data Structure (array, tuple)

jin_sk·2020년 6월 8일
0

위코드

목록 보기
28/49

1. Data Structure

1-1. Data Structure (자료 구조)란?

  • 자료구조
    데이터에 편리하게 접근하고 조작하기 위해 -> 데이터를 저장하거나 조작하는 것

  • 자료구조에는 여러가지 종류가 있으며,
    언어별로 지원하는 양상이 달라서,
    각각의 자료구조가 갖는 장점과 한계를 잘 이해하고,
    상황에 맞게 올바른 자료 구조를 선택하고 사용하는 것이 중요하다

  • 자료구조의 본질과 컨셉을 이해하고,
    상황에 맞는 적절한 자료 구조를 선택하는 것이 중요하다

  • 자료구조란 상황과 문맥에 맞게 데이터를 담을 수 있는 적절한 구조를 말한다

  • 데이터에 맞는 적절한 자료구조를 사용하는 것은 전체 개발 시스템에 굉장히 큰 영향을 끼친다

자료구조를 왜 사용하는지 예를 들어보면
흔히 화장품을 담을 때 다른 가방들도 (에코백, 핸드백, 캐리어 등) 많은데
파우치를 사용하는 것을 보면 효율적인 사용을 위해서다.

여행을 갈때 많은 양의 짐을 이동시키기 위해 캐리어를 사용하는 것 처럼 말이다
이처럼 데이터에 맞는 적절한 자료구조를 사용해야 시스템이 효율적인 아웃풋이 나오게 된다


1-2. 자료 구조의 분류

  • 단순 구조 (Primitive Data Structure)
    프로그래밍에서 사용되는 기본 데이터 타입

  • 비단순 구조 (None-Primitive Data Structure)
    여러 데이터를 목적에 맞게 효과적으로 저장하는 자료 구조

    • 선형 구조 (Linear Data Structure)
      저장되는 자료의 전후 관계가 1:1 (list, stacks, queues)
    • 비선형 구조 (Non-Linear Data Structure)
      데이터 항목 사이의 관계가 1:n or n:m (Graphs, Trees)

1-3. 자주 사용되는 자료 구조

  • Array(Python에서는 List)
  • Tuple
  • Set
  • Dictionary
  • Stack & Queue
  • Tree

2. Array(List)

2-1. Array 란?

가장 기초적이고 단순하면서 가장 자주 사용되는 자료 구조 [ ]
파이썬의 list


2-2. Array 특징

  • 순차적으로 데이터(요소, element)를 저장

  • 순서가 있는 or 서로 연결된 데이터들을 순차적으로 저장할 때 사용

  • 동일한 값 여러번 삽입 가능, 어떤 데이터 타입도 올 수 있다

  • 삽입 순서대로 데이터 (요소) 저장 (인덱스가 존재한다, 0부터 시작)

  • 순서가 존재하기 때문에 index가 존재(0부터 시작), index를 사용해 요소를 읽는 것이 가능,
    요소를 특정 부분까지 따로 분리ㅐ 조작하는 것이 가능

  • 수정이 가능하다

  • Array 안에 또다른 Array 삽입 가능 (다중차원 배열 Multi-dimentional Arra)


2-3. Array 단점

  • 요소의 삭제와 수정이 불편하다
    순차적으로 데이터가 담겨져 있기 때문에,
    특정 위치에 있는 중간 요소를 삭제할 경우, 삭제된 요소로 부터 뒤에 있는 모든 요소들의 메모리 이동이 일어난다
    실제 코드상 한줄로 끝이나나 메모리상에서는 복잡하게 일어나고,
    중간에 요소가 추가 될 경우 나머지 뒤에있는 요소들의 메모리 이동이 일어난다
    그렇기에 추가, 삭제가 잦은 데이터를 담기에는 적절하지 않다

  • 생성 후 크기 조정 불편
    한번 생성된 배열은 resizing이 어렵다
    배열은 처음 생성될때 어느정도 미리 메모리를 할당한다 (pre-allocation)
    만약 요소들이 처음 할당한 메모리보다 많아지면 resizing이 필요하다
    예를 들어 100개의 메모리 공간이 다 차서 100개를 추가해야 하는 경우,
    299개 크기의 메모리를 생성 -> 기존 메모리 100개 복사 -> 그 다음 101번 부터 데이터 순차적으로 추가


2-4. Array 언제 사용하면 좋을까?

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

3. Tuple (python)

3-1. tuple 이란?

  • List와 마찬가지로 데이터를 순차적으로 저장할 수 있는 순열 자료구조
  • 하지만 list와 다르게 한 번 정의되고 나면 수정할 수 없음 (immutable)
  • 2-3개 정도의 적은 수의 소규모 데이터를 저장할 때 많이 사용
  • 함수에서 리턴 값을 한 개 이상 리턴하고 싶을 때 자주 쓰임
>>> my_tuple = (1,"2",3.0)
>>> my_tuple
(1, '2', 3.0)
>>> for i in my_tuple:
...     print(i)
...
1
2
3.0
>>> my_tuple[0]
1
>>> my_tuple[1]
'2'
>>> my_tuple[2]
3.0
>>> my_tuple[0] = 9
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment
>>>

3-2. tuple의 장점

  • Tuple은 간단한 값을 빨리 표현하고 싶을 때 많이 사용
  • 예를 들면 함수에서 리턴 값을 한 개 이상 리턴하고 싶을 경우 (ex. 지도 좌표)
    • Tuple을 사용하는 경우와 class/object 를 사용하는 경우를 비교해보면
// Tuple을 사용하는 경우
[(1,2), (2,4)] // Array(List) 안의 Tuple

// Tuple을 안 쓰는 경우에는 class를 생성해야함
class cord:
	def __init__(self, x, y):
		self.x = x
		self.y = y

3-3. tuple의 단점

  • Tuple의 단점은 데이터가 무슨 의미인지 명확하지 않음
  • 데이터의 의미를 문맥을 보고 가정해야 함
    • 예를 들면 객체의 경우 key-value 쌍으로 이루어진 데이터이기 때문에 무슨 데이터인지 파악이 쉽지만, Tuple의 경우 괄호 안에 데이터만 담겨있기 때문에 문맥에 맞게 의미를 추측 해야함
  • 그렇기 때문에 Tuple은 소규모 데이터를 다루기에 적합
  • 이러한 단점을 극복하기 위해 Named Tuple 이란 것도 존재 (Python)

3-3. tuple 언제 사용하면 좋을까?

  • Array(List)를 쓰기에는 간단한 데이터들을 표현할 때 사용
  • Tuple이 Array(List) 보다 더 가볍고 메모리더 적게 먹음
coordinations = [
    (1, 2),
    (3, 4),
    (5, 6)
]

예제

1. 자료구조의 정의와 중요한 이유를 설명하세요.

내 답안
자료구조란 데이터에 편리하게 접근하고 조작하기 위한 구조이며,
자료구조의 본질을 이해하고 상황에 맞는 적절한 자료구조를 사용해야 효율적인 아웃풋을 나오게 할 수 있습니다.

모범 답안
자료 구조란 데이터의 편리한 접근과 조작을 가능하게 하는 데이터를 저장하거나 조직하는 방법입니다.
문맥과 데이터의 종류에 따라 적절한 자료 구조를 사용하는 것은 전체 개발 시스템에 큰 영향을 끼칩니다.
그렇기 때문에 자료구조의 다양한 종류와 각각의 장점과 한계를 잘 이해하고 상황에 맞게 올바른 자료 구조를 선택하고 사용하는 것이 중요합니다.


2. Array(List)의 가장 큰 특징과 그로 인해 발생하는 장점과 단점에 대해 설명하세요.

내 답안
Array(List) 는 index를 가지고 있어 순서가 있는 데이터를 저장하는데 좋으나,
index를 가지고 있기에 요소를 수정, 삭제 추가가 있을때 전체 요소들의 메모리 이동이 일어나므로 불필요한 작업이 많이 발생해 데이터의 수정이 잦은 작업에는 사용하기가 불편합니다.

모범 답안
Array의 가장 큰 특징은 순차적으로 데이터를 저장한다는 점입니다.
이렇게 데이터에 순서가 있기 때문에 0부터 시작하는 index가 존재하며, index를 사용해 특정 요소를 찾고 조작이 가능하다는 것이 Array의 장점입니다.
반면에 이에 따른 단점도 존재하는데, 순차적으로 존재하는 데이터의 중간에 요소가 삽입되거나 삭제 되는 경우 그 뒤의 모든 요소들을 한칸씩 뒤로 밀거나 당겨줘야 하는 단점이 있습니다.
이러한 경우 메모리 상에서 이루어지는 작업이 다른 자료구조에 비해 커지기 때문에 Array 는 정보가 자주 삭제 되거나 추가되는 데이터를 담기에는 적절치 않습니다.


3. Array를 적용 시키면 좋을 데이터의 예를 구체적으로 들어주세요.
(ex. 주식 차트) 구체적 예시와 함께 Array를 적용하면 좋은 이유, 그리고 Array를 사용하지 않으면 어떻게 되는지 함께 서술해주세요.

내 답안
환율과 같이 시간마다 값이 변하는 데이터를 저장하기 위해 array를 사용하는 것이 좋습니다.
순차적으로 값을 저장하기 때문에 인덱스를 사용해서 특정 시간대의 요소를 빨리 찾을 수 있기 때문입니다
Array를 사용하지 않으면 index를 사용할 수 없어서 기록, 관리하기에 불편합니다.

모범 답안
Array를 적용시키면 좋은 예로 주식 차트가 있습니다.
주식 차트에 대한 데이터는 요소가 중간에 새롭게 추가되거나 삭제되는 정보가 아니며, 날짜별로 주식 가격이 차례대로 저장되어야 하는 데이터입니다.
즉, 순서가 굉장히 중요한 데이터 이므로 Array 같이 순서를 보존 해주는 자료구조를 사용하는 것이 좋습니다.
이와 같은 데이터에 Array를 사용하지 않는 경우, 즉 순서가 없는 자료 구조를 사용하는 경우에는 날짜별 주식 가격을 확인하기 어려우며 매번 전체 자료를 읽어 들이고 비교해야 하는 번거로움이 발생합니다.

0개의 댓글