컴퓨터/자료구조

자료구조 - 데이터 설계 및 구현

sidedoor 2023. 11. 19. 13:51

데이터는 사람 또는 기계에 의해 분석될 수 있게  정보를 표현한 것을 뜻한다.

 

데이터는 프로그래밍 에서의 명사로, 조작되고 처리되는 객체와 정보를 나타낸다.

 

실제 데이터는 복잡하기 때문에 사용하기 위해서는 데이터 추상화(Data Abstraction)가 필수적이다.

 

데이터 추상화는 각각의 개인이 데이터 유형의 논리적 속성을 생각하고 내부에서 어떻게 구현이 되는지 여부는 분리한다.

 

추상 데이터 타입(ADTs)은 구현과 무관하게 지정된 속성을 가진 데이터 유형이다. 또한, 데이터 구조를 데이터 요소의 집합으로 설명하며, 특정 접근 방법에 대해 조직된다.

 

따라서 자료구조를 만드는 사람하고 실제로 사용하는 사람하고 다르기 때문에 사용하는 사람이 쓸 수 있도록 만드는 사람은 사용하기 위해 필요한 정보만 제공하면 된다.

 

데이터의 레벨을 3단계로 분류할 수 있는데 각각 응용/사용자 단계, 논리적/ADT 단계, 구현 단계가 있다.

 

ADT에 대한 네 가지 기본 요소는 Constructor, Transformer, Observer, Iterator이다.

 

Constructor는 새로운것을 만드는 것에 대한 것이고, Transformer는 데이터를 변경하는 것이고, Observer는 값을 변경하지 않고 가져가는 것이고, Iterator는 데이터가 연속적으로 있을 때 다음 데이터를 접근하게 하는 것이다.

 

composite data type은 여러 데이터 타입을 하나로 묶어서 하나의 타입으로 만들어준 것으로 각각의 요소에 대해 접근할 수 있는 방법을 포함하고 있다.

 

구조화 되어있는 composite data type은 대표적으로 array가 있고 구조화 되어있지 않은 것으로는 c++에서 class가 있다.

 

c++의 class 구분은 다음과 같은데 각각의 맴버를 접근하기 위해 .(dot) 기호를 사용하여 접근한다.

class A{
    int num;
    char name[10];
    float price;
};

A people;

 

A people; 로 people 변수를 선언해주면 구현 과정에서 메모리의 비어있는 곳에 할당을 해주고 할당을 시작한 첫 번째 주소인 Base address를 얻게 된다.

 

int의 경우 4byte이고 char가 10개이므로 10byte  그리고 float는 4byte이다.

 

따라서 위의 예시에서 만약 Base address가 8000이라고 하면 num은 8000부터 저장되고, name은 8004부터, price는 8014부터 저장되게 된다.

 

c++에서 array의 크기는 저장되는 주소를 할당해줘야 하기 때문에 compile 할 때 결정해줘야 하고 중간에 수정할 수 없다.

 

이차원 배열은 arr[row][col] 형태로 쓰는데 시각적으로는 2차원 표로 생각할 수 있지만 메모리에는 1차원으로 표현해야 한다. 

 

따라서 구현을 할 때 주로 한 행씩 일렬로 쭉 연결해서 저장을 하는데 이를 row-major 방식이라고 하고 대부분의 언어가 이러한 방식을 사용한다.

 

객체 지향 프로그래밍은 클래스, 객체, 상속에 중점을 둔다.

 

여기서 클래스는 객체의 구조를 정의하고 상속으로 계층적인 구조를 구성한다.