전체 글 34

Dangling Pointer

Dangling Pointer ? 적절한 타입의 유효한 객체를 가리키고 있지 않는 포인터이다. 메모리가 해제 된 곳을 가리키고 있는 포인터이다. 발생하는 상황 객체에 대한 참조가 포인터 값에 대한 수정 없이 삭제되거나 할당 해제돼서 포인터가 계속 할당 해제된 메모리를 가리킬 때이다. 기존 프로그램이 Dangling pointer를 역참조하면 메모리는 전혀 다른 데이터를 갖고 있을 것이므로 예측할 수 없는 행동이 발생한다. 포인터가 알려진 상태로 초기화되기 전에 사용될 때 발생한다. 프로그램이 허상 포인터가 가리키는 메모리에 쓰기를 하면 관련되지 않은 데이터의 오염이 발생하게 된다. 리눅스, 유닉스의 경우에는 세그멘테이션 오류가 발생한다. 윈도우의 경우에는 일반 보호 오류가 발생한다. 객체 지향 프로그래밍..

C++ STL 벡터, 리스트, 덱 비교

C++ STL 벡터, 리스트, 덱 비교 개인적으로 까먹지 않으려고 적어두는 글. 벡터 vector v; // 컴파일러 버전에 따라 vector v;로 써야 인식이 되는 경우도 있다. vector v; 1) Vector 특징 배열과 유사하다. 배열의 크기는 고정이지만, 벡터의 크기는 동적으로 변한다. 중간에 데이터 삽입, 삭제가 용이하지 않다. 데이터를 순차적으로 저장한다. 검색 속도가 느리다. 랜덤 접근이 용이하다. 2) Vector를 사용해야 하는 경우 중간의 데이터 삽입이나 삭제가 없을 경우 순차적으로 저장된 데이터를 빈번하게 검색하지 않을 경우 특정 데이터가 저장된 위치를 파악하여 랜덤 접근할 경우 ex) v [5] 3) 장점 개별 원소들을 인덱스로 접근이 가능하다. 원소를 컨테이너의 끝에 삽입 /..

Git 관련 정리

fork에서 시작해서 PR을 보낼때까지의 흐름 fork를 하여 나의 저장소로 프로젝트를 가져온다. 이 때, fork한 저장소는 원본 저장소와 연결되어 있다. fork한 프로젝트를 자신의 컴퓨터로 clone한다. 이 때, single-branch 옵션을 주어 특정 브랜치만 가져올 수 있다. 자신의 컴퓨터에서 수정 후 commit을 한다. push를 하여 자신의 원격 저장소에 올린다. push완료 후 자신의 github저장소에서 Pull Request를 보낸다. PR을 받은 관리자는 코드 변경내역을 확인하고 Merge여부를 결정하게 된다. git add와 commit git add 명령어로 commit할 파일들을 올려놓는 가상 영역인 staging area에 작업한 특정 파일을 올릴 수 있다. git com..

ETC | 기타 2022.11.17

언리얼엔진 String

FString FString TestHUDString = FString(TEXT("This is my test FString.")); 특징 조작이 가능한 유일한 스트링 클래스이다. 대소문자 변환, 부분 문자열 발췌, 역순 등 사용 가능한 메서드는 많다. 검색, 변경에 다른 스트링과의 비교도 가능하다. 다른 불변의 스트링 클래스보다 비용이 높다. ==연산을 사용해서 비교할 수 있다. 함수 Contains() 서브 스트링을 찾은 경우 true, 아니면 false를 반환한다. 검색 대상은 FString 거나 TCHAR* 의 서브스트링이다. 검색 기본 값은 처음부터 시작과 대소문자 무시이다. SearchCase를 사용해서 검색 시 대소문자를 무시할 것인지를 지정할 수 있다. ESearchDir을 사용해서 검색 ..

C++를 언어들의 연합체로 바라보는 안목

초창기의 C++ C언어에 객체 지향 기능 몇 가지가 결합된 형태 오늘날의 C++ 다중패러다임 프로그래밍 언어 절차적 프로그래밍을 기본으로 한다. 객체지향 프로그래밍 함수식 프로그래밍 일반화 프로그래밍 메타 프로그래밍 C++를 단일 언어로 바라보는 눈을 넓혀 상관 관계가 있는 여러 언어들의 연합체로 본다. C++의 하위 언어 C C++는 C를 기본으로 한다. 블록, 문장, 선행 처리자, 기본제공 데이터타입, 배열, 포인터 객체 지향 개념의 C++ 클래스를 쓰는 C 클래스, 캡슐화, 상속, 다형성, 가상 함수(동적 바인딩) 템플릿 C++ C++의 일반화 프로그래밍 부분 새로운 프로그래밍 패러다임인 템플릿 메타프로그래밍이 파생 STL 템플릿 라이브러리 컨테이너, 반복자, 알고리즘, 함수 객체

백준 17779. 게리맨더링 2

17779. 게리맨더링 2 주어진 조건대로 구현하면된다. 마름모로 선거구를 나타내는것이 다소 까다로웠던것 같다. 마름모를 나눌때 brute force 방식으로 나눠도 정답이 나왔다. 풀이 과정 마름모로 선거구를 나눈다. 마름모 끝점 4개를 저장해서 끝점을 활용하여 나머지 구역 4개도 구한다. 구역을 나눈것을 기존의 입력으로 받은 map과 매핑하여 각 선거구의 총 인원수를 구한다. 최대 최소의 차이를 구하고 그것이 최소인 경우를 저장한다. ※ 구역을 나눌때 5번 구역은 마름모를 이루는 변을 5로 저장해 두고 내부는 1로 저장해두었다. ※ 나머지 1~4번 구역을 정해주면 0으로 남은건 알아서 5번구역으로 처리해줄수 있을거라 생각하였기 때문이다. 소스코드 #include #include using namesp..

복사 생성자

복사 생성자란? 멤버 대 멤버 복사를 실행한다. 복사 생성자를 정의하지 않으면 멤버 대 멤버의 복사를 진행하는 디폴트 복사 생성자가 자동으로 삽입된다. class Point { private: int x; int y; public: Point(int x, int y) : x(x), y(y) { } // 디폴트 생성자 Point(const Point &copy) : x(copy.x), y(copy.y){ } // 디폴트 복사 생성자 }; 깊은 복사와 얕은 복사 얕은 복사 멤버변수의 멤버 대 멤버 복사만 실행한다. Person man1("Kang", 29); Person man2 = man1; 깊은 복사 메모리 공간 할당 후 문자열 복사 할당된 메모리의 주소 값을 멤버에 저장한다. Person(const P..

생성자, 소멸자, 이니셜라이저, this

생성자와 소멸자 생성자 클래스의 이름과 동일 반환형이 선언되어 있지 않으며 반환하지 않는다. 객체 생성 시 한 번 호출된다. 생성자도 오버로딩이 가능하다. 생성자도 디폴트 값을 설정할 수 있다.class Point { private: int xpos; int ypos; public: // 생성자 Point(int x, int y) { xpos=x; ypos=y; } }; 디폴트 생성자 객체가 되기 위해서는 반드시 하나의 생성자가 호출되어야 한다. 생성자를 정의하지 않는 클래스에는 C++ 컴파일러에 의해서 디폴트 생성자라는 것이 자동으로 삽입된다. 이미 선언한 생성자가 있다면 디폴트 생성자는 삽입되지 않는다. class A { private: int num; public: AAA(){} // 디폴트 생성자..

캡슐화와 const 함수

정보 은닉 멤버변수를 private으로 선언하고 해당 변수에 접근하는 함수를 별도로 정의하여 안전한 형태로 멤버변수의 접근을 유도하는 것이다. 클래스 외부에서의 멤버변수 접근을 목적으로 정의되는 함수들을 엑세스 함수(access function)라 한다. 제한된 방법으로의 접근만 허용을 해서 잘못된 값이 저장되지 않도록 도와야 하고 실수를 했을 때 발견되도록 한다. class Point { private: int xpos; int ypos; public: // 엑세스 함수 int GetXpos() const { return xpos; } void SetXpos(int x) { xpos=x; } int GetYpos() const { return ypos; } void SetYpos(int y) { ypo..