참조 전달 C언어에는 존재하지 않는 C++에 추가된 키워드이다. 포인터랑 느낌이 매우 비슷하다. 선언 방식은 다음과 같다. int& ref = number; 초기 값이 반드시 필요하다. C++ 관점에서는 number라는 바구니에 또 다른 이름을 부여한 것. number 라는 바구니에 ref 라는 다른 이름을 지어주는 것이다 앞으로 ref 바구니에다가 뭘 꺼내거나 넣으면, 실제 number 바구니(진퉁) 그 값을 꺼내거나 넣으면 됨. 포인터랑 참조랑 100% 기능적으로 동일하다. 그렇다면 왜 참조를 사용하는 것인가? 값 전달처럼 편리하게 사용하고 주소 전달 처럼 주소 값을 이용해 진짜 데이터를 건드릴 수 있는 두개의 장점을 다 합쳐놓은 키워드 인것이다. 물론 장점만 있는 것은 아니다. #include us..
C++/기초
오늘 나눠볼 얘기는 C++에서 가장 악랄하고 많은 사람들을 괴롭게 만든 포인터에 대해 알아볼 것이다. 포인터 기초 1 포인터는 많은 프로그래머들이 위기를 느끼는 구간이다. 그러나 원리를 알고 이해하면 충분히 쉬운 개념이다. 그렇기 위해서는 거꾸로 생각할 필요가 있다. 포인터는 왜 필요한가?? 지금까지 우리가 코딩을 한 방식을 생각해보자. int number = 1; 라는 문장에서 number라는 이름의 4바이트 정수 타입의 바구니를 만든거이고, 이는 스택 메모리에 할당한다. 라는걸 의미한다. 따라서 스택 메모리에 있는 특정 주소(number 바구니)에 우리가 원하는 값을 넣은 셈이다. number는 오직 메모리에 이름을 우리가 붙인 것이다.(컴파일러가 찰떡같이 알아들어서) 이러한 방식은 나쁘지 않고 편리..
함수 함수라는 이름은 여러 언어에서 다른 이름으로 불린다. 어셈블리에서는 프로시저, C#은 메소드, 루틴 등등으로 다양한 이름으로 불린다. 함수는 특정 코드의 묶음이다. 우리가 알고 있는 수학에서의 함수랑 동일하다고 볼 수 있다. 하지만 다른 점은 입력값이 없을 수도 있고 출력값이 없을 수도 있다. 함수를 만들 때는 input으로 무엇을 받고, ouput으로 무엇을 뱉을지 정해줘야한다 반환 타입 함수이름([인자타입 매개변수]) { 함수 내용 return ~~~; } 와 같은 형식을 가진다. 만약 hello world를 출력하는 함수를 만든다고 해보자. input : 없음 / output : 없음 타입 : void -> 반환값없음 #include using namespace std; void PirintH..
가위 바위 보 이전 포스팅에서 사용한 코드를 전부 다 이용해서 가위 바위 보 프로그램을 만들어보자. #include using namespace std; int main() { srand(time(0)); const int SCISSORS = 1; const int ROCK = 2; const int PAPER = 3; while (true) { int input; cout input; int computer = 1 + (rand() % 3); switch (input) { case SCISSORS: if (computer == SCISSORS) cout
분기문 데이터를 메모리에 할당하고 가공하는 방법에 대해 알아 봤다. 그런데 가공한 데이터를 이용해서 무언가를 하고 싶다면?? 어떤 방법을 써야할까?? 가령 예를 들어서 플레이어가 몬스터를 죽였을 때, 경험치를 획득하는 코드를 짠다고 해보자. #include using namespace std; // 데이터를 메모리에 할당하고 가공하는 방법에 대해 알아봄 // 가공한 데이터를 이용해서 무언가를 하고 싶다면?? int main() { #pragma region 분기문 int hp = 100;// 몬스터 Hp int damage = 100; // 플레이어 데미지 hp -= damage;// 피격 판정 bool isDead = hp
데이터 연산(산술 연산) 데이터를 가공하는 것이나 다름없다. 산술 연산자는 대입 연산과 사칙 연산 등이 있다. 대입 연산 int a = 0; int b = 1; a = b; a라는 이름의 바구니를 할당하고 안에 0을 넣는다. b라는 이름의 바구니를 할당하고 안에 1을 넣는다. a=b;는 a를 b에 대입하고 b를 반환하라는 의미이다. 이 말의 의미는 b 라는 바구니 안에 있는 값을, a 라는 바구니 안에다가 복사한다는 의미가 된다. 즉, 저 코드를 전부 실행하면 둘 다 1이라는 값을 가지게 된다. 프로그래밍을 하면서 가장 많이 사용하는 산술 연산자 이다. 그렇다면 사칙 연산은 언제 사용할까?? 데미지를 계산한다던지, 체력이 닳는다던지 등등 우리가 생각하는 모든걸 사칙 연산을 통해 계산한다. a = b + ..
C++ 공부에 앞서 우리가 C++을 공부하기 이전에 어셈블리에 대해 포스팅하고 공부했다. 그게 왜 중요했는지 잠깐이나마 얘기한다. #include int main() { std::cout 2 바이트 (-32768 ~ 32767) int c; => 4 바이트 (-21.4억 ~ 21.4억) __int64 d; => 8 바이트(long long으로 쓰기도 함.) 어마어마 하게 큰 숫자 우리가 대부분 정수를 사용한다고 하면 int 타입을 떠올리고 사용한다. 그리고 타입을 선언할 때 signed는 생략되며 선언이 된다. 즉, 부호가 있다는 의미다. 하지만 반대로 unsigned를 사용하게 되면 부호가 사라진 양수가 되기 때문에 범위가 넒어진다. unsigned char a; unsigned short b; uns..
배열 배열은 동일한 타입의 데이터 묶을을 의미한다. 배열을 구성하는 각 값을 배열 요소(element)라고 하고 배열의 위치를 가리키는 숫자를 인덱스(index)라고 한다. 어느 프로그래밍이나 존재한다. 어셈블리어에는 배열을 선언하기 쉽다. 변수를 선언할 때, 나열하면 그것이 배열이된다. 또는 times 키워드를 사용해 반복해서 만들어 줄 수도 있다. a는 1 byte씩 5개를 생성해서 총 5 byte의 메모리를 사용한다. b는 word 이므로 2 byte씩 5개, 총 10 byte를 사용하여 메모리에 할당하게된다. 실제로 이 값들이 제대로 동작하는지 프로그램을 실행해 확인해보자. a를 보게되면 1, 2, 3, 4, 5까지 총 5 byte가 잘 들어간 모습을 볼 수 있다. 그리고 b는 01 씩 잘 들어간..
분기문 특정 조건에 따라서 코드 흐름을 제어하는 것, 그것이 분기문이다. ex) 스킬 사용 버튼을 눌렀는가? yes -> 스킬 사용 ex) 제한 시간 내에 던전 입장 수락 버튼을 눌렀는가? yes -> 입장, no -> 던전 취소 분기문과 밑에 나올 반복문만 사용해도 어느정도 프로그램을 만들 수 있다. 조건이란 곧 흐름인 것이다. 이걸 명심하자 어셈블리어에서 비교를 하기 위해서는 CMP 명령어를 사용한다.(CMP dst, src (dst가 기준)) SASM - 1 포스팅에서 말했듯이 CPU에는 A,B,C,D 레지스터가 있다고 말했다. 레지스터가 그것만 있는 것은 아니다. 바로 Flag Register 가 있다. (물론 이것 말고도 더 있다.) 비교한 결과물은 Flag Register에 저장한다. 저장한 ..
사칙연산 사칙연산에 앞서 어셈블리어는 아닌 운영체제에서 제공하는 입출력 api에 대해 간단히 알고 넘어가자. GET_DEC = 숫자를 입력 받겠다. PRINT_DEC = 숫자를 출력하겠다. NEWLINE = 개행 사용 법은 밑에 사진과 같다. GET_DEC 1, al 은 1 byte 만큼 input을 받아서 al에 저장하겠다는 의미이며, GET_DEC 1, num은 1 byte 만큼 input에서 받아서 num 변수에 저장하겠다는 의미이다. 여기서 data를 사용하지 않고 bss를 사용한 것은 데이터를 입력 받을 것이기 때문에 초기화를 하지 않아도 되기 때문이다. 더하기 더하기는 add 라는 명령어로 사용된다. add a, b 형식으로 이루어져있다. 여기서 주의해야할 점은 a는 메모리 or 레지스터 만 ..