수강한 개념
객체 포인터 / 객체 배열
- 거의 비슷함. 객체를 포인터로 접근
- 포인터 다시 공부하거라
ㄴ . 이랑 -> 차이 확실히 알기
객체 동적생성
- 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기 학습 기록으로 작성되었습니다.
'교육관련 > 한화비전 VEDA 수강일지' 카테고리의 다른 글
| [VEDA 1기 수강일지] 11일차 - C++ 기초 (4) : virtual, 추상클래스 (0) | 2024.07.29 | 
|---|---|
| [VEDA 1기 수강일지] 10일차 - C++ 기초 (3) : 오버로딩, static, 상속 (0) | 2024.07.26 | 
| [VEDA 1기 수강일지] 8일차 - C++ 기초 (1) : 입출력, 클래스 (0) | 2024.07.24 | 
| [VEDA 1기 수강일지] 7일차 - C언어 (임베디드/리눅스) (2) (0) | 2024.07.23 | 
| [VEDA 1기 수강일지] 6일차 - C언어 (임베디드/리눅스) (1) (0) | 2024.07.22 | 
댓글