목차

1. 화면을 그린 후 지우고 다시 출력하면 깜빡이는 문제점

2. 게임 프로그래밍에서의 버퍼 개념

3. 페이지 전환을 통해 깜빡이는 문제 해결하기


1. 화면을 그린 후 지우고 다시 출력하면 깜빡이는 문제점

C언어게임은 콘솔창이므로 콘솔창에서는 고속으로 화면을 지우고 그리게 하는 부분이 없어 지우고 다시 그리는 과정에서 깜빡임이 발생하게 된다.

 

아래 구조는 간단하게 구조체를 하나 만들고 방향키로 캐릭터가 움직이도록 구현하였다.

#include <stdio.h>
#include<Windows.h>
void gotoxy(int x, int y)   //gotoxy api함수

{
	COORD pos = { x,y };
	SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);
}

typedef struct _PLAYER
{
	int x, y; 
}PLAYER;

PLAYER player;

void init() {
	player.x = 20;
	player.y = 10;
}
void update() {
}
void render()
{
	system("cls");
	gotoxy(player.x, player.y);
	printf("♀");
}

void release() {
}

int main(void) {
	int nKey;
    
	init();

	while (1) {
		if (_kbhit()) { //키보드가 눌렸는지 체크 
			nKey = _getch(); //눌린값 대입
			if (nKey == 'q') //q를 눌렀다면 break
				break;
			else if (nKey == 224 || nKey == 0) {
				nKey = _getch();
			switch (nKey) {
			case 75: //왼쪽 방향키를 눌렀다면 
				player.x--; 
				break;
			case 77:  //오른쪽 방향키를 눌렀다면
				player.x++; 
				break;
			
			case 72:  //위쪽 방향키를 눌렀다면
				player.y--; 
				break;
			
			case 80:  //아래쪽 방향키를 눌렀다면
				player.y++; 
				break;
		}
			}
		}
		update();
		render();
	}
	release();
	return 0;
}

이동하기 전 위치의 문자를 보이지 않게 하기 위해 system("cls")로 지우고 다시 새로운 위치에 문자를 출력시키기 때문에

어쩔수없이 화면이 지워졌다가 다시 그려짐으로 인해서 화면이 깜빡이게 된다.

 

그렇다고 system("cls")를 해주지 않으면 다음과 같이 잔상이 남게 된다

 

 

이런 화면깜빡임은 보는 사람에게 너무 피로감을 느끼게 한다.  이런 문제를 해결하는 방법을 알아보자.


2. 게임 프로그래밍에서의 버퍼 개념

먼저 해결하는 방법을 알기 위해서는 게임 프로그래밍에서 쓰는 버퍼 개념을 알아야한다.

 

1) 전위 버퍼(primary buffer)

전위 버퍼를 전위면이라고도 하는데 화면과 일대일 대응되는 메모리르 ㄹ말하며 그래픽 카드의 메인 메모리의 일부분이다.

현재 모니터의 해상도를 변경하면 전위 버퍼에 해당되는 메모리도 변경된다.

 

2) 후위 버퍼(back buffer)

전위 버퍼와 동일한 특성을 가진 메모리를 말한다.

전위 버퍼는 모니터와 일대일 대응되므로 컴퓨터와 동작함과 동시에 그래픽 카드에 생성이 되지만 후위 법퍼는 따로 생성이 된다.

 

후위 버퍼는 전위 버퍼와 특성이 같으므로 전위 버퍼와 연결하여 사용하며 주로 시스템 메모리 보다는 그래픽 카드 메모리에 생성하여 빠른 화면 전환을 하기 위해 사용된다.

 

3) 이중 버퍼링(double buffering)

이중 버퍼링은 두 개의 버퍼를 이용하여 화면을 전환하는 방법을 말한다.

사용되는 두 개의 버퍼는 전위 버퍼와 후위 버퍼를 말하며 후위 버퍼의 내용을 전위 버퍼에 복사하여 출력하는 것을 말한다.

 

4) 페이지 전환(Page flipping)

이중 버퍼링에도 문제가 있어 오늘날 모든 게임에서 사용되는 방식이 바로 페이지 전환 방식이다.

실제로 전위 버퍼와 후위 버퍼간의 메모리 복사가 아닌 화면과 일대일 대응하는 메모리의 시작주소를 바꾸는 방식이다.

 

즉, 전위 버퍼를 쓰고 있다가 메모리의 시작 주소를 후위 버퍼로 바꿔서 후위 버퍼를 보여줬다가 다시 시작 주소를 바꿔서 전위 버퍼를 보여줬다가 번갈아가며 출력하게 하는 것이다.


3. 페이지 전환을 통해 깜빡이는 문제 해결하기

위에 봤던 간단한 예제를 버퍼 예제로 바꿔보자.

 

일단 기본 구조는 다음과 같다.

잘 모르겠다면 아래 링크를 잠깐 갔다 오자.

C언어로 게임만들기 1탄 - 게임의 기본구조 :: 잡코딩 정보 블로그 (tistory.com)

 

일단 코드를 복붙하고 따라해보자.

총 3개의 파일이 필요하다

1) main.c

#include <stdio.h>
#include<Windows.h>
#include "Screen.h"

typedef struct _PLAYER
{
	int x, y; //출력기준좌표
}PLAYER;

PLAYER player;

void init() {
	player.x = 20;
	player.y = 10;
}
void update() {
}
void render()
{
	   ScreenClear(); //대기하고 있는 화면 버퍼를 지운다.
	  ScreenPrint(player.x, player.y, "♀"); //(player.x, player.y) 좌표에 문자를 출력한다.
		ScreenFlipping(); //활성화된 화면 버퍼와 비활성화된 화면 버퍼의 상태를 바꾼다
}

void release() {
}

int main(void) {
	int nKey, nRemain;

	ScreenInit();//버퍼를 2개 생성한다.
	init();

	while (1) {
		if (_kbhit()) { //키보드가 눌렸는지 체크 
			nKey = _getch(); //눌린값 대입
			if (nKey == 'q') //q를 눌렀다면 break
				break;
			else if (nKey == 224 || nKey == 0) {
				nKey = _getch();
			switch (nKey) {
			case 75: //왼쪽 방향키를 눌렀다면 
				player.x--; 
				break;
			case 77:  //오른쪽 방향키를 눌렀다면
				player.x++; 
				break;
			
			case 72:  //위쪽 방향키를 눌렀다면
				player.y--; 
				break;
			
			case 80:  //아래쪽 방향키를 눌렀다면
				player.y++; 
				break;
		}
			}
		}
		update();
		render();
	}


	release();
	ScreenRelease(); //화면 버퍼 초기화 함수에서 생성한 두 개의 화면 버퍼를 모두 해제한다.
	return 0;
}

 

2) Screen.c (작명은 아무렇게나 해도 상관없다)

#include <stdio.h>
#include<Windows.h>

static int g_nScreenIndex;
static HANDLE g_hScreen[2];

void ScreenInit()
{
    CONSOLE_CURSOR_INFO cci;

    //화면 버퍼 2개를 만든다.
    g_hScreen[0] = CreateConsoleScreenBuffer(GENERIC_READ | GENERIC_WRITE,
        0, NULL, CONSOLE_TEXTMODE_BUFFER, NULL);
    g_hScreen[1] = CreateConsoleScreenBuffer(GENERIC_READ | GENERIC_WRITE,
        0, NULL, CONSOLE_TEXTMODE_BUFFER, NULL);

    //커서 숨기기
    cci.dwSize = 1;
    cci.bVisible = FALSE;
    SetConsoleCursorInfo(g_hScreen[0], &cci);
    SetConsoleCursorInfo(g_hScreen[1], &cci);
}

void ScreenFlipping()
{
    SetConsoleActiveScreenBuffer(g_hScreen[g_nScreenIndex]);
    g_nScreenIndex = !g_nScreenIndex;
}

void ScreenClear()
{
    COORD Coor = { 0,0 };
    DWORD dw;
    FillConsoleOutputCharacter(g_hScreen[g_nScreenIndex], ' ', 80 * 25, Coor, &dw);
}

void ScreenRelease()
{
    CloseHandle(g_hScreen[0]);
    CloseHandle(g_hScreen[1]);
}

void ScreenPrint(int x, int y, char* string)
{
    DWORD dw;
    COORD CursorPosition = { x, y };
    SetConsoleCursorPosition(g_hScreen[g_nScreenIndex], CursorPosition);
    WriteFile(g_hScreen[g_nScreenIndex], string, strlen(string), &dw, NULL);

}

 

3) Screen.h (작명은 아무렇게나 해도 된다)

void ScreenInit();
void ScreenFlipping();
void ScreenClear();
void ScreenRelease();
void ScreenPrint(int x, int y, char* string);
void SetColor(unsigned short color);

 

위에 깜빡이는 예제와 거의 똑같은데 다른 것은 윈도우 API함수가 들어간 것이다.

파일이 준비돼었으니 차근차근 보도록하자.

 

Screen.c 코드는 이해할필요없다. 그냥 가져다 쓰면 된다.

 

<1> ScreenInit()로 전위 버퍼와 백 버퍼로 사용할 화면 버퍼를 두 개 생성한다.

 

<2> ScreenClear()로 하나의 화면 버퍼가 활성화되어 출력되고 있는 동안에 다음 장면을 위한 화면 버퍼는 지운다.

 

 

<3>  ScreenPrint()로 대기 화면 버퍼의 x, y 좌표에 문자열을 출력해준다.

전위버퍼/후위버퍼

 

<4> ScreenFlipping()로 활성화된 화면 버퍼와 비활성화된 화면 버퍼의 상태를 바꾼다.

전위버퍼/후위버퍼

 

아주 빠른 속도로 일어나서 그냥 이동하는 것 처럼 보이지만 이런식으로 빠르게 바꿔치기 돼서 화면에 보이게 된다.

이렇게 코드를 짜면 아래와 같이 깜빡이지 않는 편안함을 느낄 수 있다


참고문헌

C를 이용한 게임프로그래밍-이태성

 

 

 

목차

1. 게임의 기본구조


1. 게임의 기본구조

게임의 기본 구조는 크게 초기화, 데이터 갱신, 화면 출력, 해제로 나뉜다.

모든 게임이 이 구조로 돼있지는 않지만 대부분의 게임 구조가 이 구조로 되어있다.

사진 출저 : 아래 참조

1) 초기화

실제로 게임이 실행되기 이전에 게임에 필요한 기본 데이터를 읽고 각종 변수를 초기화한다.

초기화의 내용에는 캐릭터 초기화, 사운드 초기화, 패턴 도는 AI 초기화, 메모리 할당 등이 있다.

 

2) 데이터 갱신

말그대로 데이터가 갱신되는 것이다.

입력장치(주로 키보드나 마우스)에 의해 데이터가 갱신되거나

충돌등의 다양한 방식으로 데이터가 스스로 갱신된다.

 

3) 화면 출력

말그대로 출력하는 것이다.

 

4) 해제

동적으로 메모리를  해제하는 경우가 대부분이지만 초기화에서 생성한 객체를 해제하는 역할도 한다.

객체는 사운드 엔진, 물리 엔진, 그래픽 엔진등을 말한다.

 

 

다음은 게임 기본 구조에 사용할 함수들이며 주로 게임 엔진에 사용되는 함수명이다.

 

사진 출저 : 아래 참조

게임 프로그래밍을 하기 전에 이와 같은 구조를 만드는 것은 분업을 해야하기 때문이다.

사진 출처 : 아래참조

기본구조를 코드로 구현하면 다음과 같다.

 

4개의 함수가 각각 한번씩 실행되고 종료된다. 

#include <stdio.h>

void init() {

}

void update() {

}

void render() {

}

void release() {

}

int main(void) {
	init(); 
	update();
	render();
	release();
	return 0;
}

 

하지만 게임에서 데이터 갱신과 화면 출력은 계속돼야하므로 무한 반복하는 형태로 바꿔준다.

#include <stdio.h>

void init() {

}

void update() {

}

void render() {

}

void release() {

}

int main(void) {
	init();  //초기화
    
	while(1){
	update(); //데이터 갱신
	render(); //화면출력
	}
    
	release(); //해제
	return 0;
}

출처

1. C를 이용한 게임프로그래밍-이태성

2. 사진출처 :  3장. 게임의 기본 구조 (1/2) - C 게임 프로그래밍 - 나우캠퍼스 (daum.net)

 

XAMPP MYSQL과 기존 설치했던 MYSQL이 충돌이 나서 접속이 안되는 문제가 발생했다..

 

이럴 경우 포트를 죽이거나 아니면 포트번호를 변경해야한다

 

아래 소개하는 방법은 MYSQL 프로그램을 많이 사용하지 않고 가끔 사용할 때

포트번호 3306을 동시에 같이 사용할 때 사용하는 방법이다

 

1. MySQL Installer에 접속 후 Reconfigure를 클릭한다

 

 

2. 임시로 포트번호를 3306에서 비어있는 포트번호로 바꾼다 ex) 3307

 

3. Mysql을 설치할 때 지정했던 비밀번호를 입력 후 Check 클릭 후 Next 클릭한다

 

4. Next를 클릭한다

5. Execute 클릭한다

6. Finish를 클릭한다

 

XAMPP mysql을 사용할 때는 기존 mysql 포트번호를 3307로 변경해놨다가 MYSQL을 사용할 일이 생기면 다시 같은 방법으로 3306으로 바꾸면 된다

 

이렇게 하면 포트 3306 하나로 2개의 mysql을 사용할 수 있다

*Visual Studio 2022를 사용하였습니다.

 

1. 아래 링크 접속

MySQL :: MySQL Downloads

 

2. MySQL Community(GPL) Downloads 클릭

 

3. MySQL Installer for Windows 클릭

 

4. Archives 클릭

 

5.     5.7.41버전 선택 후 용량이 더 큰 아래 파일 Download 클릭

mysql을 c언어와 연동하는 경우에 최신버전은 연동이 안되는 경우가 있어 5.7버전을 선택한다

 

6. 다운로드 받은 폴더에 가서 아래 파일 실행

 

7. Developer Default 클릭, Next 클릭

 

8. next 클릭

 

 

9. Execute 클릭

 

10. next 클릭

 

11. 포트번호 선택 후 Next 클릭

Maria DB나 xampp 내장 Mysql이나 3306을 쓰고 있으면 다른 번호로 변경

 

 

12. 비번입력후  Next 클릭

비번 까먹으면 안되므로 쉬운 비번 선택

.

13. Next 클릭

 

14. Next 클릭

 

15. Execute 클릭

 

16. Finish 클릭

 

17. Next 클릭

 

18. Finish 클릭

 

 

19. Next 클릭

 

20. 아까 적었던 비번 입력 후 Check 클릭 후 Next 클릭

 

21. Execute 클릭

22. Finish 클릭

 

23. Next 클릭

 

24. Finish 클릭

 

25. 지금 이렇게 설치해놓으면 mysql.exe파일이 포함돼어있는 C:\Program Files\MySQL\MySQL Server 5.7\bin 위치에서만 Mysql이 접속되는데 모든 위치에서 mysql을 접속하기 위해 환경변수를 설정해준다

 

26. 톱니바퀴 모양 클릭

 

27. 시스템 클릭

 

28.  왼쪽 메뉴 수크롤 내려서 정보 클릭

 

29. 오른쪽 화면 스크롤 내려서 고급 시스템 설정 클릭

 

 

30. 환경변수 클릭

 

 

31.시스템 변수 Path 클릭하고 편집 클릭 

 

32. 새로만들기 클릭 후 mysql.exe가 들어있는 파일 경로 위치 복붙해서 추가

 

33.  mysql -V 명령어로 설치 잘됐는지 확인

 

34. mysql 명령어를 이용해 접속 시도

mysql -u root -p

한 후

Enter password에서 설치할때 만든 password 입력

 

35. password 입력후 접속 성공

이제 여러 mysql명령어를 이용해 DB 만들기 가능

저와 같이 Expresson:result_pointer !=nullptr

에러가 나는 경우는 scanf("%d", a); 입력받을 변수에 &를 붙이지않아서 생기는 오류였습니다.

scanf("%d", a); 를

scanf("%d", &a);

해주시면 해결됩니다

 

저처럼 바보 같은 실수하시지 않기를 바랍니다 ㅎㅎ 

Debug Assertion Failed!

Expresson:result_pointer !=nullptr
For information on how your program can cause an assertion failure, see the Visual C++ documentation on asserts.
(Press Retry to debug the application)

★ C언어를 알아보기 전 기본 개념

1) 프로그래밍 언어

프로그래밍 언어는 컴퓨터의 시스템을 구동시키는 소프트웨어를 작성하기 위한 언어를 의미하며 크게 저급 언어(low-level language)와 고급 언어(high-level language)로 나뉜다.
저급, 고급 언어는 기계가 이해하기 쉬운가(저급 언어), 사람이 이해하기 쉬운가(고급 언어)를 상대적으로 나눈 개념이라고 할 수 있다.

 

2) 저급 언어

저급 언어는 컴퓨터가 이해하기 쉽게 작성된 프로그래밍 언어

대표적인 언어로는 기계어(machine language)와 어셈블리어(assembly language) 등이 있다.
이 언어는 실행 속도가 매우 빠르지만, 사람이 배우기에는 매우 어려워 프로그램의 유지보수가 힘들다.

 

3) 고급 언어는 컴퓨터보다는 사람이 알기 쉽도록 작성된 프로그래밍 언어
고급 언어는 컴파일러나 인터프리터에 의해 기계가 이해 할 수 있는 언어로 번역되어 실행 되므로 저급 언어보다 상대적으로 실행 속도가 느리다. 대신 저급 언어에 비해 가독성이 높고 다루기가 쉽다.

대표적인 예시 : 자바, 파이썬 등


1. C언어의 뜻

C언어는 현재 사용하고 있는 거의 모든 컴퓨터 시스템에서 사용할 수 있는 프로그래밍 언어

C언어는 저급 언어와 고급 언어의 특징을 모두 가지고 있는 절차 지향 프로그래밍 언어(procedure-oriented programming language)이다.

 

▶절차 지향 언어(Procedural Programming)

순차적으로 처리되고 프로그램 전체가 유기적으로 연결되도록 만드는 방법이며 대표적인 예로 C언어가 있다. 컴퓨터의 처리구조와 유사해 실행 속도가 빠른 장점이 있지만 실행 순서가 정해져 있으므로 코드의 순서가 바뀌면 동일한 결과를 보장하기 어려워 유지보수가 어렵다. (c언어도 절차 지향 언어이긴 하나 c언어는 코드가 복잡하지 않아 상대적으로 유지보수가 쉽다고 한다)

(프로그램 전체가 유기적으로 연결돼있으므로 일부분이 고장이 나도 전체를 수리해야 한다(매우 비효율적이다)

절차지향과 비슷한 예로는 자동차 제조가 있다. 자동차는 엔진, 차제, 핸들, 의자, 바퀴 순으로 차례대로 만들어져야 하고 순서도 틀리면 안된다고 한다.

이와 대조되는 개념으로는 객체 지향 언어가 있다. (대표적으로 자바)

 


2. C언어의 탄생 배경

C언어 이전에 유닉스 운영체제는 어셈블리어라는 저급 언어를 사용했는데 어셈블리어는 특정 하드웨어에 종속적인 언어여서, 이 언어로 작성된 프로그램은 다른 하드웨어로 이식할 수 없어 하나의 기능을 하는 프로그램을 CPU의 종류만큼 여러 번 작성해야만 했다. 따라서 이식성도 좋고 어셈블리어보다 쉬운 언어가 필요해졌고, 그래서 개발된 언어가 바로 C언어이다.


3. C언어의 컴파일 과정

① 소스 파일(source file) 작성

C언어를 사용하여 문법에 맞게 논리적으로 작성된 프로그램을 원시 파일 또는 소스 파일이라고 한다.

C언어를 통해 작성된 소스 파일의 확장자는 .c가 된다.

 

②선행처리기(preprocessor)에 의한 선행처리

선행처리란 소스 파일 중에서도 선행처리 문자(#)로 시작하는 선행처리 지시문의 처리 작업을 의미한다.

선행처리기는 코드를 생성하는 것이 아닌, 컴파일하기 전 컴파일러가 작업하기 좋도록 소스를 재구성해주는 역할만 한다.

출처는 아래 참고

 

③ 컴파일러(compiler) 에 의한 컴파일

컴퓨터는 0과 1로 이루어진 이진수로 작성된 기계어만 이해할 수 있는데 소스 파일은 이해할 수 없으므로 소스 파일을 컴퓨터가 알아볼 수 있는 기계어로 변환시키는 작업을 컴파일이라고 한다. 

컴파일이 끝나 기계어로 변환된 파일을 오브젝트 파일이라고 한다. 

 

④ 링커(linker)에 의한 링크

컴파일러에 의해 생성된 오브젝트 파일은 운영체제와의 인터페이스를 담당하는 시동코드를 가지고 있지 않고 또한 대부분의 C 프로그램에서 사용하는 C 표준 라이브러리 파일도 포함되어 있지 않다.

이때 하나 이상의 오브젝트 파일과 라이브러리 파일, 시동 코드 등을 합쳐 하나의 파일로 만드는 작업을 링크라고 한다.

 

링크가 끝나면 하나의 새로운 실행 파일이나 라이브러리 파일이 생성된다.

⑤실행 파일(executable file)의 생성

소스 파일은 선행처리기, 컴파일러 그리고 링커에 의해 위와 같은 과정을 거쳐 실행 파일로 변환 된다.

이렇게 생성된 실행파일의 확장자는 .exe가 된다.

출처는 아래 참고


출처 : 코딩의 시작, TCP School


4. C 표준 라이브러리

① 라이브러리(library)

라이브러리란 다른 프로그램의 구성 요소로 사용하기 위해 미리 만들어 둔 프로그램 조각이다. 즉, 자주 사용하는 기능을 모듈·패키지로 만들어 둔 것이다. 한 번 만들어 놓으면 여러 프로그램에서 재사용할 수 있고, 다른 사람과 공유할 수도 있다.
② 표준 라이브러리(standard library)

대다수 프로그래밍 언어는 프로그램을 만들 때 공통적으로 필요한 기능을 미리 만들어 라이브러리로 제공한다. 프로그래밍 언어가 공식적으로 제공하는 라이브러리를 표준 라이브러리라고 한다. 표준 라이브러리는 프로그래밍에 필요한 가장 중요한 기능을 제공하며, 신뢰성도 다른 라이브러리에 비해 매우 높다.

출처  : 11장 다양한 작업을 돕는 라이브러리 | 연오의 파이썬 프로그래밍 입문서 (bakyeono.net)

 

③ C 표준 라이브러리

C언어를 위한 표준 라이브러리이다. C 표준 라이브러리의 API는 많은 헤더 파일들에 정의되어 있다. 각 헤더 파일은 하나 이상의 함수 정의와 데이터 타입 정의 그리고 매크로들을 포함한다.

C 표준 라이브러리 안에 헤더파일도 들어있는데 그 중에 대표적인 예가 <stdio.h>이고 표준 라이브러리 안에 있는 이 헤더파일을 사용함으로써 손쉽게 그 헤더파일안에 있는 함수를 쓸 수 있게 되는 것이다.

출처 : C 표준 라이브러리 - 위키백과, 우리 모두의 백과사전 (wikipedia.org)

출처는 아래 참고

사진 출처 : C언어 이론 11. 표준 라이브러리(정의~문자열 처리 함수) (tistory.com)

▶API

응용 프로그램 프로그래밍 인터페이스)는 응용 프로그램에서 사용할 수 있도록, 운영 체제나 프로그래밍 언어가 제공하는 기능을 제어할 수 있게 만든 인터페이스라고 한다.

 

도통 무슨 말인지 감이 안오는데 이 개념을 이해하기 위해서 우선 UI(User Interface) 개념을 생각해보도록 하자.

UI는 말 그대로 컴퓨터와 사람이 상호작용할 수 있도록 도와주는 매개체인데 쉽게 생각해서 그냥 사용자가 PC나 휴대폰을 볼 때 보게되는 화면을 UI라고 생각할 수 있다.

UI가 사람과 컴퓨터를 연결한다면 API는 프로그램과 다른 프로그램을 연결해주는 매개체라고 생각하면 된다. 

먼저 UI를 먼저 생각해보자. 스마트폰 화면에는 사람이 이용하기 편하도록 버튼이 있다. 만약 버튼이 없으면 어떻게 될까..

사용자는 스마트폰과 상호작용할 수 있는 방법을 몰라 헤매게 된다. 이런 헤매는 사용자를 도와주는 것이 바로 UI이다.

같은 방식으로 API도 이해해보자. 

지도를 이용한 맛집찾기 프로그램을 만들고자 한다고 생각해보자. 

일반인들은 이런 지도 기능들을 제공할만한 기반이 되는 데이터도 없고 관련 프로그램도 없다.

그리고 일반인들 입장에서는 그런 지도 데이터를 공개해도 여러 문제점 때문에 그 지도데이터를 사용하기 어려울 것이다. 

그래서 이 지도 데이터를 일종에 스마트폰의 버튼처럼 그 지도 데이터를 접근하기 쉽게 만들어 사용자들에게 공개한 것이 바로 지도API이다. (어떻게 보면 오픈 소스랑 비슷한 느낌이라고 볼 수 있다)

 

출처 설명이 대박이니 무조건 한번 보시는 것을 추천드립니다. 

출처 : API 란?. 저도 API가 무엇인지 자세히 알지 못하였기 때문에 검색을 하며 스스로… | by 초보개발자 | Medium

 

▶헤더 파일

헤더파일은 메뉴판이다. 대표적인 헤더파일로 stdio.h가 있는데 이 헤더파일을 사용함으로써 헤더파일이라는 메뉴판에 적혀있는 메뉴, 즉 여러가지 함수를 사용할 수 있었던 것이다. 

 

간단한 프로그램을 작성해보자. 

출처는 아래 참고

더하기 기능을 사용하기 위해서 sum 이라는 함수를 만들어낸 것인데 실제로 프로그램을 만들 때는 함수를 많이 만들어야 하기 때문에 이렇게 정리를 하게 되면 뭐가 뭔지 눈에 들어오지도 않고 가독성이 떨어질 것이다. 

그래서 파일을 분리한다.

head.h라는 헤더파일에는 함수이름만 적고 함수 기능은 또 다른 소스파일을 만들어서 거기에 저장한다.

그리고 마지막으로 main 소스파일에는 #include "head.h"라고 서서 헤더파일을 불러온다.(예시로 설명하면 "head.h"를 선언해줌으로써 sum함수를 main 소스파일에서 사용할 수 있게 되었다.)

 

이런식으로 만들게 되면 실제 프로그램을 작동하도록 만드는 사람은 새로 기능을 추가할 때 헤더파일만 불러오면 되며 여러 사람이 분업을 해서 만들기 좋아졌다.

출처는 아래 참고

내용 출처, 사진출처 : [C언어]18. 헤더파일이란 무엇인가 ( 헤더파일을 만드는 법 ) (tistory.com)

 

▶#include에서 #의 의미

#은 컴파일러에게 명령을 하는 키워드 전처리기라고 한다.

#include는 ~을 포함해라라는 의미이다. 

출처 : [C언어]19.#include 가 어떻게 작동하는가. (#include , #의 의미 ) (tistory.com)

+ Recent posts