본문 바로가기
C++/이론

[C++] 함수(2)

by 씐 2024. 9. 24.
728x90

함수의 유형

 

함수의 기본 유형

함수는 매개변수와 함수의 자료형의 유무에 따라 다음과 같이 나눌 수 있다.

  • 매개변수와 반환값이 모두 없는 함수
  • 매개변수만 있고 반환값이 없는 함수
  • 매개변수와 반환값이 모두 있는 함수

 

매개변수와 반환값이 모두 없는 함수

#include <iostream>
using namespace std;
void show()
{
   cout << "********\n";
   return;
}
int main()
{
    show();
}
  • void show()
    • void : 함수의 자료형, show : 함수명, 매개변수 없음
    • 함수의 자료형과 함수명은 생략할 수 없지만, 함수의 매개변수는 생략할 수 있다.
    • 단순히 문자열을 출력하는 함수이므로 매개변수는 생략했다.
    • 매개변수가 필요하지 않으면 기술하지 않아도 되지만 void를 사용해서 매개변수가 없음을 명시할 수 있다.
      • void show(void)
  • return 뒤에 아무런 값도 적어주지 않았으므로 반환값은 없다.

 

매개변수만 있고 반환값이 없는 함수

#include <iostream>
using namespace std;
void sum(int a, int b) // a, b는 형식 매개변수
{
   cout << "a + b = " << a + b << "\n";
}
int main()
{
   int a = 10, b = 20;
   sum(a, b); // sum 함수의 호출, 변수 a, b는 실 매개변수
}
  • 단순히 문자열만 출력하는 함수는 매개변수가 없어도 되지만 두 수에 대한 합을 구하는 함수 등을 작성할 때는 함수에 합을 구할 두 수를 전달해 주어야 한다. 즉, 매개변수가 필요하다.
  • 함수의 매개변수를 파라미터, 인수, 인자, 전달 인자라도고 부른다.
  • 매개변수에는 '실 매개변수'와 '형식 매개변수'가 있다.
    • 실 매개변수
      • 함수를 호출할 때 기술되는 매개변수
      • 호출할 때 적어준 매개변수는 실질적인 값을 넘겨주기 때문에 실 매개변수라 한다.
      • 실 매개변수로 기술한 변수는 기억 공간이 전달되는 것이 아니라 변수에 저장되어 있던 값만 전달
      • 실 매개변수가 함수의 결과값을 얻어 오는 것이 아니라, 호출당한 함수 쪽으로 값을 전달해줄 뿐이다.
    • 형식 매개변수
      • 함수를 정의할 때 기술되는 매개변수
      • 함수가 호출되는 순간 실 매개변수로 기술한 값이 전달되기 전까지는 정해진 값이 없으므로 형식 매개변수라 한다.
      • 형식 매개변수는 반드시 변수 선언문 형태이어야 한다.
      • int a, b 로 선언 할 수 없고, 매개 변수의 개수를 명확히 알기 위해 int a, int b와 같이 따로 선언해야 한다.
    • 형식 매개변수와 실 매개변수의 변수명은 동일할 필요 없다.
      • void sum(int c, int d)로 치환해도 문제 없다.
      • 그 이유는 형식 매개변수는 실 매개변수와 전혀 다른 기억공간을 할당받아 새로운 변수로 생성되기 때문이다.
      • 실 매개변수와 동일한 이름으로 형식 매개변수명을 주더라도 이름만 같은 전혀 다른 기억공간이 따로 할당되서 값을 복사해 둔다.
    • 실 매개변수와 형식 매개변수의 자료형과 개수는 동일해야 한다.
      • 개수가 동일하지 않을 경우 에러 메시지를 출력한다.
      • 자료형이 동일하지 않을 경우 경고 메시지를 출력하고 자동으로 자료형이 형식 매개변수에 맞게 암시적인 형변환을 한다.
      • 대신에 데이터 손실이 발생할 수 있다.

 

매개변수와 반환값이 모두 있는 함수

//절대값을 구하는 함수
#include <iostream>
using namespace std;
int myAbs(int x)
{
   int y; // 절대값을 저장할 변수
   if (x < 0)
   	y = -x;
   else
   	y = x;
   return y; // 구해진 결과값을 return 문으로 변환한다.
}
int main()
{
   int a, result;
   cout << "\n정수값 하나를 입력하세요. -> ";
   cin >> a;
   result = myAbs(a); // 함수의 결과값을 변수 result에 대입한다.
   cout << "구한 절대값은 " <<  result << "이다.\n";
}
  • return 문
    • 함수의 실행 결과를 반환하고자 할 때 사용
    • return 식; 형태로 사용
      • return 1;  //상수로 값을 직접 반환
      • return a; //변수 a의 값을 반환
      • return (a); //return a와 같은 의미, 괄호로 묶어서 표현할 수도 있다.
      • return a + b; //수식을 return 다음에 써주면 계산된 실행 결과값만 넘어간다.
    • return 문의 용도
      • 호출된 함수가 수행을 마친 후 그 실행 결과값을 호출한 함수 쪽으로 반환하고자 할 때 사용
      • 현재 실행 시점에서 더 이상 문장을 진행하지 않고 그 함수를 빠져나올 때 사용(반복문 내에 break 문과 사용 목적이 같다.)
  • 함수 앞에 붙는 자료형은 함수가 그 자료형을 가진 변수를 저장한다는 것을 명시한 것
    • myAbs 함수는 return문 다음에 적어준 y값을 저장하게 된다.
    • 따라서, 함수의 자료형은 변수 y의 자료형과 동일한 int형으로 지정한다.
  • 이 코드에서 변수 result의 역할
    • 함수에 값이 실질적으로 저장되는 시점은 함수를 수행하고 다시 돌아온 후다.
    • 이 때 return 문으로 넘겨준 값을 myAbs 함수 전체가 저장
    • myAbs 함수는 호출된 후에 결과값을 일시적으로 가지게 되므로 함수의 결과값을 다시 사용하기 위해 변수 result를 사용
  • 변수 result를 사용하지 않는 방법
    • 올바른 방법
      • cout << "구한 절댓값은 " << myAbs(a) << " 이다.\n";
      • 변수 result 대신에 함수 호출
    • 잘못된 방법
      •  에러는 발생하지 않지만 잘못된 표현.
      • myAbs(a); 

                       cout << "구한 절댓값은 " << myAbs(a) << " 이다.\n";

  • 함수를 대입 연산자 오른쪽에 사용하는 방법(ex. result = myAbs(a);)
    • 함수를 대입 연산자 오른쪽에 기술하려면 함수의 자료형이 int나 float와 같이 특정한 자료형으로 지정되어 있어야 하며 return 문으로 값을 넘겨받아야 한다.
    • 앞서 사용했던 show 함수와 같이 함수의 자료형이 void형일 경우 대입 연산자 오른쪽에 기술하지 못한다.
    • void형 함수는 값을 갖지 못하므로 대입 연산자 오른쪽에 사용하게 되면 컴파일 에러가 발생한다.

함수의 선언

 

//main 함수 위에 함수를 정의한 경우
#include <iostream>
using namespace std;
int max(int x, int y) // 함수의 정의
{
   return ((x>y) ? x : y);
}
void main()
{
   int a, b;
   cin >> a >> b;
   cout << max(a, b); // 함수의 호출
}

 

//main 함수 아래에 함수를 정의한 경우
#include <iostream>
usign namespace std;
int max(int, int); // 함수의 선언
void main()
{
   int a,b;
   cin >> a >> b;
   cout << max(a, b); //함수의 호출
}
int max(int x, int y) //함수의 정의
{
   return ((x>y) ? x : y);
}
  • 첫번째 코드의 경우 함수를 미리 정의해두고 호출했기 때문에 함수를 선언하지 않아도 문제가 없다.
  • 그러나 두번째 코드의 경우 함수를 먼저 호출한 후에 정의를 하였기 때문에 반드시 함수 호출 전에 함수를 선언해야 한다.
  • 함수의 정의가 호출보다 앞쪽에 있을 경우 함수 선언을 생략할 수 있음.

본 게시물은 "C++ 하이킹 객체지향과 만나는 여행"을 기준으로 작성함을 알립니다.

'C++ > 이론' 카테고리의 다른 글

[C++] 기억클래스와 변수  (0) 2024.09.24
[C++] 함수(1)  (5) 2024.09.20
[C++] 무한 루프 (for문, while문, goto문)  (0) 2023.10.01
[C++] 보조 제어문 (break문, continue문)  (0) 2023.09.30
[C++] 반복문 (for문, while문)  (0) 2023.09.29