본문 바로가기
개발/C, C++

[C/C++] 함수(function)

by 77monkey 개발자 2024. 5. 2.
반응형

 

 

 

 

지금까지는 main 함수에서 모든 코드를 작성하여 코드를 작성했습니다. 이제는 main 함수가 아닌 다른 함수들을 만들어 보려고 합니다. main 함수를 통해서 대략적인 구조는 아셨을 텐데 조금 더 구체적으로 알아보도록 하겠습니다. 

 

 

함수 정의

함수를 정의하는 방법은 간단합니다. 

먼저 해당 함수가 reutrn 하는 타입을 작성합니다. 그리고 해당 함수에서 원하는 동작을 함수 이름으로 작성합니다. 마지막으로 해당 함수를 부를 때 필요한 매개변수를 작성합니다. 그리고 중괄호를 작성해야 함수의 기본 뼈대가 완성됩니다.

ruturn_타입 함수_이름(함수_매개변수) {
	//코드
}

 

함수 정의 예시

간단하게 정수 2개를 입력받아 더하는 함수를 만들어 봅시다. 가장 먼저 해당 함수의 이름을 무엇으로 할까 고민을 해봐야할 것 같습니다. 덧셈을 하기 때문에 함수 이름은 간단하게 add로 진행하겠습니다. 그다음은 함수 매개변수를 고민해 볼 수 있는데, 지금 우리는 정수 2개를 입력받기 때문에 (int arg1, int arg2)로 작성하겠습니다. 만약에 실수를 입력받는다고 하면 (double arg1, double arg2)로 작성할 수 있겠죠? 마지막으로 두 매개변수를 더한 값을 받기를 원합니다. 그렇기 때문에 return 타입은 int가 됩니다. 만약 double로 매개변수를 작성했다면 return 타입은 어떻게 될까요? 네, 맞습니다. double이 됩니다. 그럼 함수를 작성해 볼까요?

int add(int arg1, int arg2) {
    int sum = arg1 + arg2;
    return sum;
}

 

코드 부분에 대해서는 매개변수로 받은 값들을 더해서 sum에 넣은 다음에 sum을 return으로 보내줍니다. 그러면 add 함수를 호출한 곳에서는 sum 값을 받게 됩니다. 

return 다음에는 바로 ;이 나올 수 있고, 이렇게 변수의 값이 나오거나 식이 나올 수 있습니다. return의미가 돌려준다는 의미라서, reutrn 다음에 오는 값을 호출한 곳에 돌려준다는 의미로 생각하시면 됩니다. 아직 설명을 안 드렸지만 reutrn; 이렇게 하게 된다면 호출한 곳에 아무것도 돌려주지 않고 함수를 종료하겠다는 의미입니다. 

우리가 작성한 add 함수를 main 함수에서 호출하는 코드를 작성해 봅시다. 

int add(int arg1, int arg2) {
    int sum = arg1 + arg2;
    return sum;
}

int main() {
    int result;
    
    result = add(7, 4);
    
    return 0;
}

main 함수에서 add 함수를 호출했습니다. 이 때 7과 4는 인자라고 합니다. 이 인자는 변수 타입으로 작성해도 됩니다. 단, 타입이 맞지 않으면 add 함수의 매개변수 타입으로 강제 캐스팅이 이루어져서 결과가 달라질 수 있습니다. 즉, add(1.1, 2.2)로 호출을 하게 되면 3.3이 나오기를 기대하지만 결과는 3이 나오게 됩니다. 컴파일 에러가 나지 않지만(캐스팅으로 인해 나오지 않습니다.), 원하는 결과가 나오지 않을 수 있다는 것을 알아야 합니다. 당연히 result 변수도 add 함수의 return 타입과 맞춰줘야 합니다. 그렇지 않으면 result = add(7,4)에서 "="에서 강제 캐스팅이 발생하여 넘어가게 됩니다. result에는 11이 들어가 있게 됩니다. printf로 출력을 해보시는 것도 좋을 것 같습니다. 

 

함수 장점

이렇게 함수를 작성하는 이유는 무엇일까요? main 함수에서 다 작성을 해도 코드가 동작하는데 말입니다. 여기에는 크게 3가지 이유가 있습니다. 

 

코드 재사용

함수를 사용하게 되면 비슷한 기능을 하는 코드를 반복해서 작성하지 않고 정의한 함수를 호출함으로써 재사용할 수 있습니다. 이렇게 되면 코드의 길이가 짧아지고, 가독성이 좋아집니다. 

 

모듈화

함수는 하나의 동작만 하도록 보통 작성합니다. 보통 개발을 할 때 여러 사람들과 협업을 하기 때문에 본인이 작성하지 않은 코드나, 본인이 작성했지만 오래전에 작성한 코드는 잘 이해가 되지 않을 수 있기 때문입니다. 그렇기 때문에 이렇게 함수 형태로 작성하게 되면 관리 및 이해가 용이하게 됩니다. 

 

유지보수성

함수로 작성하게 되면 수정 및 버그 fix가 용이해집니다. 수정이 필요한 경우 해당 함수만 수정하면 되어서 다른 코드에 영향을 덜 주게 됩니다. 

 

함수의 종류

함수의 종류에는 2가지가 있습니다.

  • 표준함수 
  • 사용자 정의 함수

표준함수는 printf, scanf와 같이 이미 만들어져 있는 함수로 해당 함수를 가져다 쓰면 됩니다. 

사용자 정의 함수는 위에서 만든 add 함수처럼 우리가 직접 만든 함수를 의미합니다. 

 

매개변수 vs 인자

매개변수와 인자라는 용어를 섞어서 쓰기는 하지만, 미묘하게 차이가 있습니다. 함수 정의에서 사용되는 것은 매개변수이고, 함수 호출할 때 쓰이는 것은 인자입니다. 그래서 파라미터(Parameter)라는 용어는 함수 정의할 때 쓰고, 아규먼트(Argument)는 함수를 호출할 때 씁니다. 개발할 때는 어떻게 쓰셔도 상황에 따라서 잘 이해를 할 수 있지만 이름이 다른 만큼 구별해 주는 센스를 발휘하면 좋을 것 같습니다. 

 

 

마무리

함수에 대해서 나름 깊이 있게 살펴본 것 같습니다. 위에서 예시를 든 add 함수는 간단해서 굳이 add로 함수를 빼내지 않고 main 함수에서 다 처리해도 되지만, 코드가 짧을 때부터 함수로 분리하는 연습을 하게 된다면, 나중에 알고리즘이나 코드 개발을 할 때 큰 도움이 될 것입니다. 함수에서 가장 어려운 것 중에 하나는 함수 이름을 작성하는 것입니다. 이름 짓는 게 어렵지 않다고 생각하실 수 있지만, 실제로 개발을 하다 보면 다른 건 다 작성했는데 함수 이름을 못 지어서 시간이 오래 걸릴 때가 있습니다. 아무래도 코드 이해와 가독성이 좋게 하기 위해서는 함수 이름을 잘 작성하는 게 큰 도움이 되기 때문에 고심하게 되는 것 같습니다. 함수에 대해서 도움이 되었기를 바라며 글을 마무리 짓습니다.

반응형

'개발 > C, C++' 카테고리의 다른 글

[C/C++] 포인터(Pointer) 개념  (0) 2024.05.13
[C/C++] inline 함수  (0) 2024.05.02
[C/C++] 연산자 우선순위  (0) 2023.09.18
[C/C++] 캐스팅 연산자  (1) 2023.09.17
[C/C++] sizeof 연산자  (0) 2023.09.15