타입 변환 (포인터, 연관 없음) #include using namespace std; class Knight { public: int _hp = 10; }; class Item { public: Item() { cout
C++
malloc을 사용할 때 void*을 반환하고, 이를 우리가 타입 변환을 통해 사용했었다. 타입 변환 유형(비트열 재구성 여부) [1] 값 타입 변환 의미를 유지하기 위해서, 원본 객체와 다른 비트열을 재구성하는 것 int a = 123456789;// 2의보수 float b =(float)a;// 부동소수점(지수 + 유효숫자) 둘의 메모리를 확인해보면 둘이 아예 다르다는 것을 확인 할 수 있다. int를 float를 변환한것을 보면 데이터의 값은 얼추 비슷하지만(정수를 실수로 바꾸다보면 누락될 수 있음) 둘의 비트 저장 방식이 다르다 보니 비트열을 아예 바꿔 재구성한 것이다. [2] 참조 타입 변환 비트열을 재구성하지 않고, 비트를 분석하는 관점만 바꾸는 것이다. int a = 123456789;// ..
메모리 구조 우리가 C++을 다루면서 메모리 영역에 대해 많이 다뤄봤다. 특히 데이터 영역과 스택 영역에 대해 정말 많이 그리고 중요하게 다뤘다. 실행할 코드가 저장되는 영역이 코드 영역이고 전역(global)/정적(static) 변수가 데이터 영역에 할당된다. 또 지역변수/ 매개변수는 스택 영역에 할당된다. 그렇다면 마지막 힙 영역은 누가 차지 하느냐 바로 동적 할당한 데이터가 힙 영역을 차지한다. 예를 들어보자. MMOPRG는 동접자가 1명~5만명 정도 되고, 몬스터는 1마리~500만 마리 있을 것이다. 지금까지 배운 내용으로 이걸 구현하기 위해선 몬스터 배열을 500만을 잡아야한다. Moster monster[500 * 10000];을 할것이다. 다만 이렇게하면 스택 오버플로우가 날것이다. 즉 메모..
연산자 오버로딩 만약 플레이어의 위치를 저장하는 Position class가 있다고 해보자. #include using namespace std; class Position { public: public: int _x; int _y; }; int main() { Position pos1; pos1._x = 1; pos1._y = 1; Position pos2; pos2._x = 2; pos2._y = 2; Position pos3 = pos1 + pos2; return 0; } 그래서 플레이어가 pos1에 있다가 pos2 만큼 이동해서 pos3의 위치로 이동하고 싶은데 지금 같은 상황에선 에러가 나는 모습을 볼 수 있다. 이를 해결하기 위해 연산자를 마음대로 커스터 마이징 하는 연산자 오버로딩을 할것이다..
은닉성 지난 포스팅에서 객체 지향의 3대장중 상속성에 대해 알아 봤다. 이번 포스팅에서는 은닉성 다형성 등에 대해 알아보자. 은닉성이란 캡슐화라는 단어로 많이 쓴다. Data Hiding으로 몰라도 되는 것은 깔끔하게 숨기겠다. 라는 의미이다 왜 숨길까?? 정말 위험하고 건드리면 안되는 경우와 다른 경로로 접근하길 원하는 경우에 사용한다. 자동차를 설계한다고 해보자. 핸들 페달 엔진 문 각종 전기선 등등 개발자 입장에선 위를 고려해야한다. 하지만 일반 구매자 입장에서 사용하는 것은 핸들 페달 문 이정도이다. 나머지 엔진이나 각종 전기선은 오히려 건드리면 큰일이 나곤한다. #include using namespace std; class Car { public: void MoveHandle() {} void..
객체 지향 우리가 이전 포스팅부터 지금까지 했던 방식은 절차(procedural) 지향 프로그래밍이다. procedural은 함수이다. 함수 흐름으로 프로그램이 동작하는 방식이 절차 지향 프로그래밍이다. C++은 객체 지향 언어인가?? 완전히 객체 지향 언어라고 보긴 어렵다.(C#이나 JAVA에 비해) 객체 지향의 주인공은 객체이다. 객체란? 플레이어, 몬스터, GameRoom 등 특정 오브젝트를 말한다고 보면 된다. 객체 지향에서는 데이터를 가공하는데 있어 객체를 기준으로 코드를 작성하는 것이다. Knight를 설계해보자. 속성(데이터) : hp, attack, y, x... 기능(동작) : Move, Attack, Die... 이러한 것들을 가지려면 설계도가 필요하다. 바로 Class 이다. #inc..
다중 포인터 포인터를 통해서 우리는 어떤 데이터의 원본을 수정하거나 가져올 수 있었다. 하지만 모든 경우에 그런것은 아니다. 만약 다음과 같은 코드가 있다고 해보자. #include using namespace std; void SetMessage(const char* a) { a = "Bye"; } int main() { const char* msg = "Hello"; SetMessage(msg); cout
배열의 필요성 만약 우리가 어떤 구조체 StatInfo 가 있다고 해보자. 우리가 몬스터를 100개, 1000개, 100000개 등등 심지어 갯수가 정해지지 않는 경우 우리는 그것을 하나하나 코드를 늘려가지 않을 것이다. 같은 타입끼리 묶어서 하나의 데이터 처럼 이용하는 것이 배열이다. Type 이름[개수]; 로 선언해 사용이 가능하다. #include using namespace std; struct StatInfo { int hp = 0xAAAAAAAA; int attack = 0xBBBBBBBB; int defense = 0xCCCCCCCC; }; int main() { StatInfo monsters[10]; return 0; } 여태껏 변수들의 [이름은] 바구니의 이름이었다. 하지만 배열의 [이..
참조 전달 C언어에는 존재하지 않는 C++에 추가된 키워드이다. 포인터랑 느낌이 매우 비슷하다. 선언 방식은 다음과 같다. int& ref = number; 초기 값이 반드시 필요하다. C++ 관점에서는 number라는 바구니에 또 다른 이름을 부여한 것. number 라는 바구니에 ref 라는 다른 이름을 지어주는 것이다 앞으로 ref 바구니에다가 뭘 꺼내거나 넣으면, 실제 number 바구니(진퉁) 그 값을 꺼내거나 넣으면 됨. 포인터랑 참조랑 100% 기능적으로 동일하다. 그렇다면 왜 참조를 사용하는 것인가? 값 전달처럼 편리하게 사용하고 주소 전달 처럼 주소 값을 이용해 진짜 데이터를 건드릴 수 있는 두개의 장점을 다 합쳐놓은 키워드 인것이다. 물론 장점만 있는 것은 아니다. #include us..
오늘 나눠볼 얘기는 C++에서 가장 악랄하고 많은 사람들을 괴롭게 만든 포인터에 대해 알아볼 것이다. 포인터 기초 1 포인터는 많은 프로그래머들이 위기를 느끼는 구간이다. 그러나 원리를 알고 이해하면 충분히 쉬운 개념이다. 그렇기 위해서는 거꾸로 생각할 필요가 있다. 포인터는 왜 필요한가?? 지금까지 우리가 코딩을 한 방식을 생각해보자. int number = 1; 라는 문장에서 number라는 이름의 4바이트 정수 타입의 바구니를 만든거이고, 이는 스택 메모리에 할당한다. 라는걸 의미한다. 따라서 스택 메모리에 있는 특정 주소(number 바구니)에 우리가 원하는 값을 넣은 셈이다. number는 오직 메모리에 이름을 우리가 붙인 것이다.(컴파일러가 찰떡같이 알아들어서) 이러한 방식은 나쁘지 않고 편리..