개요 C++에 추가된 스마트 포인터들의 종류와 사용법에 대해 알아보자. C++11 부터 추가되기 시작했으며 버전이 올라가면서 점차 자리를 잡아가고있다. 그래서 종종 사용하고는 있었지만 한번쯤 정확히 짚고넘어가야될 필요성을 느꼈다. 특히 언리얼 엔진은 C++을 사용하기는 하지만 자체 라이브러리를 많이 사용하기 때문에 순수하게 C++만 사용하기에는 부적절한 부분이 있다. 예를들어 객체를 생성할 때 new 연산을 사용하지 않고 자체적인 객체생성 문법을 사용하며, C++에서 지원하지않는 어노테이션 등도 있다. 스마트포인터도 그 중 하나인데 엔진 라이브러리에 비슷한 기능을 하는 스마트포인터 템플릿이 있고, 그 템플릿을 잘 이해하려면 기본적으로 C++의 스마트포인터를 먼저 이해해야 한다는 생각이다. C++에서 스마..
개요C++타입의 형변환에 대해 알아보자 static castC 타입 캐스팅과 거의 모든면에서 동일하다. 컴파일 타임에 형변환을 감지하고 불가능하다고 판단되면 컴파일 에러를 발생시킨다. 따라서 클래스의 선언이 아래와 같을 때 주석으로 나눈 두 코드는 같은 동작을 한다. int main() { //~ Begin C Type casting char CTypeChar = 'a'; int CTypeInt = CTypeChar; //~ End C Type casting //~ Begin C++ Type casting char CppTypeChar = 'a'; int CppTypeInt = static_cast(CppTypeChar); //~ End C++ Type casting return 0;} 다만 C 타입 캐..
개요클래스들을 작성할 때 맺을 수 있는 관계에 대해 알아보자.이는 기법은 아니고 관계에 대한 용어를 배우는 것으로 모른다고 하더라도 코드를 작성할 수는 있지만 용어를 많이 알아두면 다른 개발자들과 소통하기 좋다. IS A클래스를 상속할 때 맺어지는 관계이다. 일반적인 상속 구조에서 부모클래스와 자식클래스의 관계를 is a 관계라고 한다. is a 관계인 클래스는 자식 클래스가 가지고 있는 멤버를 무조건 부모 클래스가 가지고 있기 때문에 묵시적인 업캐스팅이 가능하다. class Parent { public: int a; }; class Child : public Parent { public: int b; }; void main() { Child* child = new Child(); Parent* pare..
개요메모리 생성시 주의해야 할 점에 이어서 해제시 주의해야 할 점에 대해서도 알아보자. 생성시 주의해야 할 점해제는 실제로 해제를 할 때도 주의해야 하지만 해제를 하지 않고 함수를 종료하면 메모리 누수가 발생하므로 이 점도 주의해야 한다. 해제해제는 delete 연산자를 사용한다. delete는 해당 메모리를 해제하고 다음번 new 등에 사용할 수 있도록 해준다. 하지만 delete를 잘못 사용하면 버그가 발생할 수 있으므로 주의해야 한다. 컴파일러가 판단할 수 있는 경우 컴파일 에러가 발생하기 때문에 코드 작성 중에 확인할 수 있지만 런타임 에러를 발생시키는 경우는 치명적이다. 이미 해제된 메모리를 다시 해제할 경우void main() { ClassA *a = new ClassA(); delete a;..
개요C++은 최근 나오는 언어들과 다르게 메모리를 직접 관리하는 언어이다. 따라서 동적으로 메모리를 할당하거나 해제할 때 주의하지 않으면 메모리 누수가 발생하거나 프로그램이 동작 중에 죽어버리는 현상 등을 보게된다.메모리를 생성하거나 해제할 때 할 수 있는 실수 들을 알아보고 이 때 발생하는 오류 및 예외처리에 대해 알아보자. 생성메모리를 동적으로 할당하는 것으로 표적으로 new 연산자가 있다. malloc() calloc 등도 있지만 C++언어로 한정하여 설명하기 위해 new만 언급하도록 하겠다.기본적으로 new를 실패하는 경우는 어플리케이션이 더이상 메모리를 동적으로 할당할 수 없는 경우가 있다. 이 때 옛날 C++의 경우 NULL을 반환하도록 구현되어있어서 프로그래머가 NULL 체크를 통해 생성에 ..
개요리소스를 로딩한다거나 어떤 연산을 수행하기 위해 thread를 만들어서 동작시킬 수 있다. 하지만 thread가 언제 끝날지 보장할 수 없기 때문에 이것에 대해 방어적인 코딩이 필요하다. 예를 들어 리소스를 thread로 로딩하고 로딩이 완료될 때 마다 해당 인스턴스로 callback을 하여 리소스 로딩이 완료되었음을 알려주는 구현이라고 가정하자.이 인스턴스는 자신이 요청한 thread가 완료될 때 까지 삭제하면 안되지만 thread가 언제 끝날지 보장할 수 없기 때문에 thread가 언제 끝나더라도 동작하도록 구현할 필요가 있다. c++에 추가된 shared pointer를 사용하여 이를 구현해 보자. unsafe callback with raw pointer기존 pointer를 사용해서 구현할 경..
개요 C++ 11에 추가된 bind라는 것을 알아보자. bind는 C++이 함수형 프로그래밍을 할 수 있도록 도와주는 기능으로, 함수를 변수처럼 사용하거나 함수의 특정 파라미터를 고정시킨 새로운 함수를 생성할 수도 있게 해준다. std::bind 일단 기본적인 bind 방법은 다음과 같다. #include #include int Calc(int a, int b, int c) { return (a + b) * c; } int main(int argc, char* argv[]) { auto bindedCalc = std::bind(Calc, 3, 4, 5); std::cout
개요패킷을 보낼 때는 해당 패킷의 내용과 관계없이 send함수를 호출해서 패킷을 보내기만 하면 된다. 하지만 패킷을 받을 때는 상황이 좀 다르다. 받은 패킷이 어떤 패킷이냐에 따라 호출할 함수 또는 수행할 연산 등이 달라지므로, 그 때 그 때 적절한 동작을 수행할 수 있도록 만들어 주어야 한다.고민을 하던 중 cocos2d-x 엔진의 KeyboardListener가 생각이 났다. KeyboardListener는 내 class의 instance를 등록시켜 놓으면 내 class에 있는 KeyboardListener함수로 callback이 되도록 구성되어있다.덕분에 key event들을 한곳에서 처리하지 않고 필요한 객체에서 따로 처리할 수 있다.SocketListener를 구현해 보자.수신받은 패킷에서 꼭 ..
- Total
- Today
- Yesterday
- swift
- DesignPattern
- mongoDB
- 국내여행
- ue4
- machine learing
- database
- winsock
- 데이터베이스
- Java
- SHADER
- 수학
- C++
- Git
- 운영체제
- JSP
- Cocos2d-x
- OS
- SwiftUI
- C/C++
- Spring
- game
- SOCKET
- 드라마
- 자료구조
- scala
- C
- 알고리즘
- rxswift
- ios
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |