본문 바로가기
Language & Framework & GIT/C

[씨앤씨뿔] C/ 함수

by veganwithbacon 2023. 4. 4.
반응형

  함수의 개념

함수(function)는 특정 기능을 제공하는 일련의 코드를 묶어서 이름을 붙인 것이다

종종 함수가 블랙박스로 비유되는데, 입력으로 데이터를 넘겨주면 일련의 작업을 수행한 다음, 결과를 내어 놓는데 처리 과정은 보이지 않기 때문이다. 이는 scanf나 printf 함수의 사용을 생각해보면 '블랙박스'라는 의미를 알 수 있다.

그렇다면 왜 함수가 블랙박스여도 되는가에 대한 궁금증을 가진다면,

전달 인자의 의미와 호출 결과만 알면 될뿐, 함수가 어떻게 입출력을 처리하는지 까지는 알 필요가 없기 때문이다.

 

여러 함수로 나누어 작성하는 이유는 코드의 재사용성과 유지 보수의 용이성 때문이다.

 

  함수를 사용할 때의 장점

- 코드가 중복되지 않아 간결하고 알아보기 쉽다

- 한 번 작성해도 코드를 여러 번 사용하므로 코드의 재사용성이 높다

- 기능 위주로 함수를 작성해서 사용하므로 프로그램의 모듈화가 증대

- 함수 코드를 수정하더라도 함수를 호출하는 부분은 수정할 필요가 없어 프로그램을 유지 보수하기 쉽다

 


  함수의 종류

진입점 함수(entry point fuction) : 프로그램이 시작될 때 운영체제에 의해서 호출되는 특별한 함수 ex)main 함수

라이브러리 함수(library function) : scanf함수,printf함수처럼 C에서 자주 사용하는 기능을 미리 준비해둔 함수

사용자 정의 함수(user-defined function) : 프로그래머가 직접 정의해 사용하는 함수

 


  함수의 기본

프로그램에서 함수를 이용하려면 기본적으로 함수의 정의, 함수의 호출, 함수의 선언이 필요하다.

함수의 정의(definition)는 함수가 수행할 내용을 기술,

함수의 호출(call)은 이미 정의된 함수를 사용하는 것,

함수의 선언(declaration)은 사용될 함수에 대한 정보를 미리 제공하는 것이다.

 

  함수의 정의

함수를 정의할 때는 함수의 리턴형과 함수 이름, 매개변수 목록이 필요하다.

리턴형과 함수명을 쓰고 ()안에 매개변수 목록을 적어준다.

매개변수 목록은 데이터형과 매개변수를 한 쌍으로 하며, 하나 이상인 경우 콤마(,)로 나열한다.

매개변수가 없다면 void를 적으며, 함수가 처리할 내용은 {}안에 적어준다.

 

 

  함수의 리턴형

함수의 리턴형은 함수가 처리 결과로 리턴하는 값의 데이터형이다.

정수 값을 리턴하는 함수는 리턴형으로 int형을 지정하고, 실수 값을 리턴하는 함수는 리턴형으로 double형을 지정한다.

 

함수의 처리결과로 리턴값이 없을 경우 void라고 적어주는데,

만약 리턴형을 생략하면 컴파일러는 디폴트로 int형을 리턴하는 함수로 간주한다.

리턴값이 없는 의미로 void를 생략하면 int형이 리턴됨을 인지하자.

 

함수는 반드시 하나의 값만 리턴할 수 있기 때문에, 처리 결과가 둘 이상이라면 함수의 리턴 값 대신 매개변수를 이용해야한다.

 

  함수의 이름

어떤 일을 하는 함수인지 명확하게 알 수 있는 이름을 정하는 것이 좋다.

함수명도 식별자로 식별자를 만드는 규칙에 따라 정해야한다.

 

함수명은 일관성 있는 이름을 사용하는 것이 좋으며, 식별자로 사용되는 이름을 정할 때 적용되는 규칙을 명명 규칙(Naming Convention)이라고 하며, 본인만의 명명 규칙을 통해 코드의 가독성을 높일 수 있다.

 

 

  매개변수 목록

매개변수는 함수를 호출한 곳에서 함수 안으로 전달되는 값을 보관하기 위한 변수

매개변수와 비교해 함수 호출 시, 실제 전달되는 값을 인자(argument) 또는 인수라고 부른다.

 

매개변수의 개수에는 제한이 없다.

매개변수가 없을 때는 void를 쓰는데, 이 때의 void는 생략 가능하다.

(함수 리턴에서의 void와는 다르다는 것을 유의!, 다시 한 번 짚으면 리턴형을 생략할 시 int형으로 리턴된다)

 

함수를 정의할 때, 매개변수의 데이터형을 생략하거나 매개변수의 이름을 생략하면 컴파일 에러가 발생한다.

 

  함수의 내용

리턴형, 함수형, 매개변수 목록을 함수의 헤더(header)라고 하고, {}안에 함수가 처리할 내용을 적어주는 부분을 함수의 바디(body)라고 한다. 함수의 정의는 헤더와 바디로 구성된다.

 

  여러 가지 함수의 정의

  리턴 값과 매개변수가 없는 함수

- 리턴형과 매개변수 목록을 void로 지정

더보기

void hi(void) //리턴형과 매개변수가 없는 함수

{

     printf("HI! Let's enjoy C pro\");

}   //함수의 끝을 만나 리턴

void bye(void){ printf("Bye\n");} //간단한 함수는 한 줄로 작성가능

void형의 함수를 호출하면 정해진 코드를 수행하고, 함수의 끝을 만나면 리턴한다

 

  리턴 값은  없고 매개변수만 있는 함수

이와 같은 경우, 리턴을 할 수 없기 때문에 다른 함수를 통해 리턴을 하거나 printf를 통한 출력이 주를 이룬다.

 

  리턴 값과 매개변수가 있는 함수

제일 일반적인 함수의 형태이며,

int get_sum(int num)과 같은 형태에서 바디를 통해 함수를 구현한다.

 

장황하게 있는 것 같지만, 사용하다보면 당연시 여기게 되는 것들이다.


  함수의 호출

: 이미 만들어진 함수를 불러쓰는 것

함수 명 다음에()를 쓰고, ()안에 함수의 인자를 써준다.

함수 호출 시 넘겨준 인자가 매개변수로 전달된다.

 

1)리턴 값과 매개변수가 없는 함수의 호출

함수명(); 와 같은 형태로 함수를 호출할 수 있다. 

ex) hi();

 

2) 리턴 값은 없고 매개변수만 있는 함수의 호출

()안에 함수의 인자를 콤마(,)로 나열한다.

함수 호출 시 넘겨준 인자는 함수의 매개변수로 순서대로 전달된다.

 

함수의 인자로는 매개변수의 데이터형과 같은 형의 값을 전달해야한다.

인자의 데이터형이 매개변수의 데이터형과 일치하지 않으면 형 변환해서 전달한다.

 

함수를 호출함에 있어 항상 인자와 매개변수의 순서, 개수가 일치해야 한다.

매개변수의 의미에 맞게 순서대로 인자를 전달한다.

 

리턴형이 void형인 함수는 리턴값이 없어 수식으로 볼 수 없다.

 

2) 리턴 값과 매개변수가 있는 함수의 호출

리턴 값과 매개변수가 있는 함수 호출 시,()안에 함수의 인자를 콤마(,)로 나열해 함수를 호출한다.

함수의 리턴 값을 받아 다른 수식에 이용할 수 있다.

 

함수의 리턴 값도 임시 값이기에 따로 변수에 저장하지 않으면 다음 호출문을 통해 넘어갈 때 사라진다.

 

함수의 리턴 값은 변수에 저장하거나, 다른 수식의 일부분이나 다른 함수 호출의 인자로 사용가능하다.

 

3) 함수 호출 시 주의사항

함수의 인자도 수식이다. 

상수, 변수, 연산식, 또는 다른 함수 호출의 리턴 값을 함수의 인자로 사용할 수 있다.

함수 호출 시 항상 인자의 값을 먼저 평가한다.

 

인자의 개수와 데이터형은 매개변수와 일치해야한다.

 

함수는 이름으로 구분하기에, 같은 이름으로 함수를 여러 번 정의할 수 없다.

 

정의되지 않은 함수는 컴파일러가 int형을 리턴하는 함수로 가정해 컴파일 경고를 발생시킨다.

 

함수를 호출할 때는 대소문자까지 정확히 일치하는 이름으로 함수를 호출한다.


  함수의 선언

: 함수의 리턴형, 이름, 매개변수에 대한 정보를 미리 알려주는 것으로,함수의 원형(prototype)이라고도 한다.

 

  함수 선언문

형식 - 리턴형 항수명(매개변수목록);

ex   -   int add(int x, int y);

          double get_area(double radius);

 

함수 선언문도 C문장으로, 반드시 끝에 세미콜론(;)을 써줘야한다.

함수 선언에서 매개변수명은 생략 가능하다.

 

함수 원형에서 제일 중요한 부분이 리턴형, 함수명, 매개변수의 개수, 데이터형이기 때문에 함수의 시그니처(signature)라고 한다. 함수 정의 후 헤더 부분을 복사해 끝에 세미콜론(;)을 붙여 함수 선언문이 된다.

 

각 함수가 정의된 위치에 상관없이 호출될 수 있도록, 소스 파일의 시작 부분에 함수 선언을 넣어준다.

 

요약~

구분 내용
함수의 정의 리턴형, 함수 명, () 안에 매개변수 목록을 써준 후 {}안에 실제로 함수가 처리할 내용을 기술한다 double get_area(double radius)
{~~~~~~~~~~~~}
함수의 호출 앞에서 선언되거나 정의된 함수를 이용.
인자를 넘기고 리턴 값을 받을 수 있다.
printf("%f", get_area(i));
함수의 선언 함수 호출에 필요한 리턴형, 함수 이름, 매개변수 정보를 알려준다 double get_area(double radius);

 


  지역 변수와 전역 변수

지역 변수(local variable)는 함수나 블록 내에 선언되는 변수

전역 변수(global variable)은 함수 밖에 선언되는 변수

구분 지역 변수 전역 변수
선언 위치 함수나 블록 안 함수 밖
사용 범위 변수가 선언된 함수나 블록 안 소스 파일 전체
생존 기간 변수가 선언된 블록에 들어갈 때 생성되고 블록을 빠져나갈 시 소멸 프로그램이 시작될 때 생성되고
프로그램이 종료될 때 소멸
초기화하지 않는 경우 쓰레기 값 0으로 초기화

 

  지역 변수

지역 변수는 선언된 위치에 따라 지역 변수의 사용 범위가 결정된다.

함수 내에 선언된 지역 변수는 함수가 호출되는 횟수만큼 생성되고 소멸된다.

반복문 내에 선언된 지역 변수는 반복문이 수행되는 횟수만큼 생성되고 소멸된다.

 

서로 다른 함수에서 같은 이름의 변수를 선언하면, 이름은 같으나 다른 변수가 된다.

 

  전역 변수

전역 변수는 보통 소스 파일의 시작 부분에 선언한다.

지역 변수와는 다르게 전역 변수는 따로 초기화하지 않으면 자동으로 0으로 초기화된다.

 

프로그램이 시작될 때 한번만 생성되고, 여러 함수에서 사용되다가 프로그램 종료시 소멸된다.

전역 변수는 소스파일의 시작 부분에서 선언하는 것이 좋다.

 

영역 규칙(scope rule) : 가까운 블록 안에 선언된 변수가 우선적으로 사용된다.

동일한 이름의 지역 변수가 있다면 전역 변수를 사용할 수 없다.

우선적으로 지역 변수가 사용된다.

반응형

'Language & Framework & GIT > C' 카테고리의 다른 글

[씨앤씨뿔] C/ 포인터 - 1  (0) 2023.04.06
[씨앤씨뿔] C/ 배열  (0) 2023.04.04
[씨앤씨뿔] C/ 제어문  (0) 2023.03.28
[씨앤씨뿔] C/ 연산자  (0) 2023.03.27
[씨앤씨뿔]C/ 데이터형&연산자  (0) 2023.03.25

댓글