C++ 포인터
·
C++
오늘은 C,C++ 포인터에 대해 정리 해보겠습니다 포인터란? 먼저 간략하게 포인터를 설명하자면, 주소를 저장하는 변수라고 생각하면 이해가 쉽습니다. 우리가, 변수를 선언하게 되면 컴퓨터는 그 해당 변수의 데이터를 저장할 주소 또한 정해서 가지고 있게 됩니다. 쉽게 설명하기 위해 위 코드처럼 우리가 int형 변수 i를 선언했다고 합시다. 컴퓨터는 i라는 변수의 주소값을 임의로 정한 뒤, 해당 주소값에 int형 데이터 처리 방식으로 정수 10이라는 값을 저장하게 됩니다. 주소라는 개념이 이해가 안되실수 있기 때문에, 부연 설명을 드리자면 int i = 10이라는 코드를 작성할경우, 결국 10이라는 데이터가 컴퓨터 메모리상 어딘가에 저장이 되어있어야하는데 그 데이터가 존재하는 그 위치가 즉, 주소라고 보면됩니..
C++ 외부변수 extern 사용법
·
C++
프로그램 도중에 어느파일에서나 공통적으로 사용하고 싶은 전역변수를 원할 때 extern을 통해 변수를 선언하면 됩니다. C++에서 외부변수 extern을 사용하는 방법은 정리하자면 아래와 같습니다. 1. extern 변수를 사용하고 싶은 파일에 extern 변수를 선언합니다. -여기서 주의 해야할 점은 extern 변수는 반드시 하나의 파일에서만 초기화 시켜야합니다. 2. extern 변수를 하나의 파일에서만 초기화 합니다. 글로만 보면 정말 간단하지만 주의해야할 사항이 있기때문에 아래 예시를 들어 설명하겠습니다. 사용예시 위에 작성한 프로그램을 설명하자면 아래와 같습니다. common 헤더파일에 extern int iExtern 변수를 선언합니다. 그리고 common 헤더파일을 각각 main.cpp와 ..
C++ 정적 변수
·
C++
정적 변수는 이름이 내포하고 있는 의미 그대로 "정적인" 변수라고 생각하면 좋습니다. 그렇다고 const 변수 처럼 안에 있는 변수의 값을 바꾸지 못해서 정적인게 아니라. 변수가 선언된 위치에 콕 박혀서 움직이지 않는다고 생각하는편이 좋습니다. Static에 대해 자세하게 설명하기 이전에 Static의 특징을 정리하자면 아래와 같습니다. 1. Static은 서로 다른 파일안에 중복된 이름으로 선언하여도 오류가 발생하지 않는다. 2. Static 변수의 핵심은 외부에서 해당 변수를 쉽게 수정하지 못하게 한다는 점이다. 3. Static 변수는 전역변수와 마찬가지로 데이터 영역을 사용하는 변수이다. - 데이터 영역은 프로그램 시작과 동시에 할당되며 프로그램 종료시 사라진다 4. Static 변수를 함수내에서..
C++ 헤더 파일에 함수 기능을 구현해 놓지 않는 이유
·
C++
위 사진 처럼 Func.h 헤더 파일에 함수 선언과 그 기능까지 구현을 해놓을 경우 생기는 문제점에 대해 알아보자. 이후 main과 sub파일에서 Func.h 헤더에 있는 ADD함수를 선언을 할 경우 아래와 같은 에러가 뜨게된다. 함수가 중복돼서 정의되었다는 에러가 뜨게 되는데 그이유를 설명하자면 Func.h 헤더 파일안에는 ADD함수의 기능까지 구현이 돼있는 상태이다. 이상태에서 main과 sub에서 각각 Func.h 헤더를 Include하게되면 두개의 cpp 파일에서 ADD함수의 기능구현을 한것과 마찬가지가 되는것이다. 그 결과 ADD 함수를 중복으로 구현한 것과 동일한 결과를 초래하게되어 오류가 나게 되는것이다. 이러한 이유 때문에 헤더파일에는 함수의 선언만 할뿐 기능까지는 구현하지 않는것이다.
C++ 분할 구현 (헤더 파일)
·
C++
C++에서는 필요한 기능을 구현할때 한 곳에 몰아서 구현하지 않는다. 그 이유는 예를들어 내가 ADD함수(더하기 기능)를 main.cpp에 구현했을 경우에는 기능 하나만 구현되었기 때문에 크게 별 상관이 없겠지만. 점점 규모가 커져서 곱하기, 빼기, 나누기 등 사칙 연산들을 시작으로 추가적으로 더 필요한 기능을 하는 함수들을 main에몰아서 구현하게 되면 코드 줄이 길어질 것이다. 그렇게 되면 한 눈에 내가 어떠한 함수들을 구현했는지 알아보기도 힘들고 수정할때도 불편할 수 있다. 이러한 단점을 커버하기 위해 함수 선언을 모아놓은 헤더 파일과 그 기능들을 구현해 놓은 cpp 파일에 기능을 구현 해놓고 main에서 필요할때마다 꺼내서 사용하는 방법이 사용되는 것이다. 분할 구현의 방법은 아래와 같다. 1. ..
C++ 함수 호출(메모리 영역)
·
C++
C++에서 main()함수를 실행하게되면 스택형 방식으로 해당 코드를 실행하게된다. 스택이란 선입후출형 자료구조로써 먼저 실행된게 마지막에 종료되는 형식이라고 생각하면 편하다. 위에 사진처럼 작성된 프로그램이 있다고 가정해보자. 이경우 프로그램의 동작 실행 순서는 main()함수 실행 -> ADD()함수 실행 ->ADD()함수 종료 -> main()함수 종료 순으로 프로그램이 동작하게 된다. main() 함수에서 ADD함수 실행시 main()함수의 메모리 영역에 ADD함수의 메모리 영역이 생긴 뒤 ADD() 함수에 짜여진 동작 a+b를 실행하고 return 으로 계산 결과 값을 main()함수에게 전달해준다. 그뒤 ADD() 함수가 만들어졌던 메모리 공간은 제거가 되는 방식으로 진행된다. 우리는 이 방식..
C++ 게임에서의 비트 연산 활용
·
C++
앞서 얘기했던 비트 연산자들이 게임에서 어떻게 활용되는지 예시를 들어보겠다. 먼저 6번째 줄에서 int형 변수 state 는 32개의 비트가 모두 0으로 초기화 돼있는 상태이다. 여기서 비트 연산자 |를 통해 1이라는 값을 가지고 있는 정의어 HUNGRY와 합 연산을 할경우 맨 뒤에 자리의 비트의 값이 1이 되게된다. 즉 000000000...000인 비트값을 가지고 있던 state가 00000000000...001이 되는 것이다. 이를 활용해 위 코드처럼 작성하게 되면 어떠한 상태값을 원하는 state 변수하나만 으로 원하는 비트 자리에 저장하고 기록할수 있게 되는것이다. 즉 위에 그림처럼 특정 자리의 비트 값이 1이되면 그것이 곧 그 상태가 ON이 됐다는 것을 정의 할수 있게 되는것이다. HUNGRY..
C++ 비트 연산자 (&, |, ^, ~)
·
C++
C++의 비트 연산자 중 &, |, ^, ~가 의미하는 것이 무엇인지 알아보겠다. 먼저 &은 곱하기 라고 생각하면 편할 것이다, 전자 회로쪽을 공부한 사람이라면 알고 있을 AND게이트의 역할과 동일하다고 보면 된다. 요약하자면 &은 둘다 1일 경우에만 1을 값을 반환한다고 보면 된다. 1010과 1001을 &으로 계산하게되면 1000이라는 결과 값이 나오게 되는데 이는 &이 둘다 1일 경우에만 1을 반환하는 연산을 하기 때문이다. 디버깅 결과 값 역시 2진수 1000, 즉 10진수 8이라는 결과값이 나오게 되었다. 그렇다면 비트연산자 |는 어떠한 연산을 할까? |는 OR연산, 즉 덧셈을 한다고 생각하면 이해가 빠를것이다. 요약하자면 |는 둘중 하나라도 1이 있으면 1, 나머지는 0을 반환한다. 1010 ..