본문 바로가기

공부/C언어

(C 예제) 함수 정리 및 예제, static 변수

전달인자 반환 값 모두 있는 경우

// 전달인자 반환 값 모두 있는 경우
int a (int num1, num2)
{
	int num3 = num1 + num2;
    return num3;
}

함수의 이름은 a

전달인자는 num1, num2

반환 값은 num3


// 절대값으로 바꿔주는 함수 예제
#include <stdio.h>

int AbsNum(int num)
{
	if (num > 0)
		return num;
	else
		return (-1) * num;
}

void main(void)
{
	int a, b;
	int n;

	printf("정수 입력: ");
	scanf("%d %d", &a, &b);

	n = AbsNum(a);
	printf("%d의 절대값은 %d\n", a, n);
	printf("%d의 절대값은 %d", b, AbsNum(b));
}

함수의 이름은 AbsNum

전달인자는 num

반환 값은 num 또는 (-1)*num


전달인자와 반환 값이 없는 경우

//전달인자와 반환 값이 없는 경우
void a(void)
{
	printf("a");
}

인자전달과 반환 값이 모두 없다.


//전달인자와 반환 값이 모두 없는 경우 예제
#include <stdio.h>

void Print1(void)
{
	printf("print1함수\n");
}

void Print2(void)
{
	printf("print2함수\n");
}

void main(void)
{
	Print1();
	Print2();
}

전달인자 또는 반환 값 둘 중 하나만 있는 경우

// 인자전달은 있지만 반환 값이 없다.
void a(int num)
{
	printf("a");
}

인자전달은 있지만 반환 값이 없다.


// 전달인자는 있는데, 반환 값은 없는 경우 예제
#include <stdio.h>

void SquaredCalc(int n)
{
	printf("%d\n", n * n);
}

void main(void)
{
	SquaredCalc(5);
	SquaredCalc(12);
}

// 인자전달은 없지만 반환 값이 있다.
int b(void)
{
	int num;
    scanf("%d", &num);
    return num;
}

인자전달은 없지만 반환 값이 있다.


// 전달인자는 없지만, 반환 값은 있는 경우 예제
#include <stdio.h>

int GetNum(void)
{
	int n;

	printf("정수 입력: ");
	scanf("%d", &n);

	return n;
}

void main(void)
{
	int num1, num2;

	num1 = GetNum();
	printf("입력된 정수는 %d\n\n", num1);

	num2 = GetNum();
	printf("두 번째 입력된 정수는 %d\n\n", num2);
}

위의 경우를 다 쓰까한 예제

앞전에 했던 예제 중 하나인 가위바위보 응용으로 해보았다.

 

근데 하다보니 인자전달과 반환 값이 둘다 존재하는 함수가

필요없어서 그냥 어거지로 중간에 하나 넣어봤다. ㅎ.....

 

// 다 쓰까한 예제
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int RandNum(void) // 인자전달 x, 반환 값 o
{
	srand((int)time(NULL));
	return rand() % 3;
}

void Guide(void) // 인자전달 x, 반환 값 x
{
	printf("컴퓨터는 준비가 되었습니다.\n\n");
}

int InputNum(void) // 인자전달 x, 반환 값 o
{
	int UserNum;

	printf("당신은 0. 가위, 1. 바위, 2. 보 중에서 무엇을 내실건가요? 숫자로 적어주세요. ");
	scanf("%d", &UserNum);
	
	return UserNum;
}

void Calc(int num1, int num2) // 인자전달 o, 반환 값 x
{
	if (num1 == (num2 + 1) % 3)
	{
		printf("컴퓨터 %d 사용자 %d로 사용자가 이겼습니다.\n", num2, num1);
	}

	else if (num1 == (num2 + 2) % 3)
	{
		printf("컴퓨터 %d 사용자 %d로 사용자가 졌습니다.\n", num2, num1);
	}
	else if (num1 == num2)
	{
		printf("컴퓨터 %d 사용자 %d로 비겼습니다.\n", num2, num1);
	}
	else
	{
		printf("올바른 값을 넣어주세요.\n");
	}
	printf("\n게임을 종료합니다.\n");
}

int Add(int num1, int num2) // 인자전달 o, 반환 값 o
{
	return num1 + num2;
}

void AddResult(int num) // 인자전달 o, 반환 값 x
{
	printf("\n\n사용자의 숫자와 컴퓨터의 숫자의 합은 %d입니다.\n", num);
}

void main(void)
{
	int ComNum;
	int UserNum;
	int result;

	ComNum = RandNum();

	Guide();
	UserNum = InputNum();

	Calc(UserNum, ComNum);

	result = Add(UserNum, ComNum);
	AddResult(result);
}

 

while이랑 break로 쫌 더 다듬을까 했지만 귀찮아졌다...


알아둬야 할 것들

 

▶printf 함수도 값을 반환한다.

단지 반환 값이 필요없기 때문에 저장하지 않을 뿐이다.

반환하면 출력된 문자열의 길이가 반환된다.

return은 값의 반환과 함수의 탈출 두 가지 기능이 있다.

그래서 return을 반환하지 않고 함수를 나가는 용도로 사용할 수 있다.

예시

▶함수의 위치

컴파일은 위에서부터 아래로 진행되기 때문에 함수의 배치 순서가 중요하다.

앞서 컴파일되지 않은 함수는 호출할 수 없다.

정상적인 순서
비정상적인 순서

 

 

나중에 나오는 함수를 부르고 싶으면 먼저 함수를 선언하면 된다.

int a(int)도 가능. 매개변수는 생략가능.

▶함수 내에서 선언되는 변수는 지역변수이다.

다른 함수에서 동일한 변수 선언이 가능하다.

해당 함수를 빠져나가면 지역변수는 소멸된다.

 

tmi) for문 중괄호 안에서 선언된 변수도 지역변수이다.

▶매개변수도 지역변수 중 하나이다.

선언된 함수 내에서만 접근이 가능하다.


전역변수는 프로그램 전체에 관여하기 때문에 사용이 비추천된다.

대신 함수 밖에서도 접근해야하는 변수가 필요할 때는 static 변수를 사용한다.

static 변수는 함수를 빠져나가도 메모리 공간에 계속 존재한다.

 

아래는 간단한 예제이다.

// static 변수 예제
#include <stdio.h>

void a()
{
	static num = 0;
	printf("%d\n", num);

	num++;
}

void main(void)
{
	a();
	a();
	a();
	a();
	a();
}

static 변수는 접근의 범위가 전역변수보다 좁기 때문에 변수가 메모리공간에 남아야 한다면,

static 변수가 훨씬 낫다.