전체 글 118

static 멤버 함수가 static이 아닌 멤버 참조가 안되는 이유, static 멤버 함수에서 this를 사용할 수 없는 이유

this에 관해 몰랐거나 알아도 정확한 이유를 몰랐던 것들 1. 멤버 함수 내에 this가 묵시적으로 삽입된다 Class Go { int num; public: void SetNum(int a) { this->num = a; } }; 위와 같은 클래스가 있으면 컴파일러는 묵시적으로 Class Go { int num; public: void SetNum(Go* this, int a) { this->num = a; } } 이런식으로 this를 삽입한다 2. static 멤버 함수 내에서 this를 사용할 수 없는 이유 하지만 static 멤버 함수에 대해서는 this를 삽입하지 않아서 static 함수내에서 this를 사용할 수 없다. 왜 static 함수에 대해선 this를 삽입해주지 않는가? this는 ..

공부/C || C++ 2022.09.25

C++ 클래스 상속, 다중 상속, 가상 함수 그리고 다형성(Inheritance & virtual function & polymorphism)

C++ 클래스와 상속 그리고 큰 특징 중 한가지인 다형성에 대해 알아볼 것이다. 그전에 상속과 관계 없지만 조금 신기한 것을 알게 됐는데, 아래처럼 클래스를 정의해놓고 아무런 멤버 변수를 선언하지 않고 size를 확인하면 신기하게도 1이 나온다. class CTest1 { }; struct CTest2 { }; int main() { CTest1 test1; CTest2 test2; std::cout

공부/C || C++ 2022.09.25

static 변수와 전역 변수와 비교

static 변수 전역 변수 메모리 생성 시점 프로그램 시작 프로그램 시작과 동시에 생성 및 초기화 메모리 소멸 시점 프로그램 종료 프로그램 종료 디폴트 초기값 0으로 자동 초기화 0으로 자동 초기화 접근 가능 범위 - 정적 지역 변수 : 중괄호 내부에서만 접근 - 정적 전역 변수 : 선언된 소스 파일 내부에서만 접근 가능 프로그램 전체에서 접근 가능 메모리 할당 공간 초기값이 있을 경우 : Data 초기값이 없을 경우 : BSS 초기값이 있을 경우 : Data 초기값이 없을 경우: BSS 초기화 횟수 딱 한번만 초기화 클래스 멤버의 경우 클래스 내부에서 초기화가 불가능해서 외부에서 해줘야 한다 Ex) ClassA::Statc_변수_이름 = 0; static 변수와 전역 변수의 초기화 시점에 관한 내용은..

공부/C || C++ 2022.09.23

멀티바이트(Multibyte), 유니코드(Unicode), ANSI 그리고 ASCII

먼저 "유니코드와 멀티바이트를 비교하라" 는 질문을 받았고 간단하게 대답을 하려면 멀티 바이트는 문자를 다양한 바이트로 표현하는 인코딩 방식 유니코드는 세계 모든 문자를 2바이트 길이의 바이너리(=코드)와 매핑해놓은 코드표(=문자열 셋)이다(예를 들어 '가' 라는 문자를 U+AC00 이런식의 코드에 매핑) 이렇게 대답하면 좋을 것 같다. 앞서 유니코드와 멀티바이트를 비교 하려고 하는데 엄밀히 이야기하면 비교 대상이 잘못됐다. 명확한 비교는 WBCS과 MBCS(흔히 말하는 멀티바이트)를 비교해야한다(유니코드가 WBCS의 형태라서 이렇게 통상적으로 비교하는 듯 하다). 먼저 문자열 셋(Chracter Set)과 인코딩에 대한 이해가 필요하다. 문자와 바이너리를 매핑시켜주는 표를 문자열 셋(Character ..

공부/그 외 2022.09.23

3D OBB 충돌 코드 및 설명

분리축 이론 : 다면체 A, B에 대해서 어떤 축이 존재해서 그 축으로의 다면체들의 투영된 구간이 "하나라도" 서로 겹치지 않는다면 A, B는 서로 분리되어 있다는 이론 bool CCollision::CollisionBox3DToBox3D(CollisionResult& SrcResult, CollisionResult& DestResult, const Box3DInfo& boundingBox, const Box3DInfo& targetBox) { double c[3][3]; double absC[3][3]; double d[3]; double r0, r1, r; int i; const double cutoff = 0.999999; bool existsParallelPair = false; Vector3 d..

C++17 string_view

c++17에 string_view라는 기능이 추가되었다. 이 기능을 사용하면 좋은 점을 예시로 살펴보자 // 원래 사용하던 방식 std::string FiveCharacterOnlyString(const std::string& str) { if (str.size() < 5) return str; return str.substr(0, 5); } // c++ 17 string_view // string_view를 사용하면 string 객체의 복사가 발생하지 않습니다. std::string_view FiveCharacterOnlyStringView(const std::string_view str) { if (str.size() < 5) return str; return str.substr(0, 5); } in..

공부/C || C++ 2022.09.19

C++ vector::push_back vs vector::emplace_back

지난 게시글인 Rvalue reference관해서 공부하다가 우연히 보게 된 건데 C++에 container들을 자주 써왔다고 생각했는데 push_back과 emplace_back에 performance 차이가 있을 수 있다는 이야기는 처음 들어봤다. 사실 emplace_back은 거의 안써보고 매번 push_back만 쓰기도 했다. 겉보기에 두개의 메소드 간에 차이가 없어보이는데 왜 다른 이름으로 두개가 존재하는건지 진작에 의문점을 가져봤어야 했는데... push_back과 emplace_back의 가장 큰 차이점은 "emplace_back은 내부적으로 가변 인자 템플릿 형태의 생성자가 구현되어 있다는 점이다" 그래서 결과적으로 두 함수에 생기는 차이는 push_back은 내부적으로 생성자가 없어서 외..

공부/C || C++ 2022.09.18

그림자 매핑(Shadow Mapping)

여기서 소개할 그림자 매핑은 최근 사용되는 그림자 매핑 기법중에 가장 기본이되는 기법이다. 사실 이 기법을 기반으로 발전된 여러가지 고급 기법들이 다음과 같이 이미 나와있다. 캐스케이드 그림자 맵 : 그림자 매핑의 해상도 문제를 해결하기 위하여 영역별로 여러개의 그림자맵을 만드는 기법 퍼센티지 클로저 필터링 : 그림자의 외곽선을 부드럽게 필터링 해주는 기법 배리언스 그림자맵 : 하드웨어 텍스처 필터링이 가능하도록 깊이 값을 저장하는 방법 그림자가 생기는 원리 아래 그림 기준으로 1번 빛에서는 D앞에 가리는 물체가 없으므로 그림자가 생기지 않는다. 2번 빛은 B앞에 A라는 물체가 가리고 있으므로 2번 광선이 B의 표면에 만나는 지점에 그림자가 생길 것이다. C도 마찬가지로 A, B 물체에 가리니까 그림자가..

STL Container (시퀀스 컨테이너, 연관 컨테이너, 컨테이너 어댑터)

C++ 표준 라이브러리에는 많은 종류의 라이브러리가 존재한다. 예를 들어 입출력 라이브러리(iostream 등), 시간 관련 라이브러리(chrono) 등이 있다. 특히 C++ 템플릿 라이브러리(Standard Template Library)는 다음 세 개의 라이브러리들을 의미한다 임의 타입의 객체를 보관할 수 있는 컨테이너 라이브러리(container) 컨테이너에 보관된 원소에 접근할 수 있는 반복자(iterator) 반복자들을 가지고 일련의 작업을 수행하는 알고리즘 위에서 볼 수 있듯이, 컨테이너에 임의 타입의 객체를 보관할 수 있다고 한다. 임의 타입의 객체를 보관할 수 있는 이유는 템플릿으로 구현되어 있기 때문이다. 따라서 int, string 같은 기본적인 자료형이 아닌, 사용자가 직접 만든 클래..

공부/C || C++ 2022.09.17

자료구조 별 장단점(vector, list, queue, stack, map, hash map, tree)

vector list 장점 1. 일반 배열처럼 연속적인 메모리에 저장돼서 Index로 빠르게 접근 가능 2. 동적으로 메모리가 확장되는 기능 1. 어느 위치에서든 삽입/삭제가 빠름 단점 1. 중간 삽입/삭제가 느림 2. 확장이 필요할 때에 메모리 재할당과 복사로 비용 발생 -> Move Semantic으로 커버 가능 1. Index로 접근 불가능 stack queue 장점 1. LIFO 로 원소가 필요할 때 사용 가능 2. top에 위치한 원소에 빠르게 접근 가능 1. FIFO로 원소가 필요할 때 사용 가능 2. front에 위치한 원소에 빠르게 접근 가능 단점 1. 중간에 위치한 원소에 대해 접근 불가능 1. 중간에 위치한 원소에 대해 접근 불가능 hash_map tree 장점 1. Key값을 이용해서..