본문 바로가기
교육관련/한화비전 VEDA 수강일지

[VEDA 1기 수강일지] 9일차 - C++ 기초 (2) : 포인터, 참조

by 김수효 2024. 7. 25.
수강한 개념

 

객체 포인터 / 객체 배열

- 거의 비슷함. 객체를 포인터로 접근

- 포인터 다시 공부하거라

ㄴ . 이랑 -> 차이 확실히 알기

 

객체 동적생성

- new

- delete

- 메모리 해제 하고 나면 포인터변수를 NULL로 초기화 하는것을 권장

ㄴ 할당은 해제되었지만 해제 전 주소를 담고 있으면 참조시 문제가 될 수 있기 때문

- 동적할당 메모리 초기화

ㄴ int *p = new int(20);  ->  이게 되네

ㄴ 자료형 구현이 class기?반인듯?

 

this 포인터

- 매개변수 이름 == 멤버변수 이름인 경우 사용

- 멤버함수가 객체 자신의 주소를 리턴하는 경우 사용

- 멤버함수가 아닌 함수에서 사용불가 -> 객체와 관련없기 대문

- static 멤버함수에서 사용불가 -> 전역 메모리에 할당 되기때문(객체 생성 전에 static 함수 호출이 있을 수 있기 때문)

 

객체 리턴

- 메모리 복사가 되어 넘어가는 형태

 

참조

- 이미 존재하는 객체나 변수에 대한 별명

- 참조변수 : 이름만 생김, 새 메모리 할당 x

- 참조에 의한 호출 (포인터를 안써도 가능한 부분들이 있음)

#include <iostream>

using namespace std;

void swap(int& a, int& b)
{
	int tmp;
	tmp = a;
	a = b;
	b = tmp;
}

int main()
{
	int m = 2, n = 9;
	swap(m, n);
	cout << m << " " << n << endl;
	return 0;
}

 

- 참조리턴

 

복사 생성자

- 동적할당된 메모리를 복사하는 경우 반드시 복사생성자 필요 -> 소멸자 문제

- 얕은 복사 : 메모리 공유

- 깊은 복사 : 주소복사 x 새로운 메모리 할당

Stack::Stack(const Stack& sObj)
{
	this->size = sObj.size;
	this->top = sObj.top;
	this->buffer = new int[this->size];
	memcpy(this->buffer, sObj.buffer, sizeof(int) * (top + 1));
}

 

문제 구현 / 개선방안

 

1. stack 구현

 

1)Stack.h

#ifndef _STACK_H
#define _STACK_H

class Stack
{
	int size;	//stack size
	int top;	//last data location
	int* buffer;
public :
	Stack();
	Stack(int s);
	~Stack();
	bool pop(int * rst); //return x 인자로 받기
	bool push(int input);
	int getSize();
	bool setSize(int s);
	int getTop();//top location
	int getData(int pos); //pop 감소 x
};

#endif

 

2)Stack.cpp

#include <iostream>
#include "Stack.h"
using namespace std;

Stack::Stack() { setSize(10); top = -1;}
Stack::Stack(int s) { setSize(s); top = -1;}
Stack::~Stack() { delete [] buffer; }

bool Stack::pop(int * rst) //return x 인자로 받기 
{
	if (top != -1) 
	{
		*rst = buffer[top];
		buffer[top] = -1;
		top--;
		return true;
	}
	else return false;
	
}
bool Stack::push(int input) //input >= 0;
{
	if (top < size)
	{
		top++;
		buffer[top] = input;
		return true;
	}
	else 
	{
		int s;
		cout << "메모리 부족, 새 메모리 값 입력 " << "(현재 size : " << size << ") : ";
		cin >> s;
		int* temp = new int[size];
		for (int i = 0; i <= top; i++)
		{
			temp[i] = buffer[i];
		}
		setSize(s);
		for (int i = 0; i <= top; i++)
		{
			buffer[i] = temp[i];
		}
		delete [] temp;
	}
}
int Stack::getSize() //stack size
{
	return size;
}
bool Stack::setSize(int s) //set stack size
{
	buffer = new int[s];
	if (!buffer) return false;
	else size = s; 
}
int Stack::getTop() //top location
{
	return top;
}
int Stack::getData(int pos) //pop 감소 x top data
{
	return buffer[top];
}

 

3)StackM.cpp (main)

#include <iostream>
#include "Stack.h"
using namespace std;

int main()
{
	Stack s1(5);
	s1.push(123);
	s1.push(456);
	s1.push(789);
	cout << "s1 ===> ";

	int data;
	cout << "data : ";
	while (s1.pop(&data))
		cout << data << " ";
	cout << endl;
    return 0;
}

 

기타 사항

 

백준 이번주는 딱 class 1까지만 풀자

다음주에는 class 2 푼다 (40문제)\

 


VEDA 바로가기 : www.vedacademy.co.kr

VEDA(한화비전 아카데미) 영상으로 확인하기 : https://url.kr/zy9afd

본 후기는 VEDA(한화비전 아카데미) 1기 학습 기록으로 작성되었습니다.

댓글