썸네일 [자료구조] 스택 구현하기 - Stack template을 이용한 스택 구현 스택 기능 push 데이터 삽입 peek 가장 최근에 삽입된 데이터에 접근 pop 가장 최근에 삽입된 데이터 꺼내오기 full 스택이 찼는지 확인 empty 스택이 비었는지 확인 size 스택 사이즈 반환 스택 구현 #include using namespace std; template class Stack { private: T* stack_data; int top_idx; int max_size; public: Stack(int stack_size) : top_idx(-1) , max_size(stack_size) { stack_data = new T[stack_size]; } ~Stack() { delete stack_data; } void push(const T&..
썸네일 [C++] 스마트 포인터 - unique_ptr, shared_ptr, weak_ptr 스마트 포인터란 포인터처럼 사용하는 클래스 템플릿 사용이 끝난 메모리를 자동으로 해제해 메모리 누수를 방지한다. 스마트 포인터 유형 unique_ptr shared_ptr weak_ptr unique_ptr 하나의 스마트 포인터만이 특정 객체를 소유할 수 있는 스마트 포인터 해당 객체의 소유권을 가지고 있을 때만 소멸자가 해당 객체를 삭제할 수 있다. unique_ptr 인스턴스는 move() 함수를 통해 소유권 이전이 가능하지만 복사할 수는 없다. 소유권이 이전되면 이전 unique_ptr 인스턴스는 해당 객체를 소유하지 않게 재설정된다. // 문법 unique_ptr 변수명(new 객체); unique_ptr 변수명 = make_unique(인수); #include #include usingnames..
썸네일 [C++] 포인터와 참조자 - Pointer, Reference 포인터(Pointer)란 메모리의 주소값을 저장하는 변수 데이터타입* 변수명;// 문법 int n = 10; int* ptr_a; int* ptr_b = &n;// 포인터 변수 선언과 동시에 변수 n의 주소값을 대입해 초기화 참조자(Reference)란 특정 변수의 실제 이름 대신 사용하는 변수 데이터타입& 변수명;// 문법 int n = 10; int& ref = n;// 참조자 선언과 동시에 변수 n을 대입해 초기화 참조자를 선언할 때의 주의사항 1. 참조자의 타입은 대상이 되는 변수의 타입과 동일해야 함 2. 선언과 동시에 초기화되어야 함 3. 한 번 초기화되면 대상을 바꿀 수 없음 포인터와 참조자의 차이 1. NULL 값 보유 가능 여부 포인터는 선언할 때 주소를 할당하지 않아도 돼 NULL 값을..
썸네일 [C++] 가상 함수 - virtual 가상 함수란 파생된 클래스에서 재정의할 것으로 기대하는 멤버 함수를 뜻한다. 자신을 호출하는 객체의 동적 타입에 따라 호출할 함수가 결정된다. virtual 반환형식 함수명// 문법 virtual void print();// 예시 재정의하지 않았을 때 발생하는 이슈 함수를 호출하는 코드는 컴파일 타임에 고정된 메모리 주소로 변환된다. (정적 바인딩 또는 초기 바인딩이라고 함) 일반 멤버 함수는 정적 바인딩을 하게 되는데 이때 일반 멤버 함수를 오버로딩해서 사용할 경우 문제가 발생한다. #include using namespace std; class Parent { public: void print() { cout
썸네일 [C++] 객체 지향 프로그래밍(OOP, Object Oriented Programming) 객체 지향 프로그래밍이란 객체들 간의 상호작용을 통해 프로그램을 설계하는 프로그래밍 패러다임이다. 객체 지향 프로그래밍의 장단점 장점 1. 코드 재사용이 용이하다. 다른 사용자가 작성한 클래스를 가져와 사용할 수 있고 기존의 클래스를 상속받아 확장하여 쓸 수 있다. 2. 유지보수가 쉽다. 객체로 코드를 분리하기 때문에 수정, 보완이 필요한 부분만 작업하면 된다. 3. 대형 프로젝트에 적합하다. 클래스 단위로 모듈화되어 있기 때문에 여러 명이서 작업하기 좋다. 4. 직관적인 코드 분석이 가능하다. 객체의 속성과 메서드가 클래스에 명시되어 있어 객체 간의 관계를 파악하기 쉽다. 단점 1. 처리 속도가 느리다. 2. 객체가 많을수록 용량이 커진다. 3. 설계하는 데 시간과 노력이 많이 든다. 객체 지향 프로그..
썸네일 [C++] Call by value, Call by reference Call by value 값에 의한 호출 함수에서 값을 복사해 전달하는 방식 #include void Swap(int x, int y) { int temp = x; x = y; y = temp; } int main() { int a = 10; int b = 20; Swap(a, b); printf("a: %d, b: %d", a, b); } Swap 함수의 매개변수 x, y가 함수 호출과 동시에 선언되면서 인자로 전달받은 a, b의 데이터 값이 들어가게 된다 int x = a;인 셈 데이터 값만 복사되어 들어갔기 때문에 원본에 영향을 끼치진 않는다 Swap 함수 실행 후에도 a, b의 값은 바뀌지 않음 Call by reference 참조에 의한 호출 함수에서 주소값을 복사해 전달하는 방식 #includ..
썸네일 [C++] 객체 생성 시 초기화 객체는 항상 초기화된다는 보장이 없어 항상 객체를 사용하기 전에 초기화를 해줘야 한다. class Person{ public: Person(string inName, int inAge); private: string name; int age; }; // 1. 대입 Person(string inName, int inAge) { name = inName; age = inAge; } // 2. 멤버 초기화 리스트 Person(string inName, int inAge) : name(inName), age(inAge) {} 첫 번째 방법은 초기화가 아닌 생성자 초기화를 지나 값을 대입하고 있는 것이다. 기본 생성자 호출 > 복사 대입 연산자 호출 이 되고 있는 것이다. 두 번째 방법은 복사 생성자에 의해 초기..
썸네일 [C++] 메모리 동적 할당 및 해제 - new, delete new 동적으로 메모리를 할당할 때 사용하는 연산자 원하는 자료형 앞에 new를 붙여 사용하면 된다. new 연산자 사용 예시 int* ptr = new int; int* arr_ptr = new int[10]; delete new 연산자를 이용해 동적으로 할당된 메모리를 해제하는 연산자 delete 연산자 사용 예시 int* ptr = new int; int* arr_ptr = new int[10]; delete ptr; delete[] arr_ptr; // 배열의 경우는 이와같이 사용해야 함 malloc과 new의 차이 1. malloc은 함수, new는 연산자다. malloc, free는 라이브러리가 제공하는 함수고, new와 delete는 연산자라 라이브러리 추가 없이 사용 가능하다. 2. 초기화..
썸네일 [C++] 메모리 동적 할당 및 해제 - malloc, calloc, realloc, free malloc 동적으로 메모리를 할당하는 함수 #include void* malloc(size_t size) 메모리 크기를 바이트 단위로 넘기면 그 크기만큼 메모리가 할당되고 할당된 메모리의 첫 번째 바이트의 주소가 반환된다. 메모리 할당에 실패할 경우 NULL이 반환된다. 개발자가 어떤 데이터 형으로 저장하는지 알 수 없기 때문에 void* 형을 반환하고, 개발자는 사용 용도에 맞게 변환하여야 한다. malloc 함수 사용 예시 #include #include int main() { int arr[10]; int* arr_ptr; for(int i = 0; i < 10; ++i) { arr[i] = i; } arr_ptr = (int*)malloc(sizeof(int)*10); // 배열의 크기만큼 할당..
썸네일 [C++] 메모리 구조 - Code, Data, Stack, Heap 프로그램 실행 시 운영체제는 메모리 공간을 할당해주는데 이 구조는 크게 네 가지로 나뉜다 코드 영역 (Code Area) 데이터 영역 (Data Area) 힙 영역 (Heap Area) 스택 영역 (Stack Area) Code 실행될 프로그램의 코드가 기계어로 저장되는 영역 CPU는 코드 영역에 저장된 명령문들을 하나씩 가져가 실행한다 Data 전역 변수, static 변수들이 저장되는 영역 프로그램 시작 시 할당되고 프로그램 종료 시 소멸된다 데이터 영역 크기는 컴파일 때 결정된다 Stack 지역 변수, 매개변수가 저장되는 영역 함수 호출 시 할당되고 함수 호출 완료 시 소멸된다 스택 영역 크기는 컴파일 때 결정된다 Stack Frame 함수가 호출되면 함수의 매개변수, 호출이 끝나면 돌아갈 반환 주..