728x90
9.1 함수가 필요할 때
- 함수가 언제, 왜 필요하고 어떻게 쓰는가? : 기능 확장이 필요한 경우, 같은 코드들이 반복될 때 사용
- 함수 사용에 익숙해지면 C++, Python등의 객체지향 언어를 사용할 때 편리함
프로그램 작성시 고려 사항
- 일반화 + 확장성 : 더 많은 경우에서 쉽게 동작하도록 함
- 같은 기능이 여러번 나오지 않도록 함 : 같은 기능이 여러번 나오면 유지, 보수가 어려움
- 함수의 기본 형태
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 함수부터 시작
- main문에서는 위에서 정의된 함수를 사용
- 컴파일러는 위에서부터 아래로 코드를 읽는데, 본적 없는 함수의 호출이 나옴 -> Error 발생
- 컴파일러에게 함수의 정보를 알려주는 코드 필요 -> Function 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
https://www.inflearn.com/course/following-c/dashboard
'Study_C, C++ > 홍정모의 따라하며 배우는 C언어' 카테고리의 다른 글
[홍정모의 따라하며 배우는 C언어] 9.3 함수의 자료형과 반환값 (0) | 2024.06.17 |
---|---|
[홍정모의 따라하며 배우는 C언어] 8.9 텍스트 파일 읽기 (0) | 2022.03.23 |
[홍정모의 따라하며 배우는 C언어] 8.8 메뉴 만들기 예제 (0) | 2022.03.19 |
[홍정모의 따라하며 배우는 C언어] 8.7 입력 스트림과 숫자 (0) | 2022.03.07 |
[홍정모의 따라하며 배우는 C언어] 8.6 입력 확인하기 (0) | 2022.03.06 |