함수 (1)

이지우·2022년 5월 11일
1

C언어

목록 보기
3/17

함수란?
기능을 수행하는 코드 단위
ex) main(), printf(), scanf() ...

표준 라이브러리 함수 : 특정 기능을 미리 약속하고 프로그램에서 바로 사용할 수 있게 구현되어 있는 함수
stdio.h 와 같은 헤더 파일에 포함되어 있다.

  • 함수 정의 : 함수를 실제 코드로 만드는 것 / 기능 구현
  • 함수 호출 : 함수 호출을 해야 사용할 수 있다.
  • 함수 선언 : 프로그램의 상단에서 어떤 함수를 사용할 것이라고 컴파일러에 정보를 주는 역할
    (함수를 프로그램 상단에 정의하면 필요없음)

함수 정의

함수 정의란 함수를 만드는 것을 말한다.
main 함수와 또 다른 함수가 기능을 나누어 수행하도록 만들어 보도록 하겠다.

함수 원형
1. 함수의 기능에 맞는 이름은?
2. 함수가 기능을 수행하는 데 필요한 데이터는?
3. 함수가 수행된 후의 결과는?

반환형 함수명 (매개변수1, 매개변수2)
{
	// 함수가 수행하는 명령; 결과값을 돌려보냄
}
  1. 함수명은 기능을 충분히 예상할 수 있도록 적절한 이름을 선택한다.
  2. 매개변수는 함수가 처리할 데이터를 저장하는 변수로 함수명 옆의 괄호 안에 선언한다.
  3. 반환형은 함수가 기능을 수행한 후에 호출한 곳으로 돌려줄 값의 자료형을 적는다.

두 정수를 더하는 함수 예제

int sum(int x, int y){	// 함수 정의 시작 (함수 이름: sum)
	int temp;			// 두 정수의 합을 잠시 저장할 변수
    temp = x + y;		// x와 y의 합을 temp에 저장
    return temp;		// temp의 값을 반환
}						// sum 함수의 끝

temp와 같이 함수 내에서 필요한 변수가 있으면 별도로 선언한다.
여기서 temp는 꼭 필요한 변수가 아니므로 return (x+y);로 바로 반환하는 것도 가능하다.

int sum(int x, int y)
{	return (x + y);	}

함수 정의 위치

함수는 다른 함수와 분리되어 독립적으로 정의해야 하기 때문에 sum 함수는 main 함수와 별도의 구역에 작성한다.

  1. main문보다 위에 정의
    함수 정의 후 바로 main문에서 사용(호출)할 수 있다.
#include <stdio.h>

int sum(int x, int y){	// 함수 정의
	int temp;
    temp = x + y;
    return temp;
}

int main(){				// main문
	int a = 10, b = 20;
    int result;
    
    result = sum(a, b);	// 함수 호출
    printf("result : %d\n", result);
}
  1. main문 아래에 정의
    함수 정의 후 프로그램의 상단(#include와 main문 사이)에 함수 선언을 한 후에 사용할 수 있다.
#include <stdio.h>
int sum(int x, int y);	// 함수 선언

int main(){				// main문
	int a = 10, b = 20;
    int result;
    
    result = sum(a, b);	// 함수 호출
    printf("result : %d\n", result);
}

int sum(int x, int y){	// 함수 정의
	int temp;
    temp = x + y;
    return temp;
}

함수 안의 변수명

새로 정의한 함수 안에서 사용되는 변수명은 다른 함수의 변수명과 같을 수 있다.

int sum(int a, int b){	// 매개변수 a, b는 main 함수의 변수와 이름이 같음
	int temp;
    temp = a + b;
    return temp;
}
  • 함수 내에서 선언된 변수와 매개변수는 함수별로 독립된 저장 공간을 가지기 때문에 함수 내에서만 사용할 수 있다.
  • 변수는 선언된 중괄호({ }) 안으로 사용 범위가 정해져 있어서 중괄호 밖으로 나오면 사용할 수 없게 된다. (저장 공간에서 삭제됨)
  • 함수 내에서 선언된 변수와 매개변수는 함수가 실행이 끝나면 자동으로 저장 공간에서 지워진다.

함수 호출

함수는 호출을 통해 실행된다.

위의 예제에서의 main문에서 호출부분을 보면

    result = sum(a, b);	// 함수 호출

함수 이름을 사용하며 함수에 필요한 데이터를 괄호 안에 넣어준다. 이 데이터(a, b)를 인수라고 한다.
인수는 상수나 변수를 쓸 수 있고 수식을 사용하면 수식의 결과값이 인수로 쓰이게 된다.

sum(30, 40)		// 상수 인수
sum(a*2, b/3)	// 수식 인수

인수의 값은 호출된 함수의 매개변수에 복사되어 사용된다.


함수 반환

호출된 함수가 실행을 끝내고 값을 반환할 때 return문을 사용한다.
return문이 실행되면 함수가 끝나고 호출되었던 부분으로 돌아간다.

실행 과정

  1. main문에서 sum을 호출하면 다음 부분을 진행하는 것을 중단하고 함수 sum이 실행된다.
  2. 함수 sum이 실행되면 x, y를 더하여 temp에 저장한 뒤 함수의 실행을 끝내고 호출한 곳으로 돌아가기 위해 return 문을 사용한다.
  3. temp 값이 호출한 곳으로 반환되고 main문 안에서 대입 연산자로 temp 값을 result에 저장한다.
  4. 중단했던 나머지 부분을 실행한다.

컴파일러는 함수를 호출할 때 반환값을 저장할 공간을 미리 준비해둔다. 이 공간은 식별할 수 있는 이름이 없어서 계속 사용할 수는 없다.
반환값을 대입 연산으로 다른 변수에 복사하거나 수식에 바로 사용하는 것은 가능하다.

result = sum(a,b) * 2;	// 반환값 -> 곱셈 -> 대입

함수 선언

함수 선언은 컴파일러가 새로 만든 함수를 인식할 수 있도록 알리는 역할을 한다.

함수 원형 뒤에 세미콜론을 붙인다.

int sum(int x, int y);

매개변수 이름은 생략할 수 있다.

int sum(int, int);	// 매개변수 이름을 생략한 형태

함수 정의를 main문 앞에 하지 않는 것이 좋은 이유

함수를 미리 선언하지 않으려면 호출하는 곳 이전에 정의해야한다. 이때 여러 함수 간에 호출 관계가 엉켜 있으면 (함수 안에서 다른 함수를 호출하는 경우) 순서에 맞게 정의하기 어려워진다.
따라서 필요한 함수를 main문 밑에 차례로 만들고 main문 앞에는 모든 함수를 선언하여 한눈에 파악하기 쉽게 작성하는 것이 좋다.

profile
노력형 인간

0개의 댓글