본문 바로가기
Computer Science

[C언어] 사용자 정의 함수, void와 return

by DuncanKim 2022. 6. 23.
728x90

[C언어] 사용자 정의 함수, void와 return

(???) : 스파게티 소스를 생성하고 있다

기본 기능만 주구장창 사용할 것이 아니라면, 사용자 정의 함수를 알아야 한다.그렇게 해야 내가 원하는 대로 코드를 마음대로 가지고 놀고 일부 코드를 가지고 엄청난 계산 괴물을 만들어 낼 수도 있다.아니면 서비스 공룡을 만들어낼 수도 있고.

 

사용자 정의 함수는 그러기 위해 만들어졌다.

'더 간편하고', '복사하기 붙여넣기를 하지 않고', '더 고도의 능력을 구현하기 위해'

 

아래에서는 C언어에서 사용자 함수를 정의하는 법과 실행하는 법, 그리고 void형 함수와 void가 아닌 함수의 차이점을 알아볼 것이다.

 

 

 

1. 기본 정의 방법

/*
함수 타입 함수명(매개변수){
	실행 코드
    return 0;
}
*/

void a() {
	for(int i = 0; i < 10; i++){
		printf(“ ”);
	}
}

/* 메인에서 실행방법(같은 클래스 안에 구현했을 경우)
함수명(매개변수);
*/

int main(){
	a(); //실행
	b();
	return 0;
}

 

이런 식으로 반복문을 실행하는 함수를 만들 수 있다. 매개변수는 넣어도 되고 안 넣어도 된다.

 

 

만약, 몇 번 반복할 지를 함수 호출 시에 정하고 싶다면, ‘매개변수’를 추가하면 된다.

매개변수는 함수 내에서 지역변수로 활용되어 값을 구해준다.

void a(매개변수) {
	for(int i = 0l i < 매개변수 명; i++){
	printf(“ ”);
	}
}

int main(){
	a(인자); //실행
	b();
	return 0;
}

 

만약 함수 a를 실행할 때 매개변수와 타입이 일치하는 값을 넣어준다면, 매개변수가 그 인자를 받아들여서 함수 내의 지역변수로 사용한다. 예를 들어 int i 가 매개변수로 설정되어 있다면, 인자에 5를 넣어주면, 5번 반복하는 반복문이 만들어지는 것이다.

 

 

<활용해보기>

void a(매개변수, 매개변수) {
	char* hello;
	switch(lang_code){
		case 0:
			hello = “안녕”
			break;
		case 1:
			hello = “곤니찌와”
			break;
			…
	}

	for(int i = 0; i < 매개변수 명; i++){
		printf(“%s\\n”, hello);
	}
}

위와 같은 함수를 쓰면, 매개 변수를 각각 1, 10 이렇게 넣는다고 하였을 때, “곤니찌와”가 10번 출력된다.

 

 

 

한편, 함수는 동일한 이름, 동일한 매개변수의 값을 가진 것은 만들 수 없다. 그러나 호출은 몇 번이든 가능하다

 

 

++ 참고

C언어는 메소드 '오버로딩'이 불가능하다. 

 

2. void와 리턴

함수의 타입에는 void와 여러 변수의 타입들이 있을 수 있다.

 

 

#include <stdio.h>

int c();
void b();

int main(void) {
	printf("%d", b()); // 오류 : "argument type 'void' is incomplete"
	printf("%d", c()); // 출력 : 3
}

void b(){
	printf("helloworld");
}

int c(){
  return 3;
}

void는 값을 리턴하지 않는 함수이다. 다만 함수 내에서 return; 과 같이 값이 없이 함수를 종료시킬 수는 있다.
다른 함수들은 리턴값을 항상 가지고 있다. 

위의 코드 블럭에서 함수 b는 void 형이다. c는 int 형이다. 이 차이는 printf를 해보면 명확히 알 수 있다.

void 함수의 경우 콘솔에 나타내는 printf가 실행되지 않는다. C에서는 void를 출력할 수 없기 때문이다.

생각해보면 쉽다. printf("helloworld"); 라고 하는 '명령'을 어떻게 출력하겠는가. (컴파일 언어를 출력할 것인가?)printf 는 값을 출력하는 것이지, 그 행위나 동작 자체를 프린트 할 수는 없다.

 

그래서 아래와 같이 요약할 수 있다.

 

void 함수는 어떤 것(대표적으로 함수)을 실행하고 끝나는 함수, 다른 것들은 어떤 특정한 값을 반환해주는 함수라고 생각하면 된다.
주의 : 반환과 콘솔창의 출력을 혼동해서는 안 된다. 리턴을 한다고 해서 콘솔창에 출력이 되는 것은 아니다.

 

++ 
C에서도 printf 함수 안에서 return 값이 있는 함수를 호출해서 그 값을 출력할 수 있다.
단, main 함수 위에서 그 함수의 자료형을 선언해주어야 한다. 메모리 구조상 컴파일러가 그 파일을 먼저 읽고 메모리 배치를 하는데, 나중에 갑자기 함수가 튀어나오면 컴파일러가 그 메모리 공간을 확보해놓지 못하기 때문이다. 한 마디로 갑자기 튀어나와서 놀랜다는 거다. 미리 선언을 해주고 실행을 해주면 return 값이 있는 함수는 프린트가 잘 되어 나오는 것을 알 수 있다.

 

728x90

댓글