본문 바로가기
IT/C and C++

[C] 함수란 무엇이고, 어떻게 사용하나요? (2/2)

by 타이모리 2022. 12. 30.

저번 포스팅 [함수란 무엇이고, 어떻게 사용하나요? (1/2)] 에서는 함수의 선언과 관련된 부분을 주로 다루었습니다. 아래 포스팅을 참고해주세요.

2022.12.30 - [IT/C and C++] - [C] 함수란 무엇이고, 어떻게 사용하나요? (1/2)

 

[C] 함수란 무엇이고, 어떻게 사용하나요? (1/2)

어느덧 벌써 포스팅이 여기까지 왔네요. 저번 포스팅에서 말했던 대로 [함수]에 관한 내용을 적어보도록 하겠습니다. 사실상, 여기까지 C를 공부하시면 기초적인 내용은 모두 학습하셨습니다.

timemory.tistory.com

이번 포스팅에서는 함수의 기능에 대하여 설명하겠습니다.

사실 함수를 사용하는 목적 그 자체라고 봐도 무방할 정도이기 때문에, 잘 익혀두시는 것이 좋습니다.

 

목차


    함수의 기능

    이번 포스팅에서 이야기할 내용은 2가지입니다.

    1. 함수의 매개변수(전달인자)

    2. 함수의 반환값(리턴값)

     

    저번 포스팅에서는 void 타입의 함수를 사용했었습니다. 이 내용은 2번에서 다루도록 하겠습니다.

    매개변수와 반환값을 어떻게 잘 사용하느냐에 따라

    잘 만들어진 함수가 될 수도 있고, 못 만들어진 함수가 될 수 있습니다.

     

    매개변수와 반환값을 이해하러 가봅시다.

     

     

     

     

    매개변수가 무엇인가요?


    매개변수는 함수의 호출부에서 함수의 결과에 영향을 미치고 싶을 때 사용합니다.

    말로 들어서는 잘 모르겠지요?

    우리가 프로그래밍에서 정수 a, b를 더하고 출력하기 위해서는 어떻게 하나요?

    아래와 같은 프로그램 코드를 생각할 수 있습니다.

    #include <stdio.h>
    
    int main() {
    	int a = 0, b = 1;
    	printf("%d", a+b);
    }

    그렇다면 이를 함수로 구현하기 위해서는 어떻게 해야 할까요?

    #include <stdio.h>
    
    void printing() {
    	int a = 0, b = 1;
    	printf("%d", a+b);
    }
    
    int main() {
    	printing();
    }

    이런 함수를 예상하셨다면 지금까지 잘 배워오신 것입니다.

    그렇다면, a와 b에 해당하는 값을 바꾸고 싶다면 어떻게 해야 할까요?

    그렇습니다. printing 안에 있는 저 0과 1을 바꾸어주면 되겠습니다.

    그러나, 우리가 프로그램을 실행하면서 0, 1을 바꾸어 줄 수는 없습니다.

    따라서, 우리는 [매개변수] 개념을 이용하여 함수를 바꾸어야 합니다.

    다음과 같이 매개변수를 사용할 수 있습니다.

    #include <stdio.h>
    
    void printing(int a, int b) {
    	printf("%d", a+b)
    }
    
    int main() {
    	printing(0, 1);
    }

    어떤가요? 바로 이해가 되나요?

    함수 선언 부분에서 int a, int b가 ( ) 안에 들어갔습니다.

    또한, 호출 부분에서도 ( )에 0, 1이 들어갔습니다.

    이는 Main 함수, 즉 호출부에서 0과 1이라는 값을 각각 int a, int b에 대입하고 printing을 실행하라는 뜻입니다.

    당장에는 위의 코드들과 차이가 없습니다. 똑같이 1을 출력하고, 0과 1을 수정할 수도 없으니까요.

    그러나, 호출부인 Main 함수에서 0과 1을 입력했다는 부분에 주목해주세요.

     

    프로그램은 모두 Main 함수에서 이루어집니다.

    결과적으로 Main 함수에서 함수의 동작 결과에 영향을 미칠 수 있다는 것은 다양한 동작을 연결할 수 있는 중요한 부분이 되어줍니다.

    printing 함수는 독립적인 부분이기 때문에 다른 함수에서 강제로 영향을 미칠 수 없습니다.

    (후에 배울 전역 변수 개념을 이용하면 매개변수가 아니어도 가능합니다만, 후에 추가 포스팅하겠습니다.)

    따라서, Main 함수라는 printing 함수 외부에서 영향을 미치는 것은 다양한 활용을 가능하게 하는 것입니다.

     

    함수의 반환값이 무엇일까요?


    위에서는 함수의 매개변수에 대한 내용을 포스팅했었습니다.

    매개변수는 함수가 아닌 곳에서 함수에 영향을 미칠 방법이라고 배웠습니다.

    이번에 배울 함수의 반환값은 함수에서 함수의 호출부에 영향을 미칠 방법입니다.

     

    함수의 반환값은 함수가 종료될 때, 함수의 호출부로 전달됩니다.

    이를 통해 함수에서 호출부에 영향을 끼칠 수 있게 됩니다.

    함수의 반환값은 함수의 타입과 같은 자료형이어야 합니다. 정확히 말하면, 함수의 타입을 함수의 반환값의 자료형으로 설정해야 하는 것이지만요.

    다음은 반환값을 이용한 덧셈 함수의 예시입니다.

    #include <stdio.h>
    
    int Sum(int a, int b) {
    	return a+b;
    }
    
    int main() {
    	printf("%d", Sum(0, 1));
    }

    매개변수를 통해서 두 정수를 입력받습니다.

    또한 두 정수를 더한 값을 return 코드의 뒤에 입력했습니다.

    이 return 값은 함수를 종료함과 동시에 뒤의 값을 호출부로 전달합니다.

    결과적으로, Sum(0, 1)의 부분에 0과 1을 더한 1을 전달해서 출력할 수 있게 됩니다.

     

    저번 포스팅과 이번 포스팅에서 void 함수를 선언하고 사용했었습니다.

    void란 '비어있는'이라는 뜻을 가집니다. 잠시 위로 스크롤 해서 printing 함수들을 보세요.

    return이라는 명령어가 없는 것을 볼 수 있습니다.

    void의 뜻에서 알 수 있듯이 반환값을 가지지 않는 함수는 void 타입으로 선언합니다.

     

    함수의 타입이 void가 아닌 경우, return이 없으면 오류를 출력합니다.

    (main 함수의 경우 자동으로 끝날 때 return 해주기 때문에 int main 형식이지만 반환값을 넣지 않아도 상관이 없습니다.)

     

    잘 만든 함수란?


    계속 말하지만, 함수는 독립적인 공간입니다. 독립적이라는 것은 다른 공간의 영향을 받지 않고, 다른 공간에 영향을 끼칠 수 없습니다.

    그러나, 함수를 완전히 독립적인 공간으로 만든다면 함수는 그저 코드를 뭉쳐놓은 덩어리에 불과합니다.

    오히려 코드를 뭉쳐놓느라 코드 간의 연결고리를 끊어야 할 수 있습니다.

    그래서 매개변수를 만들었고, 지금 배울 반환값을 만든 것입니다.

     

    저번 포스팅에서 함수의 특징을 소개해드렸습니다. 잘 만들어진 함수란 소개한 특징을 잘 충족할 수 있는 함수입니다.

    결과적으로, 함수의 특징들은 함수를 코드에서 분리해낼 수 있다는 점에서 나오게 됩니다.

    두 함수가 있다고 가정해봅시다.

    #include <stdio.h>
    
    int Sum1() {
    	int a = 0, b = 1;
    	return a + b;
    }
    
    int Sum2(int a, int b) {
    	return a + b;
    }
    
    int main() {
    	printf("Sum1 : %d, Sum2 : %d", Sum1(), Sum2(0, 1));
    }

    두 함수는 같은 값을 반환받습니다.

    두 함수 중 다른 코드에서도 재사용이 가능한 코드는 무엇일까요?

    Sum1은 항상 같은 값만을 출력하니 재사용이 힘들 것입니다.

    그러나 Sum2는 함수의 호출부에서 값을 바꾸는 것이므로 다른 코드에서도 재사용이 가능할 것입니다.

    이렇게 함수를 다른 코드에서도 재사용할 수 있도록 바꾸면 좋은 함수가 됩니다.

    하나의 코드를 위해서만 함수를 작성하는 경우 큰 상관이 없으나, 여러 코드를 위해서 작성하는 경우(협업) 재사용이 용이한 코드를 작성하는 것이 좋습니다.

    아직 프로그래밍을 배운 지 별로 되지 않으신 분이라면 최대한 재사용이 용이한 코드를 작성하는 것이 좋습니다.

     

    또한 잘 만들어진 함수는 하나의 목적을 위해서 만들어집니다.

    이 또한 재사용성, 가독성, 유지보수성을 위해서 고려해야 할 요소입니다.

    #include <stdio.h>
    
    int f(int a, int b, int c, int k) {
    	printf("어쩔 저쩔");
    	printf("%d", a);
    	printf("b의 제곱값", b * b);
    	return c + k;
    }

    함수 f가 무슨 역할을 하는 함수인지 이해할 수 있나요?

    목적이 여러 개인 함수는 가독성을 오히려 해치고, 함수의 재사용성과 유지보수성을 크게 낮춥니다.

     

    마무리

    오늘은 함수의 기능에 대하여 알아보았습니다.

    매개변수와 반환값을 제대로 이해해야 코드의 분석이 가능하니, 꼭 익혀두시길 바랍니다.

    다음에는 아마 전역변수와 지역변수에 관한 포스팅이 되지 않을까 싶습니다.

    댓글