사용자 정의 함수는 말 그대로 내 맘대로 함수를 정의해서 쓰겠다는 것이다.
예를 들어보자.
코드의 내용은 굉장히 쉽다. "cough"를 3번 하라는 것이다.
일단 얘를 좀 더 간지나게 쓸 수 있다.
저번에 배웠던 반복문이다.
for 루프를 통해서 3번을 실행하게 만들면 된다.
여기까지는 복습 차원이다.
뭔가가 바뀌었다.
printf하는 부분을 cough라는 함수로 선언하여 대체해주었다.
for 루프를 돌면서 i<3이면 cough 라는 함수를 실행할 것이다.
cough 함수의 앞과 소괄호 안에 void가 써져있는데 아무것도 리턴하지 않고 변수를 받지 않는다는 뜻이다.
하지만 이 방식에는 문제가 있다.
main 안에 사용할 함수를 계속 위로 쌓아올리다보면 main이 뒤로 밀려서 스크롤을 해야 볼 수 있는 상황이 펼쳐진다. 코드를 작성하는 것은 결국 어떤 문서를 읽는 것과 똑같기 때문에 중요한 내용이 뒤에 있으면 매우 불편하다.
그럼 main을 앞으로 꺼내면 되는 거 아니야?
그러면 아마 개같이 에러가 나올 것이다.
C는 그렇게 똑똑하지 못해서 뒤에 나오는 애를 불러들이지 못한다.
cough()라고 실행해도 뒤에 그 내용이 있을거라고 애가 읽지를 못한다.
하지만 방법은 있다.
약간 야매적인 방법이다.
cough라는 함수 이름만 먼저 불러주는 것이다. C는 cough라는 함수를 이미 한 번 본 것으로 간주하여 main 함수에 나올 때까지 코드를 계속 읽도록 하는 것이다.
cough 선언 -> cough 함수 내용 읽고 -> main 안에서 실행
이런 순서로 간다.
이 코드는 어떻게 되는 걸까.
cough가 어떤 정수 변수 n을 받는다. 그리고 n 값에 따라 for 루프가 몇 번 돌지 결정된다.
좀 더 다이나믹하게 바뀌었다.
좀 더 복잡한 코드가 나왔다.
일단 함수명을 보니 어떤 양의 정수를 리턴하는 함수인 것 같다.
함수의 내용을 보자.
n이라는 변수만 선언을 하고
do?? 이런 애가 있다.
do-while 구문이다.
while의 조건에 따라서 do 안에 있는 내용을 실행하는 것이다.
기본적으로 while문과 크게 다르지 않지만 가장 중요한 차이는 무조건 한 번은 실행한다는 것이다.
위의 코드에서는 1차적으로 get_int로 n에 값을 할당한다.
그리고 n<1이면 다시 get_int로 n에 새로운 값을 할당해주어야 하고
n>=1이면 do-while 구문은 끝이 나고 n값을 return 한다.
뭔가 더 복잡해진 코드다.
do-while에 더해 for이 여러개 보인다.
do-while의 내용은 이제 이해가 된다.
일단 get_int로 숫자를 받아서 n<1인지 아닌지에 따라서 다시 입력값을 넣어줘야되던지 n 값에 할당을 하던지 둘 중에 하나다.
그 다음 for 문을 보자.
그냥 보면 헷갈릴 수도 있으니 예시를 들면서 생각을 해보자.
i=0 일때, 안에 있는 for 루프가 돌게 된다.
#을 n개 만큼 print 할 것이다.
그다음 \n을 통해서 행을 넘긴다.
그러면 i로 되어있는 for 루프는 한 바퀴가 돌았고 그걸 i=1,2,3...일 때 계속 실행하는 것이다.
그럼 결과는 어떻게 될까?
#으로 구성된 n*n 짜리 정사각형이 print될 것이다.
for 안에 for가 있어 헷갈릴 수 있지만 차근차근 생각해보면 별거 아니다.
오늘 배운 것
- C에서 함수 선언 및 실행 방법
- do while 구문
- 중첩 for 루프
'스터디 > CS50' 카테고리의 다른 글
하버드 cs50 2장 6) 하드웨어의 한계 (0) | 2023.02.11 |
---|---|
하버드 CS50 2장 4) 자료형, 형식 지정자, 연산자 (0) | 2023.01.15 |
하버드 CS 50 2장 3) 조건문과 루프 (0) | 2023.01.15 |
하버드 CS50 2장 2) 문자열 (1) | 2023.01.15 |
하버드 CS50 2장 1) C 기초 (0) | 2023.01.14 |