[C++] 2022-2 Comma 3차 스터디 정리

yeohn·2022년 11월 12일
0

함수

함수 서명(function signature)의 구성요소
: 함수 이름과 매개변수 목록

형식 매개변수(formal parameter) / 매개변수
: 함수 헤더에 선언된 변수

실 매개변수(actual parameter) / 인수(argument)
: 호출하는 쪽의 매개변수 (순차적으로 함수 서명에 할당 = 매개변수 순차 결합)

설명

함수는 값 반환이 가능하다.
returnValueType은 함수가 반환하는 값의 데이터타입 (= 반환값 유형)
함수 중에는 반환하는 값이 없이 주어진 일을 처리하는 경우도 있는데,
이 경우에 returnValueType에는 void 키워드를 사용한다.

void 함수

- void 함수명 (형식 매개변수) // return 값 X
void 함수는 반환값이 없어서 함수 안에서 출력이 이루어짐. 호출하면 void 함수에서 명령한 출력문이 실행됨.

- int 함수명 (void) // 매개변수 받지 X

반환형

void: 반환값이 없으므로 함수 마지막 return 불필요. 값 저장 또는 출력 없이 함수를 선언하면 된다.
int, string 등 반환값이 있을 때: 함수 마지막 return 필요. 값을 변수에 저장하거나 출력하며 선언해야 한다.


함수 호출

#include <iostream>
using namespace std;

int max(int num1, int num2) // 호출되기 이전에 미리 정의 (함수 원형도 가능)
{
    if (num1 >= num2)
    	return num1;
    else
    	return num2; // 함수 데이터 유형이 int라 반환값 필요
}

int main()
{
	int a = 5, b = 7;
    cout << max(a, b); // 호출
    
    return 0;
}

함수 원형 (prototype)

함수는 호출 이전에 헤더가 선언되어야 한다.

첫 번째 방법 - main 함수 앞에 정의하기

int max(int a, int b)  // 함수 정의를 함수가 호출되기 전으로 위치시키는 것 
{...}

int main()
{
	... max(x, y) ...
}

두 번째 방법 - 함수 원형 사용 후 main 함수 뒤에 정의하기

int max(int a, int b);  // 함수 원형 사용
						// 함수 헤더 + ; (세미콜론)
int main()
{
	... max(x, y) ...
}

int max(int a, int b) // 뒤에 꼭 정의해야 함
{...}

호출 스택

함수 내에서 선언된 변수는 함수를 위한 메모리 공간에 따로 생성된다. (지역변수)
함수 사용이 종료되면 변수의 메모리도 삭제된다. (함수 밖에서 사용 불가)
대부분의 언어 함수는 스택을 사용한다. // 더 알아보기


함수 오버로딩

정의: 함수 이름은 같지만 매개변수가 다른 함수들

주의점

함수 이름과 매개변수가 동일하고 return 변수형만 다를 경우에는 오버로드 되지 않는다. (호출될 때 매개변수가 동일하면 컴퓨터는 어느 함수의 return 값을 출력할지 알 수 없음)

#include <iostream>
using namespace std;

/*int max(int num1, int num2) {
    int result;
    if (num1 >= num2) result = num1;
    else result = num2;
    return result;
}*/

int max(float nu1, float nu2) {
    float result;
    if (nu1 >= nu2) result = nu1;
    else result = nu1;
    return result;
}

float max(float nu1, float nu2) {
    float result;
    if (nu1 >= nu2) result = nu1;
    else result = nu1;
    return result; // 함수 이름과 매개변수 이름이 동일하고, return값만 다름
    			   // 오버로드 할 수 없다는 오류 메세지 발생
}

int main() {
    int a = 5, b = 7;
    cout << max(a, b);

    return 0;
}

/*int main() {
    float a = 5.3, b = 7.3;
    cout << max(a,b);

    return 0;
}*/

오류 메세지


기본 인수

정의: 매개변수에 대한 기본 값 정의
인수가 없는 상태로 함수를 호출하면 미리 정의한 기본 값이 매개변수로 전달된다.

나쁜 예시

void t1(int x, int y = 0, int x); // (1) int x가 중복
void t2(int x = 0, int y =0, int z); // int z의 초기화 필요

좋은 예시

void t3(int x, int y = 0, int z = 1); // (2) 맨 뒤 변수부터 초기화
void t4(int x, y, z = 0); // (3) 한 번에 초기화 (문법적으로 맞는 예시)
void t5(int x = 1, int y = 2, int z = 3); // 모두 초기화가 됨

(1) 매개변수를 초기화 할 때 원하는 매개변수만 초기화하면 문제가 발생한다.

y는 초기화된 0 값으로 두고 x에 1, z에 2 값을 넣어서 함수를 호출할 때

초기화되지 않은 x, z에 값을 넣기 위해 t1(1,2);를 호출하면 x에 1이 할당되고 y에 2가 할당되어 z는 초기화가 이루어지지 않는다.

// 컴퓨터는 값을 받을 때 무조건 앞의 변수 값부터 차례로 채움

(2) 오류를 방지하기 위해 매개변수는 모두 초기화 시켜주는 것이 좋다.

x는 3으로 초기화하고 y의 값을 4로 바꿔 함수를 호출할 때

t3(3,4);를 호출하면 앞에서부터 값을 할당해 x에는 3이 할당되고 0으로 초기화 된 y에 4가 할당된다. z는 이미 1로 초기화를 해두었기 때문에 호출할 때 값을 넣지 않아도 오류가 발생하지 않는다.

해결 방법
-void t1(int x, int y = 0, int z);으로 선언된 함수를 t1(2,3,4);로 호출해서 x, y, z 모두에 다시 값을 넣어준다.
-t1(x=1, z=6); 이런 식으로 변수 명과 값을 같이 넣어서 호출할 수도 있다.

(3) 변수선언과 동시에 "초기화"까지 하는 것은 대부분의 언어에서 불가능하다.

void t4(int x, y, z = 0)의 예시를 보면,
변수선언과 동시에 "초기화"까지 하는 것은 대부분의 언어에서 불가능하다.
(언어마다 규칙이 달라서 직접 사용하면서 에러가 뜨는지 잘 지켜봐야 함)

컴퓨터가 명령을 헷갈리지 않게 호출하면 오류가 발생하지 않는다.
해당 구문에 대해 헷갈릴 여지가 있는지 생각해봐야 한다.


인라인 함수

메모리 오버헤드를 줄여준다.
함수처럼 호출되는 것이 아니라 컴파일러에 의해 인라인 함수를 호출하는 지점에 함수 코드를 복사하는 방식.

#include <iostream>
using namespace std;

inline void f(int month, int year) // 함수 앞에 inline 키워드를 사용한다.
{
	cout << "month is " << month << endl;
    cout << "year is " << year < endl;
}

int main()
{
	int month = 10, year = 2008;
    f(month, year);
    f(9, 2010);
    
    return 0;
}

같은 코드

int main()
{
	int month = 10, year = 2008;
    cout << "month is " << month << endl; // 이 부분이 복사되어 들어옴
    cout << "year is " << year < endl; // 앞의 변수 값을 출력하고 아래를 실행
    cout << "month is " << 9 << endl;
    cout << "year is " << 2010 < endl;
    
    return 0;
}

C++에는 이미 내장되어 있다.

0개의 댓글