본문 바로가기
C/코딩도장

[코딩도장] Unit 60. 함수 사용하기

by 단월໒꒱ 2021. 8. 1.

1. Hello, world! 출력 함수 만들기

프로그래밍 할 때 값만 바뀌고 코드는 반복되는 경우가 많다.

이때, 코드가 길어지고 중간에 실수하는 가능성을 줄이기 위해 함수를 사용할 수 있다.

함수는 main 함수 밖에서 작성해야 한다.

 

반환값자료형 함수이름()

{

       코드;

}

 

 

 

위에서는 반환값의 자료형이 void, 이름은 hello인 함수를 정의하고 printf로 문자열을 출력했다.

여기서 함수의 반환값 부분에 void를 적어주면 함수의 반환값이 없다는 뜻이 된다.

즉, void는 함수의 반환값이 없음을 나타날 때와 포인터로 사용할 때의 의미가 다르다.

 

아래는 위의 상황에서 함수의 실행 순서이다.

 

2. 지역 변수

지역 변수란 함수 안에 선언된 변수를 뜻한다.

지역 변수의 특징은 함수가 끝나면 사라진다는 것인데, 이 때문에 함수 안에 선언된 지역 변수는 함수 안에서만 사용할 수 있고, 함수 바깥에서는 사용할 수 없다.

 

3. 함수 선언과 정의 분리하기

1번에서 다뤘던 hello 함수를 main 함수 아래에 작성하면 hello 함수가 정의되지 않았다고 하면서 컴파일 경고와 에러가 발생한다.

이는 C언어 컴파일러가 위에서 아래로 소스 코드를 해석하는데 main 함수 부분에서 hello 함수에 대한 정보가 없었기 때문이다.

 

이러한 에러를 방지하기 위해 어떤 함수가 있다는 사실을 알려주려면 함수 선언을 해주어야 한다.

함수 형태만 선언하기 때문에 이를 함수 원형이라고 부른다.

 

반환값자료형 함수이름();

 

 

 

이처럼 main 함수 위에서 반환값자료형 함수이름();를 적어주면 이 함수가 존재한다는 것을 알려줄 수 있다.

함수 선언이 된 상태에서는 main 함수 아래에서 함수를 정의해주면 된다.

 

함수 선언과 정의가 분리된 상태에서는 함수 선언 부분을 함수 원형, 함수 정의 부분을 함수 헤더와 함수 본체라고 부른다.

 

 

 

따로 함수 선언이 없으면 함수 정의와 선언이 동시에 이루어진다고 보면 된다.

 

4. 함수 디버깅하기

강의에서는 Visual Studio로 진행했지만 본 노트북에서는 Visual Studio가 없고 Xcode만 있는 상태이므로 강의는 참고만 하고 다른 곳에서 관련 내용을 찾아보았다.

 

일단 시작 전에 디버깅에 관련한 버튼을 몇 개 알아보았다.

 

 

이렇게 빨갛게 표시해둔 5가지 버튼이 있다. 각각의 기능을 간략히 정리하면 다음과 같다.

① Disable / enable breakpoint : 모든 브레이크 포인트 활성화 / 비활성화한다.

② Pause / continue execution : 다음 브레이크 포인트가 나오기 전까지 계속 진행한다.

③ Step over : 한 줄씩 읽어내려간다.

④ Step into : 함수 안으로 들어간다.

⑤ Step out : 함수 밖으로 빠져나간다.

 

 

일단 강의에서 말하는 중단점(breakpoint)를 main 함수의 시작 중괄호와 hello 함수의 시작 중괄호에 설정해주었다.

 

 

 

디버깅을 시작하니 먼저 main 함수에 설정된 중단점에서 한번 멈추고, 다시 실행시키면 hello 함수에 설정된 중단점에서 또 멈춘다.

이를 통해 프로그램이 main -> hello 함수 순으로 호출된다는 것을 알 수 있다.

 

 

Step over를 통해 한줄 한줄 내려가니 printf("Hello, world\n");을 실행시키면 명령 프롬프트에 해당 내용이 출력됨을 알 수 있다.

 

이렇게 디버깅을 사용하면 함수의 실행 순서를 파악할 뿐만 아니라 프로그램이 찾아내지 못하는 오류를 찾아낼 수 있다.

 

# 퀴즈

1. 문자열 "Hello, world!"를 출력하는 함수를 만들려고 합니다. 올바른 코드를 고르세요.

   답  ->  c. void hello()

                   {

                          printf("Hello, world!\n");

                   }

 

2. 다음 중 함수를 선언하는 방법으로 올바른 것을 고르세요.

   답  ->  d. void hello();

 

3. 다음 중 함수의 반환값이 없을 때 사용하는 자료형을 고르세요.

   답  ->  e. void

 

 

# 연습문제 1

[문제]

다음 소스 코드를 완성하여 "Beethoven"과 "9th"가 각 줄에 출력되게 만드세요.

 

[코드 및 결과]

 

 

[설명]

문제에서 제시된 코드를 보면 이미 함수 두개가 만들어져 있다.

따라서 실행 결과의 내용이 출력되려면 이미 만들어진 두 함수를 호출해야 한다.

따라서 만들어진 함수의 이름을 그대로 가져와 함수이름(); 꼴로 호출해주었다.

 

 

# 연습문제 2

[문제]

다음 소스 코드를 완성하여 "Saturn"과 "192.168.10.6"이 각 줄에 출력되게 만드세요.

 

[코드 및 결과]

 

 

[설명]

문제에서 제시된 코드를 보면 함수가 선언만 되어있고 그 함수가 무슨 기능을 하는지 정의되어있지 않다.

함수 호출에 해당하는 코드는 이미 있으므로 남은 건 그 함수를 정의해주는 것 뿐이다.

따라서 실행 결과를 참고하여 printHostname을 호출하면 Saturn을, printIPAdress를 호출하면 192.168.10.6을 출력하도록 printf 함수를 이용하여 함수를 정의해주었다.

 

 

# 심사문제

[문제]

다음 소스 코드를 완성하여 "192.168.10.5" "Jupiter"가 각 줄에 출력되게 만드세요.

정답에는 밑줄 친 부분에 들어갈 코드만 작성해야 합니다.

 

[코드 및 결과]

 

 

[설명]

제시된 코드를 보면 main 함수에 printIPAddress 함수와 printHostname 함수가 호출되어 있다.

따라서 결과가 출력되기 위해 해줘야 할 건 각각의 함수를 선언하고 정의해주는 것이다.

main 함수 위에서 각각의 함수를 선언해주는데, 반환값이 없으므로 void 함수이름()으로 해주었다.

그리고 문제에서 제시된 내용을 출력하도록 중괄호 안에 printf 함수를 이용해서 출력할 내용을 입력했다.

 

 

댓글