스터디/CS50

하버드 CS50 2장 5) 사용자 정의 함수, 중첩 루프

공대생철이 2023. 1. 25. 12:06
728x90

사용자 정의 함수는 말 그대로 내 맘대로 함수를 정의해서 쓰겠다는 것이다.

 

예를 들어보자.

 

코드의 내용은 굉장히 쉽다. "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 루프

728x90