함수 포인터

-> 함수의 주소를 저장하는 변수

-> 함수 포인터는 코드 영역에 들어간다.

-> 할당 시점 : 프로그램 시작시 

-> 할당 종료 : 프로그램 종료시

 

 

함수를 호출할 때 함수명 + ()를 이용한다.

-> 연산자 ()를 제거하면 함수명만 남게된다.

-> 함수명은 함수의 주소를 가지고 있다.

-> cout을 통해 함수명만 호출하면 함수의 주소가 나오게된다.

 

함수 포인터의 형태

int Add(int _a, int _b)
{
	return _a + _b;
}	

반환타입(* 변수명) (인자타입, 인자타입, 인자타입... )
int(*ptr)(int, int) = Add;
    
cout << ptr(10, 20) << endl;

 

일반 함수 switch 사용

int iA = 0, iB = 0, iSelect = 0, iRes = 0;
	cin >> iA >> iB;
	cout << "1.더하기 2.빼기 3.곱하기 4.나누기" << endl;
	cout << "============================================" << endl;
	cout << "입력: ";
	cin >> iSelect;

	switch (iSelect)
	{
	case 1:
		iRes = Add(iA, iB);
		break;
	case 2:
		iRes = Min(iA, iB);
		break;
	case 3:
		iRes = Mul(iA, iB);
		break;
	case 4:
		iRes = Div(iA, iB);
		break;
	default:
		break;
	}

	cout << "연산 결과: " << iRes << endl;

 

함수 포인터 switch 사용

	int iA = 0, iB = 0, iSelect = 0, iRes = 0;
	cin >> iA >> iB;
	cout << "1.더하기 2.빼기 3.곱하기 4.나누기" << endl;
	cout << "============================================" << endl;
	cout << "입력: ";
	cin >> iSelect;

	int(*ptr)(int, int) = nullptr;

	switch (iSelect)
	{
	case 1:
		ptr = Add;
		break;
	case 2:
		ptr = Min;
		break;
	case 3:
		ptr = Mul;
		break;
	case 4:
		ptr = Div;
		break;
	default:
		break;
	}
	cout << "연산 결과: " << ptr(iA, iB) << endl;

switch를 통해 함수 포인터를 사용하였는데 코드가 너무 길다고 판단이 된다.

이를 해결하기 위해서 함수 포인터의 배열을 사용해보자.

 

함수 포인터 배열 사용

int Add(int _a, int _b)
{
	return _a + _b;
}
int Min(int _a, int _b)
{
	return _a - _b;
}
int Mul(int _a, int _b)
{
	return _a * _b;
}
int Div(int _a, int _b)
{
	return _a / _b;
}

int iA = 0, iB = 0, iSelect = 0, iRes = 0;
	cin >> iA >> iB;

int(*ptr[4])(int, int) = { Add, Min, Mul, Div };

cout << "연산 결과: " << ptr[iSelect - 1](iA, iB) << endl;

switch문을 사용했을 때와 결과는 같고 훨씬 더 코드가 간결해진 것을 볼 수 있다.

'Programming > C++ Basic' 카테고리의 다른 글

C++ 조건부 컴파일(#if, #ifdef, #ifndef 등)  (0) 2020.09.07
C++ 매크로(#define)  (0) 2020.09.07
C++ 공용체(union)  (0) 2020.09.07
C++ 열거체(enum)  (0) 2020.09.06
C++ 경로  (0) 2020.09.02

공용체(union)

-> 사용자 정의 자료형

-> 구조체와 비슷하다.

 

공용체의 형태

	union 자료형이름
	{
		멤버 변수
	}

 

공용체 선언

tagBox tBox;
uniBox uBox;

 

공용체 초기화

tagBox tBox = {};
uniBox uBox = {};

 

 

공용체의 각 멤버 초기화

tagBox tBox = {10, 3.14};
uniBox uBox = {10, 3.14f};

 

 

구조체와 공용체의 차이점

-> 구조체 각 멤버들이 메모리에 할당이 된다.

-> 공용체 메모리가 하나만 할당한 후 모든 멤버들이 공유한다.

(즉, 공용체에 들어있는 멤버 변수들은 모두 같은 메모리 공간을 사용 한다.)

struct tagBox
{
	int iA;
	double dB;
};
union uniBox
{
	int iA;
	float fB;
};

void main()
{
	tagBox		tBox = {10, 3.14};
	uniBox		uBox = {10};

	cout << "&tBox.iA: " << &tBox.iA << endl;
	cout << "&tBox.dB: " << &tBox.dB << endl;
	cout << "-----------------------------------------" << endl;
	cout << "&uBox.iA: " << &uBox.iA << endl;
	cout << "&uBox.dB: " << &uBox.fB << endl;

}

 

공용체의 크기
-> 공용체의 크기는 멤버들 중 가장 큰 멤버 변수의 크기로 설정된다.

union uniBox
{
	int iA;
	double dB;
};

void main()
{	
	uniBox		uBox = {};

	cout << "공용체의 크기: " << sizeof(uBox) << endl;
}

공용체는 안에 있는 멤버 변수의 값 변경시 가장 마지막에 변경한 변수의 값만 적용이 되고 나머진 쓰레기 값이 된다.

union tagTest
{
	int iA;
	float iB;
};


void main()
{

	tagTest test;
	test.iA = 10;
	cout << test.iA << endl;
	test.iB = 5.f;
	cout << test.iB << endl;
	cout << test.iA << endl;
}

 

'Programming > C++ Basic' 카테고리의 다른 글

C++ 매크로(#define)  (0) 2020.09.07
C++ 함수 포인터  (0) 2020.09.07
C++ 열거체(enum)  (0) 2020.09.06
C++ 경로  (0) 2020.09.02
C++ 입출력 스트림 버퍼, 단일 문자 입/출력 함수  (0) 2020.09.02

열거체

-> 사용자 정의 자료형이다.

-> 열거체는 멤버로 열거형을 가진다.

-> 열거형을 토대로 상태 값 지정 시 활용한다.

 

열거체의 형태

enum 자료형이름

{

 IDLE, ATTACK, RUN, WALK

}

열거형이란?

-> 상수의 성질을 가진다.

-> 좌측부터 0으로 시작한다.

-> 이후, 1씩 증가한 상수의 성질을 가진다.

 

열거체의 선언과 초기화

PlayerState eState = 0;    // 불가능
PlayerState eState = IDLE; // 가능

 

switch에서 열거체 적용

	switch (eState)
	{
	case IDLE:
		cout << "대기 상태" << endl;
		break;
	case WALK:
		cout << "걷기 상태" << endl;
		break;
	case RUN:
		cout << "달리기 상태" << endl;
		break;
	case ATTACK:
		cout << "공격 상태" << endl;
		break;
	case DEAD:
		cout << "사망 상태" << endl;
		break;
	}

 

열거형의 상수 성질 변경

enum PlayerStance { IDLE = 1, WALK, RUN, ATTACK, DEAD, END };
	 IDLE   == 1
	 WALK   == 2
	 RUN    == 3
	 ATTACK == 4
	 DEAD   == 5
	 END    == 6

 

열거체의 크기

-> 열거형의 개수와 상관 없이 4byte의 고정된 크기를 가진다.

-> 열거체는 결국 정수형을 가진다.

(정수를 저장하기 위해서는 4byte의 공간이 있으면 된다.)

 

 

열거체의 순서는 index이므로 0부터 시작한다.

PlayerState		eState = IDLE;			// 0
PlayerState		eState = ATTACK;		// 3

 

 

열거체와 열거체 클래스(enum class) 사용

// enum

enum PlayerState{IDLE, WALK, RUN};

PlayerState eState = IDLE;

// enum class

enum class PlayerState{IDLE, WALK, RUN};

PlayerState eState = PlayerState::IDLE;

enum 보다 enum class 가 더 안전하고 가독성도 좋다고한다.

 

비트 플래그 열거형은 이름 뒤에 Flags를 붙인다.

enum class eVisibilityFlags
{
}

 

특정 크기(예를 들어, 데이터 멤버의 직렬화를 위한 크기)가 필요하지 않은 한 열거형에 크기 지정자를 추가하지 않는다.

enum class eDirection : uint8_t
{
    North,
    South
}

 

'Programming > C++ Basic' 카테고리의 다른 글

C++ 함수 포인터  (0) 2020.09.07
C++ 공용체(union)  (0) 2020.09.07
C++ 경로  (0) 2020.09.02
C++ 입출력 스트림 버퍼, 단일 문자 입/출력 함수  (0) 2020.09.02
C++ 동적 할당(C, C++기반), malloc, calloc  (0) 2020.09.01

경로


##1. 절대 경로
주체의 위치와 상관 없이 목적지가 고정되어 있다.

 

파일 위치 예)
C:\Users\aaa\Desktop\bbb\ccc\200902\Data\
-> 모든 PC에 aaa라는 폴더가 없다.

-> 현재 자신의 PC에서 폴더를 열고 상단의 주소를 복사/붙여넣기를 하는 경우는 절대 경로를 가져오는 것이다.

##2. 상대 경로
주체의 위치에 따라 목적지가 변경될 수 있다.

 

파일 위치 예)
..\Data\

-> Data파일은 항상 고정되어 있다.

-> 하지만 Data파일 앞의 경로에 있는 파일의 위치는 언제든 바뀔 수도 있다.

-> 그러므로 ..\Data\라고 표시를하여 Data파일을 주체로 놓는다.

프로그래밍에서 주소 표현 방법
큰 따옴표로 주소를 감싼다.
-> 문자열을 사용하듯이 사용한다.

##1. 역슬래쉬
-> 역슬러쉬 2개를 이용해야 폴더 접근을 뜻한다!

"C:\\Users\\aaa\\Desktop\\bbb\\ccc\\dddd\\Data\\";

##2. 슬래쉬

"../Data/";

+ Recent posts