수강한 개념
객체 포인터 / 객체 배열
- 거의 비슷함. 객체를 포인터로 접근
- 포인터 다시 공부하거라
ㄴ . 이랑 -> 차이 확실히 알기
객체 동적생성
- 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 |
댓글