클래스를 이용한 동적 배열 만들기 + 인라인 함수

Yama·2023년 12월 22일
0

어소트락 수업

목록 보기
24/55

헤더에 어케 구현 했누?

  • 지금까지 배운 내용으로는 함수들의 재정의 오류가 났을것.
    • 인라인 함수라 가능햇다.

인라인 함수

  • 헤더에 실제 구현을 구현 함으로써, 호출시 해당 구현을 그대로 복사한다.
  • 매크로 함수와 유사, 함수 호출 시 별도의 스택 생성 해제 비용이 없다.
int size() { return m_CurCount; }
  • 사이즈를 현재 맴버변수인 m_CurCount로 반환.
  • 인라인 함수를 남발하는 경우의 발생하는 문제점.
    • 함수 구문이 여기저기 호출하는 곳마다 복사되어서 코드의 양이 엄청나게 늘어날 수 있다.
  • 인라인 처리를 할 함수들의 특징
    1. 구문이 짧다
    2. 자주 호출 되는 함수
      • 기능이 간단하다,
      • 둘다 해당하는게 Get, Set 종류의 함수
	CArr arr;
	int i = 0;
	i = arr.size(); // 1
	i = arr.capacity(); // 2
  • 1번은 컴파일할떄 arr.m_CurCount;로 변경된다.
  • 2번은 컴파일할떄 arr.m_MaxCount;로 변경된다.
  • 인라인 함수가 너무 크면 컴파일러는 인라인 함수가 아니라 일반 함수로 처리한다.

인라인 함수 활용

CArr.h

int operator[](int _Idx) { return m_pData[_Idx]; }

main.cpp

int main()
{
	CArr arr;
    
	int data = arr[2]; 
	arr[2] = 40;

	return 0;
}
  • 이렇게 반환해버리면 오류가 난다.
    • 레퍼런스로 해결 가능

CArr.h

int* operator[](int _Idx) { return m_pData + _Idx; }  // 4

main.cpp

int main()
{
	CArr arr;
    
	int data = arr[2]; 
	*arr[2] = 60;

	return 0;
}
  • 포인터도 오류가 발생한다.
// 구현 되있다 가정.
Add(10, 20) = 20;
  • 리턴된걸 알고싶은게 아니라 리턴된 자리를 수정하고 싶기 떄문이당.

CArr.h

int& operator[](int _Idx) { return m_pData[_Idx]; }

main.cpp

int main()
{
	CArr arr;
    
	int a = arr[2];
	arr[2] = 60;

	return 0;
}
  • 레퍼런스를 이용해서 요구사항이 다 가능하게됬다.

클래스를 이용해서 동적 배열 만들기

데이터 추가함수.

void CArr::push_back(int _Data)
{
	if (m_MaxCount <= m_CurCount) // 1
	{
		// 저장 공간 추가할당
		Realloc(); // 2
	}

	m_pData[m_CurCount++] = _Data; // 3
}
  • 1번은 데이터가 꽉 차 있다면 공간을 추가할당한다는 조건문
  • 2번은 저장 공간 추가할당 함수 호출.
  • 3번은 맴버변수(m_CurCount)에 = _Data 대입하고 m_CurCount하나 증감.

공간 추가함수

void CArr::Realloc()
{
	// 1
	m_MaxCount *= 2;
	int* pNew = (int*)malloc(sizeof(int) * m_MaxCount);
    // 2
	for (int i = 0; i < m_CurCount; ++i)
	{
		pNew[i] = m_pData[i];
	}
	// 3
	free(m_pData);
	// 4
	m_pData = pNew;
}
  • 1번은 새로운 공간 할당
  • 2번은 기존 데이터 이동
  • 3번은 기존 공간 해제
  • 4번은 새로운 공간을 가리킨다.

강의 코드

mian.cpp

#include <iostream>

#include "CArr.h"


int Add(int a, int b)
{
	return a + b;
}

int main()
{
	CArr arr;

	int i = 0;
	i = arr.size();
	i = arr.capacity();

	arr.push_back(10);
	arr.push_back(20);
	arr.push_back(30);
	arr.push_back(40);

	int a = arr[2];
	arr[2] = 60;

	for (int i = 0; i < arr.size(); ++i)
	{
		printf("입력 데이터 : %d\n", arr.at(i));
	}

	for (int i = 0; i < arr.size(); ++i)
	{
		printf("입력 데이터 : %d\n", arr[i]);
	}

	return 0;
}

CArr.h

#pragma once


class CArr
{
private:
	int*	m_pData;
	int		m_MaxCount;
	int		m_CurCount;

public:
	void push_back(int _Data);

private:
	void Realloc();

public:
	int size() { return m_CurCount; }	
	int capacity() { return m_MaxCount; }
	int at(int _Idx) { return m_pData[_Idx]; }

	// 반환타입을 참조형태로 반환, 반환된 값을 수정하면 원본값이 수정되는 개념
	int& operator[](int _Idx) { return m_pData[_Idx]; }


public:
	CArr();
	~CArr();
};

CArr.cpp

#include "CArr.h"

#include <iostream>

CArr::CArr()
	: m_pData(nullptr)
	, m_CurCount(0)
	, m_MaxCount(2)
{
	 m_pData = (int*)malloc(sizeof(int) * m_MaxCount);
}

CArr::~CArr()
{
	free(m_pData);
}

void CArr::push_back(int _Data)
{
	if (m_MaxCount <= m_CurCount)
	{
		Realloc();
	}

	m_pData[m_CurCount++] = _Data;
}

void CArr::Realloc()
{
	m_MaxCount *= 2;
	int* pNew = (int*)malloc(sizeof(int) * m_MaxCount);

	for (int i = 0; i < m_CurCount; ++i)
	{
		pNew[i] = m_pData[i];
	}
  
	free(m_pData);

	m_pData = pNew;
}

1차 23.12.22
2차 23.12.25
3차 23.12.26
4차 23.12.27
5차 23.12.28
6차 24.01.02

0개의 댓글