boostcource
모두를 위한 컴퓨터 과학 (CS50 2019) : David J. Malan
www.boostcourse.org/cs11
실습환경 : https://sandbox.cs50.io/
사용자 정의 함수
루프를 이용해서 3번 기침을 출력하는 코드를 작성해보자.
#include <stdio.h>
#include <cs50.h>
int main(void){
for(int i=0; i<3; i++){
printf("Cough!\n");
}
}
// ? Cough!
// ? Cough!
// ? Cough!
위 처럼 main 안에서 명령어를 전부 작성해 실행할 수 있지만
만일 지금과 같이 단순히 기침 출력하는 명령 뿐만 아니라 여러가지 명령을 수행한다면?
기침-A작업-B작업-기침-C작업-기침 과 같이 여러 작업 사이에서 반복할 거라면?
해당 코드를 계속해서 적어주는 것 보다는
따로 어딘가에 작성 한 뒤, 필요할 때마다 소환해서 사용하는 방법을 고려해 볼 수 있다.
이렇게 우리가 만든 함수를 사용자 정의 함수 라고 칭한다.
위 예제도 함수로 한 번 작성해보자.
void cough(void){
printf("Cough!\n");
}
int main(void){
for(int i=0; i<3; i++){
cough();
}
}
// ? Cough!
// ? Cough!
// ? Cough!
"void 함수명(void){ 해야할 작업 }" 형태로 함수를 작성할 수 있다.
위는 cough라는 기침하는 함수를 생성한 예시이다.
그리고 루프문 안에서 "가져올 함수명()" 형태인 cough() 를 작성해서 위 함수를 소환 할 수 있다.
이렇게 사용자 정의 함수를 이용함으로써
해당 함수가 어떻게 구현되어 있는지 알 필요 없이 코드의 기능에만 집중해 사용할 수 있는데, 이를 추상화라고 한다.
그리고 프로그램의 코드는 간결해져 가독성이 올라가고
기능을 재사용하고 유지보수하기가 쉬워진다는 장점이 있다.
함수 프로토타입
사용자 정의 함수가 점점 여러개 생겨나면 문제가 하나 생기는데
메인 함수가 사용자 정의 함수들 아래로 점점 내려가 보기 어려워진다는 것이다.
C언어의 특성상, 위에서 함수를 선언해주지 않으면 아래에서 해당 함수를 사용할 수 없다.
이를 해결하기 위해서
사용자 지정 함수 맨 윗줄인 void 함수명(void) 만 세미콜론(;) 을 붙여 main 함수 위에 작성해주고
함수의 내용은 아래에서 작성하는 눈속임과 같은 방법이 있다.
이 한 줄을 함수 프로토타입이라고 말한다.
void cough(void);
int main(void){
for(int i=0; i<3; i++){
cough();
}
}
void cough(void){
printf("Cough!\n");
}
예제를 조금 더 업그레이드 시켜보자.
이제는 main 함수 내에서 3번 반복시키는 것이 아닌 cough 함수 내에서 3번 반복시킬 것이다.
for문을 cough 함수 안으로 넣고
대신에 몇 번 반복시킬지에 대한 횟수를 main 함수 내에서 선언해 cough로 넘겨주려 한다.
즉, 횟수를 매개변수로 전달해줄 것이다.
void cough(int n);
int main(void){
cough(2);
}
void cough(int n){
for(int i=0; i<n; i++){
printf("Cough!\n");
}
}
// ? Cough!
// ? Cough!
cough(반복할 횟수); 명령어를 통해 횟수(매개변수) cough로 전달할 수 있다.
cough는 이 횟수를 정수 n으로 받아 for문 내에서 활용한다.
그리고 함수 프로토타입도 void cough(void); 대신에 void cough(int n); 으로 동일하게 변경해주면 완료다.
중첩 루프
이전까지는 한 줄짜리 printf를 했다면,
이번에는 n줄 짜리, 즉 2차원으로 정사각형 모양으로 별(*)을 찍어볼 것이다.
앞서 루프를 배웠는데 이 루프는 한 번만 사용 가능한 것이 아니라 루프 안에 루프를 또 사용할 수 있다.
정수 n을 이용해서 nxn 사이즈의 별상자를 만들어보자
#include <cs50.h>
#include <stdio.h>
int main(void){
int n = 4;
for(int i=0; i<n; i++){
for(int j=0; j<n; j++){
printf("*");
}
printf("\n");
}
}
// ? ****
// ? ****
// ? ****
// ? ****
1) 먼저 j를 이용해서 4번 반복해 printf("*")를 입력하고 => ****
2) 그 다음 j루프를 탈출해서 printf("\n")를 해 줄을 바꿔준다. => ****\n
3) 그리고 i=1이 되어 다시 j루프 안에 들어간다.
i루프 역시 4번 반복되기에 결과적으로 4x4 정사각형 별상자를 만들어낼 수 있게 된다.
cs50.h 의 get_int 함수를 이용해서
다음과 같이 정사각형의 사이즈를 직접 받아 정사각형 별상자를 만들 수도 있다.
#include <cs50.h>
#include <stdio.h>
int main(void){
int n;
do {
n = get_int("Size: ");
} while (n < 1);
for(int i=0; i<n; i++){
for(int j=0; j<n; j++){
printf("*");
}
printf("\n");
}
}
// ? Size:
// > 4
// ? ****
// ? ****
// ? ****
// ? ****
루프 방식 중 하나인 do ~ while 을 이용해서, 양의 정수(n>1) 로 사이즈를 사용자로부터 입력 받은 뒤
해당 사이즈를 갖는 별 상자를 출력할 수 있다.
'CS > CS50' 카테고리의 다른 글
[CS][CS50] 배열 - 컴파일링 / 디버깅 / 코드의 디자인 (0) | 2023.05.26 |
---|---|
[CS][CS50] C언어 - 하드웨어의 한계 (2) | 2023.05.26 |
[CS][CS50] C언어 - 자료형, 형식 지정자, 연산자 (0) | 2023.05.09 |
[CS][CS50] C언어 - C 기초 / 문자열 / 조건문과 루프 (0) | 2023.04.25 |
[CS][CS50] 컴퓨팅 사고 - 알고리즘 (0) | 2023.04.23 |