일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
29 | 30 | 31 |
- UML관련
- C++
- 애셋로드
- 람다
- 알고리즘
- BFS
- 강참조
- 스마트포인터
- dataasset
- 자료구조
- UE_LOG
- C++최적화
- 데이터애셋
- 정렬알고리즘
- UELOG
- 크리티컬섹션
- 프로그래머스
- 정렬
- 언리얼엔진구조체
- unorder_map
- enumasByue
- UE4 커스텀로그
- moreeffectiveC++
- stl
- 람다사용정렬
- map
- 델리게이트
- 언리얼가비지컬렉터
- 약참조
- 선택정렬
- Today
- Total
목록Note (423)
기억을 위한 기록들
어릴 때부터 게임 개발자가 되고 싶었는데,몇 년 전 대학교를 다니면서 점점 어떻게 진로를 잡아야 할까, 정보를 찾아보며 고민하던 중 유튜브 포프채널을 알게 되었다. 김포프라는 이름으로 사용하시면서 해외 유명 게임사에서 게임 프로그래머로 지내셨었고, 관련 얘기 올리신 걸 봤고 그 외에도 그냥 인생 얘기, 회사 경험 등 다방면으로 재미있게 들었었다. www.youtube.com/watch?v=iyELYDohb1M 20살쯤에 처음 봤던 영상 같다. 그 뒤로 C언어... 자료구조 알고리즘.. 언리얼 엔진 유니티 엔진 등을 공부해오면서 간간히 뜨는 영상들을 봤었다. 그리고 시간이 지나게 되고, 그리고 최근 1~2년 전에 김포프님이 직접 강의를 하신다는 포큐아카데미라는걸 개설하신다고 하셔서 관심은 있었지만, 그 당..
타입 변환이 모든 매개변수에 대해 적용되어야 한다면, 비멤버 함수를 선언하자. 예를 들어 유리수를 나타내는 클래스를 만들고 있다면, 정수에서 유리수로의 암시적 변환을 허용을 판단해도 크게 어이없거나 하진 않을 것이다. C++에서 제공하는 int -> double 변환과 별반 다르지 않다. 유리수를 나타내는 클래스를 하나 보자. class Rational { public: Rational(int num = 0, int denom = 1); //num=분자 / denom=분모 const Rational operator*(const Rational& rhs) const; int GetNum() const; int GetDenom() const; private: //... }; 유리수를 나타내는 클래스이니, o..
어떤 캐릭터 클래스를 만들다가 캐릭터가 죽어서 다시 처음부터 진행되기 위해 상태를 초기화해주는 함수들이 있다고 가정합시다. class Character { public: //.. void SetMaxHP(); //최대체력 만들어주기 void ClearStat(); //능력치 초기화 void ClearInventory(); //인벤토리 비우기..등 //.. }; 이렇게 3개면 기획상의 추가로 점점 많이지게 되면, 한 번에 호출하고 싶게 된다. class Character { public: //.. void SetMaxHP(); void ClearStat(); void ClearInventory(); //.. void ClearEverything() //한번에 호출해주는 함수 추가 { SetMaxHP(); ..
그렇게 생각해야하는 이유 2가지 첫 번째 이유 문법적 일관성이다. 데이터 멤버가 public이 아니라면, 사용자 쪽에서 어떤 객체를 접근할 수 있는 유일한 방법은 멤버 함수일 것이다. 그러면 괄호를 붙어야 하는지 말아야 하는지 고민할 필요가 없어진다.(무조건 괄호) Vector a; a.DoSomething(); //괄호를 붙어야할지 말아야할지 고민할 필요가 없을 것이다. 그리고 멤버변수가 public이면 읽기뿐만 아니라 쓰기 권한을 통제하기 애매해진다. getter/setter 등으로 확실히 하는 게 좋다. 두 번째 이유 캡슐화이다. 함수를 통해서만 데이터 멤버에 접근할 수 있도록 구현해두면, 데이터 멤버를 계산식으로 대체가 가능할 수도 있다. 상황 예) 예를 들면 여러 캐릭터를 조종 할 수 있는 게임..
assert는 확고히 하다/주장하다 등의 뜻으로 디버깅 모드에서 개발자가 프로그램을 개발하면서 생기는 오류를 잡아주기 위한 용도로 에러 검출용 함수이다. 예를 보면 #include #include using namespace std; int main() { int a = 5; assert(a == 5); //5면 통과 cout
c++를 그래도 나름 공부했다고 생각하고, 이펙티브 c++를 보며 공부하다가 그 사이에서도 이전에 간과하거나, 애매하게 아는 부분들을 다시 공부해보고 싶어서 추천받아 산 책이다. 이책하고 이펙티브C++책하고 같이 볼것같다. 참고한 책 : www.yes24.com/Product/Goods/16362643?OzSrank=1 Fundamental C++ 프로그래밍 원리 이 책은 C++ 프로그래밍의 문법과 사용 방법보다는 C++ 그 자체에 초점을 두었다. 즉, C++ 프로그래밍이 어떤 구조와 원리에 의해서 이루어지는지를 집중적으로 설명하는데 주안점을 두었다. 따라 www.yes24.com 해당 책을 보며 간단하게 요약하며, 디테일한 부분은 제외하였습니다.
hyo-ue4study.tistory.com/345 [CPP-effective] 4-4 함수에서 객체를 반환해야 할 경우에 참조자를 반환하려 하지말자. 이전에 작성한 글을 쓰고, 기존의 코드에 멀쩡하게 들어 있는 '값에 의한 전달' 부분을 '참조에 의한 전달'로 무작정 바꾸려고 하면 안 된다. 실제로 있지도 않은 객체의 참조자를 넘길 수도 있기 hyo-ue4study.tistory.com 이펙티브 c++를 작성하다가 등장하여 관련하여 찾아보았다. * 틀린 부분이 있을 수도 있습니다. 예제 클래스로 살펴보면 int num 멤버변수를 갖고 있는 클래스 T가 있다. class T { public: /*생성자*/ T(int a, string n) :num(a) , name(n) { cout
이전에 작성한 글을 쓰고, 기존의 코드에 멀쩡하게 들어 있는 '값에 의한 전달' 부분을 '참조에 의한 전달'로 무작정 바꾸려고 하면 안 된다. 실제로 있지도 않은 객체의 참조자를 넘길 수도 있기 때문이다. 예를 들어, 어떤 유리수를 나타내는 클래스가 있다고 치자. class Rational{ pulbic: Rational(int num = 0, int denominator = 1); //... private: int n, d; friend const Rational operator*(const Rational* lhs, const Rational* rhs); }; 해당 클래스의 operator*는 곱셉 결과를 값으로 반환하도록 되어있다. 값이 아닌 참조자를 반환할 수 있으면 비용 부담은 확실히 없을 것이..
C++에서 함수로부터 객체를 전달받거나, 함수에 객체를 전달할 때 '값에 의한 전달(Pass By Value)' 방식을 사용한다. 실제 인자의 '사본'을 통해 초기화되며, 어떤 함수를 호출한 쪽은 그 함수가 반환한 값의 '사본'을 돌려받는다. 사본을 만들어내는 원천이 바로 복사 생성자이다. 이 점 때문에 '값에 의한 전달'이 고비용의 연산이 된다. 어떤 클래스 A와 A를 상속받는 클래스 B 두 개가 있다고 할 때, 어떤 함수를 호출하려고 한다. B myB; bool DoSomething(B ref); B 클래스를 값으로 전달받는 함수가 있으면, myB를 매개변수 ref로 초기화시키기 위해 복사 생성자가 호출된다. 게다가 ref는 DoSomething함수가 끝나면서 소멸된다. 이렇게 되면 총 B클래스의 복..
C++에서 새로운 클래스를 정의한다는 것은 새로운 타입 하나를 정의하는 것과 같다. 단순히 클래스 설계를 하는것이 아니라 타입 설계를 한다고 생각하니 더 대단한 것 같다(?). 함수와 연산자를 오버로드하고, 메모리 할당 및 해제를 제어하며, 객체 초기화 및 종료 처리를 정의하는 작업 등 신경 써야 할게 많아지기도 한다는 것이다. 좋은 클래스를 설계한다는 것은 좋은 타입을 설계하는 것이기도 한데, 마냥 쉽기만 하지는 않을 것이다. 1. 문법(syntax)이 자연스럽고, 2. 의미구조(sematics)가 직관적이며, 3. 효율적인 구현이 한 가지 이상 해야 하는데, 고민 없이 클래스 정의를 했다가는 이 중 한가지도 못할 수도 있다. 심지어 멤버 함수조차도 어떻게 선언되었느냐에 따라 수행성능이 달라진다. 고려..
www.acmicpc.net/problem/1946 1946번: 신입 사원 첫째 줄에는 테스트 케이스의 개수 T(1 ≤ T ≤ 20)가 주어진다. 각 테스트 케이스의 첫째 줄에 지원자의 숫자 N(1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N개 줄에는 각각의 지원자의 서류심사 성 www.acmicpc.net #include #include #include using namespace std; int main() { int total = 0; cin >> total; for (int k = 0; k > n; vector t(n); for (int i = 0; i > t[i].first >> t[i].second; }..
인터페이스는 만리장성을 쌓는 접선 수단입니다. 이상적으로 어떤 인터페이스를 어떻게 써 봤는데 결과 코드가 사용자가 생각한 대로 동작하지 않는다면 그 코드는 컴파일되지 않아야 되는 게 맞다. 반대로 어떤 코드가 컴파일이 되면 사용자가 원하는 대로 동작해야 하는 것이다. '제대로 쓰기엔 쉽고 엉터리로 쓰기에 어려운' 인터페이스를 개발하려면 우선 사용자가 저지를만한 실수의 종류를 미리 생각해봐야 한다. 예를 들어 날짜를 나타내는 어떤 클래스에 넣을 생성자를 설계하고 있다고 가정하자. class Date{ public: Date(int month, int day, int year); //... }; 별 문제가 없을 것 같지만, 매개변수의 순서가 잘못될 여지가 있다. Date d1(21, 4, 2021); //월..