프로그래밍 74

#53. 클래스 템플릿

* 클래스 템플릿 template class RandomBox { public: T GetRandomData() { int idx = rand() % 10; return _data[idx]; } public: T _data[10]; }; *무조건 typename 을 붙여야 하는 것은 아니다. template class RandomBox { public: T GetRandomData() { int idx = rand() % SIZE; return _data[idx]; } public: T _data[SIZE]; }; RandomBox rb1; RandomBox rb2; rb1 = rb2 => ( X ) => rb1 / rb2 는 각각 독립적인 객체이다. *100% 일치해야지만 가능. RandomBox rb..

프로그래밍/C++ 2022.07.20

#52. 함수 템플릿

* 템플릿 : 함수나 클래스를 찍어내는 툴 1. 함수 템플릿 2. 클래스 템플릿 *함수 템플릿 void Print(int a) { cout 로 타입을 지정 가능. template T Add(T A, T B) { return A + B; } template T3 Add(T1 A, T2 B) { return A + B; } => int result = Add(10.5, 1.0f); int result = Add(10.5, 1.0f); => ( ERROR ) => 타입 지정해줘야함. *템플릿 특수화 => 특정 매개변수를 별도로 처리하고 싶을 때 사용. template void Print(T a) { cout

프로그래밍/C++ 2022.07.20

#51. 함수 객체

*using & typedef 을 이용한 함수포인터 사용 단점 void (*PF)(void); PF = &HelloWorld; 1. 시그니처가 안 맞으면 사용할 수 없다. 2. 상태를 가질 수 없음. => ex) Knight._hp 값이 없음. *함수 객체 ( Functor ) => 함수처럼 동작하는 객체 => ( ) 연산자 오버로딩 을 이용해 동작 함수를 정의. *MMO 에서 함수 객체를 사용하는 예시 클라 서버 => 서버 : 클라가 보내준 네트워크 패킷을 받아서 처리. ex) 클라 : 나 (5, 0) 좌표로 이동 요청. => 요청사항을 객체로 만들어줌. 즉, 요청사항을 만들어주는 시점 / 그것을 실제 실행하는 시점을 분리 가능. class MoveTask { public: MoveTask(int Y,..

프로그래밍/C++ 2022.07.20

#50. 함수 포인터

*함수포인터 선언 typedef int (*FUNC_TYPE)(int, int); using FUNC_TYPE = int(*)(int, int); FUNC_TYPE fn = Add; FUNC_TYPE fn = &Add; cout 옛날 방식 using FUNC_TYPE = int(int, int); => Morden C++ FUNC_TYPE* fn = Add; FUNC_TYPE* fn = &Add; cout _rarity > 10); } *단점은 '함수 시그니처' 를 맞춰야한다는 점. 유동적이진 못하다. *typedef 의 진실 => int 는 NUMBER 이다. typedef int NUMBER; => 변수가 복잡해지면 단순해지지 않음. => 왼쪽 오른쪽 이라고 생각하지말고 [선언 문법] 에서 typed..

프로그래밍/C++ 2022.07.20

#49. 전방 선언

해당 객체가 존재한다는 표시 용도 보통 해당 객체 내에 객체를 사용 시 포인터로 주소를 받게 되는데 이 때 사용 @해당 객체는 몇 바이트인가 ?? 헤더 추가가 필요 없다! why ?? Monster 가 어떤 데이터를 가지고 있는지 몰라도 Player 에서는 Monster* 를 저장하기 때문에 임시적으로 class Monster 를 적어두는 표시해두고 포인터 (주소받는곳,4/8바이트 고정크기 ) 를 선언해 Monster 객체의 주소를 받는다. 결국, 불필요한 헤더파일 추가를 피할 수 있다. class Monster; class Player { public: int _hp = 0; int _attack = 10; Monster* m1; }; 본 내용은 인프런의 루키스님 강의를 듣고 정리한 내용입니다. 강의 ..

프로그래밍/C++ 2022.07.20

#48. C++ 캐스팅

https://docs.microsoft.com/ko-kr/cpp/cpp/static-cast-operator?view=msvc-170 *static_cast => 문법적으로 가능하다면 형변환을 가능하게 해줌. => 타입 원칙에 비춰볼 때 상식적인 캐스팅만 허용. => 런타임 검사가 이루어지지 않음. 1. int -> float 2. Player* -> Knight* ( 다운캐스팅 ) 가능. => '안정성' 은 보장 못함 Player* p1 = new Player(); Knight* k1 = static_cast(p1); 결국, 컴파일 타임에 형변환에 대한 오류를 잡아줌. https://docs.microsoft.com/ko-kr/cpp/cpp/dynamic-cast-operator?view=msvc-1..

프로그래밍/C++ 2022.07.20

#47. 깊은 복사 & 얕은 복사

*얕은 복사 ( 컴파일러가 재정의되지 않아도 자동으로 생성 ) => 데이터를 단지 복사. => 멤버 데이터를 비트열 단위로 '똑같이' 복사 ( 메모리 영역 값을 그대로 복사 ) *깊은 복사 ( 객체 내 멤버변수로 포인터 & 참조 가 존재할 때 ) 복사생성자 / 복사 대입연산자 재정의 => 클래스 내의 포인터가 존재하고 그 포인터에 생성하는 클래스마다 각기 다른 주소를 담아야한다면 명시적 복사 생성자 / 복사 대입연산자를 정의해야 한다. *해당 클래스에 다른 클래스를 단지 선언만 해준다면 어떤 문제가 있나 ?? 1. 선언된 클래스가 크기가 크다면 해당 클래스도 비대해짐. 2. 해당 클래스가 소멸될 때 선언된 클래스도 같이 사라짐 => 생성/삭제 시점을 관리할 수 없음. => 생명주기 관리가 어려워짐. 3...

프로그래밍/C++ 2022.07.20

#46. 타입변환

@타입 변환 유형 ( 비트열 재구성 여부 ) 1. 값 타입 변환 => 의미를 유지하기 위해서, 원본 객체와 다른 비트열 재구성 int a = 0x12345678; //@2의 보수 float b = (float)a; //@부동소수점 cout 비트열을 재구성하지 않고, '관점' 만 바꾸는 것 => 거의 쓸일은 없지만, 포인터 타입 변환도 '참조 타입 변환' 과 동일한 룰 int a = 12345678; // @2의 보수 float b = (float&)a; // @부동소수점 cout short , int -> double .... 2. 불안전한 변환 => 의미가 항상 100 % 라고 보장 못함. => 타입이 다르거나, 큰 바구니 -> 작은 바구니 이동. @프로그래머 의도에 따라 분류 1. 암시적 변환 => ..

프로그래밍/C++ 2022.07.20

#45. 동적할당

*실행할 코드가 저장되는 영역 => 코드 영역 *전역 / 정적 변수 => 데이터 영역 => 프로그램이 종료될 때까지 '무조건' 사용되는 영역 *지역 변수 / 매개 변수 => 스택 영역 => 함수가 끝나면 같이 정리되는 불안정한 메모리 *동적할당 => 힙 영역 => 왜 사용해야할까 ?? => 스택 으론 엄청난 데이터를 생성할 수 없다. => 데이터영역으론 아쉽다. Player player[ 500 * 1000000 ]; 만약 접속자가 1000명이면 ?? , 나머지 데이터는 낭비. => 항상 최대 상한선으로 메모리를 잡아야한다는 것이 문제 => 필요할 때만 사용하고, 필요없으면 반납할 수 있는 우리가 생성 / 소멸 시점을 관리할 수 있는 영역 *유저 영역 메모장, LOL, 곰플레이어 .... @@@@@@@@..

프로그래밍/C++ 2022.07.20

#44. 연산자 오버로딩

*다시 정의할 수 있는 연산자 / 없는 연산자 https://docs.microsoft.com/ko-kr/cpp/cpp/operator-overloading?view=msvc-170 => operator*( ) 재정의 가능함. *연산자 vs 함수 => 연산자는 피연산자의 개수가 상관이 없다. b++; => ( 피연산자 1개 ) ++b; => ( 피연산자 1개 ) a + b => ( 피연산자 2개 ) *연산자 오버로딩 연산자 함수도 두 가지 방식으로 만들 수 있음. => 모든 연산자를 다 오버로딩 할 수 없음. *멤버 연산자 함수 version pos3 = pos1 + pos2 => pos1.operator+(pos2) a op b 형태에서, a => '기준 피연산자' 라고함. 한계 : a(왼쪽) 가 클래..

프로그래밍/C++ 2022.07.20