프로그래머 56

CPP STL LIST편

List(연결 리스트) 종류 단일: 노드의 순서가 한 방향이다. 이중: 노드의 순서가 양 방향이다. 원형: 이중 + 첫 노드와 마지막 노드가 연결되어 있다. 이중노드를 기준으로 list의 동작 원리를 알아보자. List STL의 vector와는 달리 list는 노드 단위로 비연속적인 메모리 공간에 존재한다. vector 때 배운 내용을 생각해보면 동작 원리를 유추할 수 있다. 노드의 구조를 잠시 살펴보면, template class Node { public: Node* _next;// 다음 노드의 주소 Node* _prev;// 이전 노드의 주소 T _data; }; 하나의 노드는 다음, 이전 노드의 주소와 데이터를 가지고 있다. list의 중간 삽입/삭제, 처음/끝 삽입/삭제 노드가 가리키는 주소를 수..

cpp STL vector편

STL(Standard Template Library) 프로그래밍을 할 때 필요한 자료구조/알고리즘을 템플릿으로 제공하는 라이브러리이다. 컨테이너(Container) STL의 구성품 중 하나. 데이터를 저장하는 객체이며, 이를 자료구조(Data Structure)라 한다. 즉, 자료구조는 데이터를 저장하는 방식이다. 이제부터 알아볼 vector는 시퀀스 컨테이너( Sequence Container )의 한 종류다. 시퀀스 컨테이너는란 데이터가 삽입 순서대로 나열되는 형태를 지니는 자료구조다. vector, list, deque가 시퀀스 컨테이너에 속한다. Vector vector는 면접에서도 자주 등장하는 개념이다. vector가 동작하는 원리를 아는 것이 좋다. vector는 동적 배열이다. 배열의 단..

cpp 함수 포인터

이 전까지만 공부해도 언리얼을 활용할 수 있다. 서버쪽에서는 STL이라는게 필요한데, 이를 공부하기 전 사전 지식을 쌓아보자. 또한 면접에서 STL관련 질문도 나오기 때문에 공부해두자. typedef typedef는 특정 자료형에 가명을 만드는 것이다. typedef int DATA; DATA number = 1; 여기서 정수형 자료형 int의 이름을 DATA로 지어주면, int 대신 DATA로 정수를 받는 변수를 만들 수 있다. 참고로 만들어진 선언 문법의 맨 앞에 typedef를 붙인다고 생각하는게 문법적으로 이해하기 편하다. 밑의 두 가지 중에서 무엇이 맞는 문법일까? typedef int[20] ARRAY; typedef int ARRAY[20]; 정답은 밑의 코드가 맞는 문법이다. 이해하기 편한..

cpp 디버깅 기초

디버깅 기초 F5, shift + F5, F10, F11 int MultiplyBy(int a, int b) { return a * b; } int main() { int a = 3; int b = 5; int result = MultiplyBy(b, a); } F5는 중단점까지 실행한다는 의미다. 한 번 더 누르면 다음 중단점까지 실행한다. 없다면 프로그램 전체를 실행한다. shift + F5는 디버깅을 중단한다. F10은 프로시저(함수) 단위로 코드를 실행한다는 의미다. F11은 한 단계씩 코드 실행인데, 실행 중에 함수를 만난다면 함수 내부로 진입한다. 위에서 F11을 누르면서 한 줄씩 실행하다가 main의 MultiplyBy(b, a)를 만나면, 해당 함수로 이동해서 실행하는 것이다. 조사식 F5..

cpp casting의 4가지 방법

이때까지 우리는 캐스팅을 명시적으로 할 때 (int)방식을 사용했다. 이는 c언어의 특성이며 cpp은 다른 캐스팅 방식을 가지고 있다. 따라서 이제부터 알아볼 casting 방식을 cpp을 사용할 때 이용하도록 하자. class Player { public: virtual ~Player() { } }; class Knight : public Player { }; class Archer : public Player { }; class Dog { }; void PrintName(char* str) { cout

cpp 얕은 복사와 깊은 복사

포인터 멤버 변수 사용 예시 복사를 알아보기 전에 포인터를 멤버 변수로 가지는 경우를 살펴본다. class Pet { }; class RabbitPet : public Pet { }; class Knight { public: Knight() { // Knight 와 Pet 의 생명 주기를 동일하게 한다. _pet = new Pet(); } ~Knight() { delete _pet; } public: int _hp = 100; Pet* _pet; }; Knight 클래스에 있는 멤버 변수 _pet을 왜 포인터로 설정했냐면, Pet 클래스를 상속받는 자식 클래스도 담고 싶고 Knight 클래스와 독립적인 객체임을 표현하고 싶기 때문이다. 기본 멤버 변수로 _pet을 설정하면 Knight 객체가 사라지면, ..

cpp 타입 변환

타입 변환 유형 비트열 재구성 여부를 기준으로 나눈다. 값 타입 변환 의미를 유지하기 위해서 원본 객체와 다른 비트열로 재구성한다. 비트열을 바꾸고, 논리적으로 말이 되게 바꾸는 변환이다. 여기서 논리적으로 말이 된다는 것을 예로 들자면, 불독은 개로 변환될 수 있지만 개는 불독으로 변환하지 않는다. 모든 개가 불독이 아니기 때문이다. 그리고 개는 기사로 변환되는 것도 논리적으로 맞지 않다. int a = 1234;// 2의 보수 float b = (float)a;// 부동소수점 Dog dog = bulldog;// Bulldog은 Dog의 자식 클래스 참조 타입 변환 참조 타입 변환은 자주 쓰이지 않는다. 이것보다 포인터 타입 변환이 자주 쓰인다. 비트열을 재구성하지 않고 관점만 바꾼다. 안전하다면 암..

cpp 동적 할당과 인자로 받는 클래스 주의점

기본 개념 메모리 구조 [ [코드 영역] [data 영역] [heap 영역] [stack 영역] ] Data 영역 프로그램이 실행하는 동안 메모리에 올라와 있다. 주로 전역/정적 변수가 할당된다. Stack 영역 함수가 시작할 때 메모리에 올라오고 함수가 종료하면 정리된다. 잠시 사용하는 용도로 사용한다. 주로 지역/매개 변수가 할당된다. 몬스터를 1마리 ~ 5만 마리 생성한다고 할 때, 어느 영역에 저장해야 할까? stack 영역에 저장하면 stack overflow가 발생하면서 프로그램이 강제 종료된다. data 영역에 저장하면 최대 값을 저장하기 때문에 빈 공간이 많아진다. 즉, 메모리 낭비가 심하다. 따라서 항상 일정하지 않고 실시간으로 바뀔 수 있는 정보를 저장하기 위해 heap 영역을 사용한다..