선언부와 정의부

-> 프로그램 실행 시 가장 먼저 호출되는 함수는 main함수이다.

-> 하지만, 여러가지 함수를 정의할 경우 main의 위치는 아래로 내려가게 된다.

(main함수는 프로그램 진입점을 나타내는 함수이기 때문에 상단에 배치하는 것이 좋다.)

-> 이를 해결하기 위해 선언부와 정의부를 나눠보자.

 

선언부

-> main함수에게 자신이 존재한다고 알리는 역할

-> 함수의 몸체가 없고 정보만 알려준다.

-> 반환타입이 무엇인지, 이름이 무엇인지, 매개 변수가 몇개이며 무엇인지

-> 반환 타입 + 함수이름 + 인자 정보만 알려준 후 세미콜론으로 마무리 짓는다.

 

정의부

-> 선언부에서 작성한 함수의 몸체를 구현한 부분

-> 정의부가 있어야만 정상적으로 프로그램을 실행할 수 있다.

-> 선언부에서 작성한 함수의 정의부가 없을 경우 정상적인 코드를 수행할 수 없다.

 

사용 예)

위의 코드를 보았을 때 Add 함수를 찾을 수 없어서 컴파일을 할 수 없다.

-> 이런 경우 Add함수를 main함수 위에다가 작성을 해야 하는데,

-> 그렇게 하게되면 main 함수는 Add함수의 아래로 이동하게 되고,

-> 함수가 만약 여러개가 존재 할 경우 main함수는 쭉 내려가게 되면서 한 눈에 보이지 않게 된다.

-> 이를 해결하기 위해서 선언부와 정의부가 있는 것이다.

 

다음과 같이 선언부와 정의부를 나누게 되면 main함수 위에다가 함수를 정의할 필요가 없게 된다.

 

 

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

C++ 재귀 함수  (0) 2020.08.25
C++ 함수 오버로딩, 디폴트 매개 변수  (0) 2020.08.25
C++ 지역 변수, 전역 변수, 정적 변수(static)  (0) 2020.08.24
C++ 함수란?  (0) 2020.08.24
C++ 난수(rand, srand)  (0) 2020.08.20

지역 변수와 전역 변수
-> 함수를 구현할 때 사용한 {} 를 기준으로
-> 내부에 선언되어 있으면 지역 변수
-> 외부에 선언되어 있으면 전역 변수

지역 변수와 전역 변수의 차이점
-> 메모리에 상주하는 기간의 차이
-> 변수에 접근할 수 있는 범위

#1. 지역 변수 
-> 메모리에 상주하는 기간

-> 함수가 시작되고, 종료될 때까지만 메모리에 상주한다.
-> 변수에 접근할 수 있는 범위
-> 해당 stack에 선언된 변수만 접근할 수 있다!

-> 지역 변수와 매개 변수는 함수가 시작 되었을 때 할당 시점에 들어가고, 종료 되었을 때 소멸 시점에 들어가게 되며,

-> 후입 선출형 구조(LIFO(Last-In, First-Out)로 되어있다.

 

다음과 같은 상황에 대해서 알아보자.


여기서 a와 b는 main함수의 stack 영역에 할당이 된다.

-> Result는 Add함수의 stack 영역에 할당이 된다.
-> 변수에 접근할 수 있는 범위로 인해
-> main함수에서는 Result의 존재를 모르며,
-> Add함수에서는 a와 b의 존재를 모르는 상황이다.

-> 컴퓨터는 하나의 Stack만 확인한다.

 

전역 변수

-> 어떠한 지역 내부에도 포함되어 있지 않다.

-> 어디서든 접근이 가능하다.

-> 프로그램이 시작되면 메모리에 등록, 종료되면 메모리에서 소멸된다.

-> Data 영역에 할당이 된다.

 

 

전역 변수와 지역 변수의 이름이 같을 경우
-> stack 영역을 우선적으로 확인
-> 변수가 있으면 지역 변수에 접근한다.
-> 변수가 없으면 전역 변수에 접근한다.

 

static 변수(정적 변수)

-> 자료형 앞에 static 키워드를 명시하면 정적 변수가 된다.

-> 정적 변수는 지역적인 특성과 전역적인 특성을 동시에 가진다.

-> 지역적인 특성으로는 해당 지역에서만 접근이 가능하다.

-> 전역적인 특성으로는 Data영역에 메모리가 등록되므로,

-> 프로그램 시작 시 메모리에 등록되고, 프로그램 종료 시 메모리에서 소멸한다.

 

다음과 같이 변수를 만들어서 확인 해보자.

 

지역 변수

int Func()
{
	int a = 0;

	++a;

	return a;
}

void main()
{
	for (int i = 0; i < 5; ++i)
	{
		cout << Func() << endl;
	}
}

정적 변수

int Func()
{
	static int a = 0;

	++a;

	return a;
}

void main()
{
	for (int i = 0; i < 5; ++i)
	{
		cout << Func() << endl;
	}
}

지역 변수와 정적 변수를 놓고 보았을 때 결과는 서로다르다.

지역 변수

정적 변수

결과가 다른 이유

-> static을 통해 정적 변수가 되면 초기화 구분은 프로그램 실행 시 최초 1회만 적용이 되기 때문이다.

 

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

C++ 함수 오버로딩, 디폴트 매개 변수  (0) 2020.08.25
C++ 함수의 선언부, 정의부  (0) 2020.08.25
C++ 함수란?  (0) 2020.08.24
C++ 난수(rand, srand)  (0) 2020.08.20
C++ 반복문(for, while, do ~ while), goto 문  (0) 2020.08.19

함수

-> input이 있으면, Output이 있는 것.

-> 수학적인 의미의 함수로는 y = f(x)가 있다.

-> 여기서 f는 Function의 약자이며. "기능"이라고 한다.

 

함수를 사용하는 이유

#1 재사용성

-> 함수를 한 번 만들어 놓으면 언제, 어디서든 사용자가 원할 때 불러와서 사용할 수가 있다.

 

#2 협업

-> 여러 사람들과 협업을 할 때 주로 사용을 한다.

 

함수의 종류 4가지
#1. Input이 있고, Output이 있다.
-> y = f(x), 빵공장, 라면공장 등

#2. Input이 있고, Output이 없다.
-> srand(시드값), system(문자열)

#3. Input이 없고, Output이 있다.
-> int iA = rand()

#4. Input이 없고, Output이 없다.
-> main 함수

 

함수의 형태

 

반환타입(int, float, void) 함수이름(PlayerCtrl) (인자 / 매개변수 / 파라미터)

{

기능 구현

}

 

반환타입 : 함수를 수행 후 가공된 결과를 내보낼 것이 있을 때 명시한다.
반환할 데이터의 자료형을 명시해주면 된다.
반환할 데이터가 없을 경우 void라고 명시한다.

 

함수이름

-> 말 그대로 함수의 이름이다.
-> 함수가 수행하는 기능을 뜻하는 이름으로 지어주는 것이 좋다. 

매개변수

-> 함수를 구현(가동)하는데 필요한 재료들을 명시할 수 있다.
-> 변수 하나당 자료형 하나씩 매칭하여 필요한 만큼 명시해주어야 한다.

기능구현

->함수의 기능을 작성하는 공간이다.

 

return
-> 코드 라인을 수행 중 return을 만나면 해당 함수가 종료된다.
-> 반환 타입이 void가 아닐 경우에는 return 뒤에 반환할 데이터를 명시해야한다.
-> 반환 타입이 void일 경우에는 return뒤는 생략이 가능하다.

 

함수 호출
-> 함수명 + 함수 호출 연산자
-> 함수 호출 연산자 : ()
-> 만약, 매개 변수에 넘겨줄 데이터가 있을 경우 ()안에 순차적으로 나열해준다.

 

사용 예)

#include <iostream>
using namespace std;


int Add(int _a, int _b)
{
	int Result = _a + _b;

	return Result;	
}

void main()
{
	int a = 10;
	int b = 20;

	Add(a, b);

	cout << Add(a, b) << endl;
}

난수 (random)
-> 순서나 규칙이 없는 무작위 수
->아이템 강화, 랜덤 박스, 크리티컬 확률 등
-> 확률이 적용되는 모든 것에 난수가 사용된다.

 

 

난수 추출 함수

-> rand()

-> rand함수를 사용하면 난수가 추출된다,

-> 단, 실행 할 때마다 같은 결과가 도출된다.

-> 위험한 상황이 발생할 수 있다.

 

 

난수 추출 시 같은 결과가 나오는 이유
-> 난수 추출 시 컴퓨터는 seed 값을 확인하여
-> 해당 seed 값에 있는 난수를 순차적으로 추출해준다.
-> 사용자가 seed 값을 변경하지 않을 경우 기본적으로 1의 값을 가진다.
-> 이로 인해 프로그램을 다시 실행할 경우에는 중복된 숫자가 보인다.

 


seed 변경
srand(시드값) -> srand(12);
단, 시드 값을 변경한다해도 고정된 숫자가 추출되는 것은 동일하다!
이를 해결하기 위해 프로그램을 실행할 때마다 시드 값을 변경해줄 필요가 있다.

 

중복되지 않는 seed값
시간
-> 하루 단위, 한달 단위, 일년 단위 등 기간이 정해지면 중복된 숫자가 나올 수 있다.
-> 이를 방지하기 위해 기간을 설정하지 않고 계속해서 누적해나가는 시간이 필요하다!
-> 누적해 나간다 라는 말은 기준 시간이 필요하다.
-> 1970년 1월 1일부터 시간을 누적하고 있다.

 

누적한 시간을 확인하는 함수
-> time(0)
-> 단, time함수를 사용하기 위해서는 #include <time.h> 추가가 필요하다.

srand(unsigned(time(NULL)));

 

 

rand함수가 추출해주는 범위
-> 0 ~ 32767까의 범위에서 추출해준다

 

srand 사용 시 주의 사항
-> srand를 이용하여 seed값을 변경하면 추출 순서가 초기화 된다.
-> srand는 main 함수에 최초 1회만 선언해주면 된다.

-> 만약 여러번 선언을 하게 되는 경우 seed 값의 초기화가 여러번 진행되어 문제가 발생할 수 있다.

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

C++ 지역 변수, 전역 변수, 정적 변수(static)  (0) 2020.08.24
C++ 함수란?  (0) 2020.08.24
C++ 반복문(for, while, do ~ while), goto 문  (0) 2020.08.19
C++ 분기문(if, else if, else, switch)  (0) 2020.08.19
C++ 형변환  (0) 2020.08.18

+ Recent posts