본문 바로가기

Study_C, C++/홍정모의 따라하며 배우는 C언어

[홍정모의 따라하며 배우는 C언어] 9.1 함수가 필요할 때 ~ 9.2 함수의 프로토타입

728x90

9.1 함수가 필요할 때

  • 함수가 언제, 왜 필요하고 어떻게 쓰는가? : 기능 확장이 필요한 경우, 같은 코드들이 반복될 때 사용
  • 함수 사용에 익숙해지면 C++, Python등의 객체지향 언어를 사용할 때 편리함

 

프로그램 작성시 고려 사항

  1. 일반화 + 확장성 : 더 많은 경우에서 쉽게 동작하도록 함
  2. 같은 기능이 여러번 나오지 않도록 함 : 같은 기능이 여러번 나오면 유지, 보수가 어려움

 

- 함수의 기본 형태

return_type function_name (arguments){
   Funciton body
    -----
    -----
    return return_variable
}
  • return type : 함수가 반환(출력)하는 변수의 자료형
    • 함수 선언시 return type 부분이 비어있다면 그 함수의 return type은 void. 즉, 아무것도 반환하지 않는다는 뜻 
  • function name : 함수의 이름
  • arguments : 함수가 사용할 인자들
  • Function body : 함수의 정의 부분
  • return return_variable : 함수가 반환할 값

 

  • 별을 20개 출력하고, 그 사이에 이름과 주소를 중간 정렬하여 출력하는 프로그램
#include <stdio.h>

main() {
	printf("********************\n");
	printf("   Example_Name\n");
	printf("   Seoul, Korea\n");
	printf("********************\n");
}
Output : 
********************
   Example_Name
   Seoul, Korea
********************
  • 위 코드의 경우 위에서 설명한 프로그램 작성 시의 고려사항을 전혀 적용하지 않음

 

#include<stdio.h>

#define width 20
#define name "Example_Name"
#define address "Seoul, Korea"

printstar(int num) {		// 입력받은 숫자만큼 별 출력
	for (int i = 0; i < num; i++)
		printf("*");
	printf("\n");
}
printname() {
	printf("   %s\n",name);
}
printadd() {
	printf("   %s\n",address);
}

main() {
	printstar(width);
	printname();
	printadd();
	printstar(width);
}
Output : 
********************
   Example_Name
   Seoul, Korea
********************
  • 위와 같이 함수를 사용하여 같은 코드를 줄이면 구조가 간단해지고 유지, 보수가 편해짐
  • 그러나 위 프로그램은 별의 갯수가 달라지면 글자가 중간으로 가지 못함
Width = 30인 경우의 Output : 
******************************
   Example_Name
   Seoul, Korea
******************************

 

  • 함수를 통해 입력받은 문자열이 중간으로 가게 함
#include<stdio.h>
#include<string.h>		// strlen 사용
#include<stdbool.h>		// bool type variable 사용

#define width 30
#define name "Example_Name"
#define address "Seoul, Korea"

print_multiple_chars(char c, int num_stars,bool newline) {	
// bool type 변수를 통해 줄바꿈 여부 판단
	for (int i = 0; i < num_stars; i++)
		printf("%c", c);
	if (newline)		// newline != 0이면 줄을 바꿈
		printf("\n");
}
print_centered_string(char string[]) {
	int blank = (width - strlen(string)) / 2;	// 문자열을 중간정렬 시킴
	print_multiple_chars(' ', blank, 0);
	printf("%s\n", string);
}

main() {
	print_multiple_chars('*', width, 1);

	print_centered_string(name);
	print_centered_string(address);
	print_centered_string("Hello, World!");

	print_multiple_chars('*', width, 1);
}
Output : 
******************************
         Example_Name
         Seoul, Korea
        Hello, World!
******************************
  • 위와 같이 함수를 사용하면 코드가 더 복잡해 보일 수 있으나 확장성이 좋음
    • 어떤 문장을 입력해도 별의 중간으로 정렬해줌

 

9.2 함수의 프로토타입

- 함수를 main문의 아래에 쓸 경우 필요한 부분

위처럼 main문 위에 함수의 선언, 정의가 없으면 위와 같이 error 발생

  • 프로그램은 main 함수부터 시작
    • main문에서는 위에서 정의된 함수를 사용
  • 컴파일러는 위에서부터 아래로 코드를 읽는데, 본적 없는 함수의 호출이 나옴 -> Error 발생
  • 컴파일러에게 함수의 정보를 알려주는 코드 필요 -> Function Prototype

 

코드에 함수의 prototype만 있고 정의는 없는 상태

  • Build는 진행되나 Linking Error 발생
  • Build = Compile + Linking
  • Compile 단계에서는 Function Prototype을 가지고 compile을 함
  • 그 다음 Linking 단계에서 실제로 함수를 연결해야 하는데, 이 때 실제로 연결할 함수가 없어 Error 발생

* Compile, Linking 개념 중요하므로 헷갈리면 앞 강의 복습

 

  • main문 위에 Function Prototype, 아래에는 Function Definition을 작성
  • 주 기능들은 main문에 있으므로 아래와 같이 작성하면 코드를 읽기에도 편함
#include<stdio.h>
#include<string.h>
#include<stdbool.h>

#define width 30
#define name "Example_Name"
#define address "Seoul, Korea"

print_multiple_chars(char, int, bool);		// Function Prototype
void print_centered_string(char string[]);

main() {		
	print_multiple_chars('*', width, 1);	// Actual argument/parameter : 실제로 들어가는 값들
						// 함수 호출시 인자에 변수가 아닌 특정한 값을 넣어줌
	print_centered_string(name);
	print_centered_string(address);
	print_centered_string("Hello, World!");

	print_multiple_chars('*', width, 1);		
}

print_multiple_chars(char c, int num_stars, bool newline) {	// Formal parameter/argument : 형식상의 값들
	for (int i = 0; i < num_stars; i++)
		printf("%c", c);
	if (newline)
		printf("\n");
}
void print_centered_string(char string[]) {
	int blank = (width - strlen(string)) / 2;
	print_multiple_chars(' ', blank, 0);
	printf("%s\n", string);
}
Output : 
******************************
         Example_Name
         Seoul Korea
        Hello, World!
******************************
  • 위와 같이 Function Prototype에는 함수의 입/출력 정보가 담겨있음
    • 어떤 변수가 입력되고 어떤 변수를 출력(반환)하는가
    • 따라서 prototype에는 위처럼 인자의 type 정보만 있어도 됨 (어떤 자료형이 들어오고 나가는지만 알면 컴파일 가능)
  • 함수 호출시 괄호 안의 값들은 보통 argument, 함수 선언시 괄호 안의 값들은 parameter라고 함
  • 자료형이 써있지 않은 경우 그 함수의 return type은 void. 즉, 아무것도 반환하지 않는다는 뜻
    • 따라서 두 함수의 return type은 모두 void

 

위의 과정을 통해 Function Prototype을 만들 수도 있음. 그 후 Body는 복사하여 main문 아래에 선언

 

 

 

 

 

 


https://www.inflearn.com/course/following-c/dashboard

 

홍정모의 따라하며 배우는 C언어 - 인프런 | 강의

'따배씨++'의 성원에 힘입어 새롭게 개발된 C 언어로 시작하는 프로그래밍 입문 강의입니다. '따배씨'와 함께 프로그래밍 인생을 업그레이드 해보세요., - 강의 소개 | 인프런...

www.inflearn.com