가변 배열 (1)

Yama·2023년 12월 18일
0

어소트락 수업

목록 보기
16/55

자료구조

  • 자료 처리 방식
    1. 스택(후입 선출)
    2. 큐 (선입 선출)
  • 데이터를 집어 넣을떄 필요한 구조적인것.
    1. 동적 배열, 컨테이너(데이터를 관리하는 공간)
    • 공간이 더 필요하면 더 공간을 크게 하는 것.?

동적 배열 안쓸시

#include <iostream>

int main()
{
	int iArr[10] = {}; 
	
    // iArr[29] = 10; // 1
    
    int* pInt = iArr;
    pInt[30] = 100; // 2
  	
    return 0;
}
  • // 1 오류
    • 메인 스택을 벗어난 곳에 10을 넣을려 해서 에러가 발생한다.
  • // 2는 오류 없이 넘어가지만 엄청 위험한 상황이다.

동적 배열 역할을 수행할 수 있는 자료형

main.cpp

#include <iostream>
#incldude "DArr.h"

int main()
{
	DArr arr;
    arr.iArr[0] = 100;
    
    return 0;
}

DArr.h

#pragma once

struct DArr
{
	int iArr[100];
}

  • int형 배열 100개를 만들고 첫번째 자리에 100 대입했다.

main.cpp

#include <iostream>
#Incldude "DArr.h"

int main()
{
	DArr arr;
    arr.iArr[0] = 100;
    
    return 0;
}

DArr.h

#progma once

int g_Size = 200;

struct DArr
{
	int iArr[100]; 
    
	int iArr[g_Size]; // 1

};

  • // 1같이 전역변수를 사용해도 배열에 크기 지정 값으로 넣어 줄수 없다.

동적 배열로서의 기능을 수행하기 위해 필요한 맴버

main.cpp

#include <iostream>
#include "DArr.h"

int main()
{
	int iArr[100] = {};

	DArr arr = { };
    
	return 0;
}

DArr.h

#pragma once

struct DArr
{
	int* pData;		// 1
	int	 MaxCount;	// 2
	int  CurCount;	// 3
};
  • // 1 데이터를 저장시킬 힙 영역 공간의 시작 주소
  • // 2 허용 가능한 최대 공간 개수
  • // 3 현재 채워진 데이터 개수

가변 배열 초기화 함수

main.cpp

#include <iostream>
#include "DArr.h"

int main()
{
	DArr arr = { }; 
    
	InitDArr(&arr); // 1
    
	return 0;
}

DArr.h

#pragma once

struct DArr
{
	int* pData;	
	int	 MaxCount;	
	int  CurCount;	
};

void InitDArr(DArr* _pArr);

DArr.cpp

#include "DArr.h"
#include <iostream>

void InitDArr(DArr* _pArr)
{
	_pArr->CurCount = 0;
	_pArr->MaxCount = 4;
	_pArr->pData = (int*)malloc(sizeof(int) * _pArr->MaxCount);
}
  • 힙 공간에 MaxCount 크기만큼을 할당 한다.
  • // 1 주소값을 넘겨줘야 개체에 접근해서 값을 수정 할 수 있다.
  • 메모리 해제는 못한다.

힙 공간에 데이터 넣기

main.cpp

#include <iostream>
#include "DArr.h"

int main()
{
	DArr arr1 = { }; //  1 주소값 할당
	DArr arr2 = { }; // 주소값 할당 x
	DArr arr3 = { }; // 주소값 할당 x
	DArr arr4 = { }; // 주소값 할당 x

	InitDArr(&arr1); // 2
	PushData(&arr1, 10); // 3
	PushData(&arr1, 20); // 6
	PushData(&arr1, 30); // 7
	PushData(&arr1, 40); // 8

	// PushData(&arr1, 50); //9
    
	return 0;
}

DArr.h

#pragma once

struct DArr
{
	int* pData;	
	int	 MaxCount;	
	int  CurCount;	
};

void InitDArr(DArr* _pArr);

void PsuhData(DArr* _pArr, int _Data); // 10

DArr.cpp

#include "DArr.h"
#include <iostream>

void InitDArr(DArr* _pArr)
{
	_pArr->CurCount = 0;
	_pArr->MaxCount = 4;
	_pArr->pData = (int*)malloc(sizeof(int) * _pArr->MaxCount);
}

void PushData(DArr* _pArr, int _Data) 
{
	if (_pArr->MaxCount <= _pArr->CurCount) // 4
	{
		// 공간확장
	}

	_pArr->pData[_pArr->CurCount++] = _Data; // 5
}
  • // 10 가변 배열의 개체의 주소값과, 넣어줄 데이터를 알려줘야한다.

  • 구동 순서.

    1. // 1로 구조체를 초기화한다.
    2. // 2 함수를 호출해서 구조체 arr1에 힙 영역의 주소값을 받아온다.
    3. // 3 함수를 호출해서 if문이 참이면 공간을 확장하고 //5 코드 실행
      참이 아니라면 아래 // 5번 코드를 실행한다.
    4. // 5 첫번쨰 힙 영역에 int형 10을 넣어주고 CurCount를 0에서 1로 증가시킨다.
    5. // 6 ~ 8까지 값을 힙영역에 채워준다.

공간 확장

  • malloc는 공간을 확장할떄 바로 메모리 끝에 연결해주는게 아니라 비여있는 랜덤한 힙 영역에 확장해준다.

단축키 추가

  • 선언에서 정의 바로 만들기 : Ctrl + '+' + '.'

강의 코드

main.cpp

#include <iostream>

#include "DArr.h"

int main()
{
	int iArr[100] = {};


	DArr arr1 = {};
	DArr arr2 = {};
	DArr arr3 = {};
	DArr arr4 = {};


	InitDArr(&arr1);
	PushData(&arr1, 10);
	PushData(&arr1, 20);
	PushData(&arr1, 30);
	PushData(&arr1, 40);

	PushData(&arr1, 50);

	return 0;
}

DArr.h

#pragma once

// 동적배열 역할을 수행할 수 있는 자료형
struct DArr
{
	int* pData;		
	int  MaxCount;
	int  CurCount;
};

void InitDArr(DArr* _pArr);

void PushData(DArr* _pArr, int _Data);

void Realloc(DArr* _pArr);

DArr.cpp

#include "DArr.h"
#include <iostream>

void InitDArr(DArr* _pArr)
{
	_pArr->CurCount = 0;
	_pArr->MaxCount = 4;
	_pArr->pData = (int*)malloc(sizeof(int) * _pArr->MaxCount);
}

void PushData(DArr* _pArr, int _Data)
{
	if (_pArr->MaxCount <= _pArr->CurCount)
	{
		// 공간 확장
		Realloc(_pArr);
	}

	_pArr->pData[_pArr->CurCount++] = _Data;
}

void Realloc(DArr* _pArr)
{

}

1차 23.12.18
2차 23.12.19
3차 23.12.20
4차 23.12.21
5차 23.12.22
6차 23.12.25
7차 24.01.01
8차 24.01.25

0개의 댓글