7월 2주차_C Study 2. 함수

2023. 7. 15. 13:58language : p_study/c language

7월 2주차 학습 할 C언어 study 목차는 다음과 같다.

 

1. 배열
2. 함수

 

2. 함수

 

함수는 왜 필요한가?

 

사실 이부분은 내가 이번 단원을 학습하면서 가장 고민을 많이 했던 부분이다.

함수를 배우기 전까지 나는 항상 int main() 으로 잘 사용해왔는데 , 메인 함수가 아닌 다른 함수를 지정해서 사용한다는게 굳이? 라는 생각이 계속해서 들었던 것 같다.

그런데 막상 여러가지 더 복잡한 코드들을 배우고 접하면서 함수를 사용하지 않는다면 동일한 작업을 여러번 해야하는 비효율적인 경우도 발생할 수 있겠구나라는 생각이 들었다.

반복문을 사용하지 않으면 일일이 반복해야하는 상황처럼 말이다.

결론은 함수는 더 효율적인 작업을 위해  작성을 한번해놓고 필요할때마다 호출해서 사용하기 위해서 필요한것이다.

 

✔ 함수란?

특정 작업을 수행하는 문장들을 모아 놓은 것이다.

함수는 프로그램을 이루는 부품으로 생각하면 이해하기가 쉬울 것같다.

마치 레고를 조립하듯이 한조각 한조각이 함수이고 그걸 조립하여 완성된 레고가 프로그램인 것이다.

함수를 사용하게 되면 코드의 재활용, 가독성, 유지관리 측면에서 많은 장점이 있다.

 

✔ 함수의 정의

int add(int x, int y)
{
	int result;
    result=x+y;
    return result;
  
}

int : 반환형 , add : 함수 이름 , int x, int y : 매개 변수1, 매개 변수2  - 함수 해더

{ : 함수의 시작

-  int result;

   result = x+y;

   return result  - 위 세줄 : 함수 몸체

} : 함수의 종료  

 

  • 이렇게 가장 먼저 함수가 반환하는 값의 자료형을 먼저 쓴다. 이를 함수의 반환형이라한다.
  • 이어서 함수의 이름, 매개 변수(parameter/파라미터라고도 부른다.) 들을 차례대로 적어준다.
  • 이것을 함쳐서 함수 해더라고 부른다.
  • 함수의 몸체는 중괄호로 둘러싸인 부분으로 함수가 작업을 수행하는 부분이다.

 

➡ 반환형

  • 함수의 반환형은 함수가 처리를 종료한 후에 호출한 곳으로 반환하는 데이터의 유형을 말한다.
  • 반환형은 c언어가 지원하는 자료형인 char, int, long, double 등이 될 수 있다.
  • 만약 값을 반환하지 않는다면 void라고 표시한다.
  • 값을 반환하려면 return 문장을 사용하면 된다. 
  • return 다음에 수식을 써주면 이 수식의 값이 반환되는데 예를들어, return 0;하면 0값이 반환된다.

 

➡ 함수 이름

  • 함수 이름은 변수의 이름과 동일한 규칙으로 만들수 있다.
  • 함수의 기능을 암시하는 이름을 부여하는 것이 좋다.

 

➡ 매개 변수

  • 함수를 호출할 때는 작업에 필요한 데이터들을 보낼 수 있다.
  • 매개 변수는 함수가 받는 데이터를 함수 몸체로 전달해주는 변수이다.
  • 매개 변수는 여러개가 될 수 있고 , 쉼표(,)로 분리된다.

 

➡ 함수 몸체

  • 함수 몸체는 중괄호{ } 로 둘러싸여 있다.
  • 함수 몸체에는 함수가 수행하는 작업에 필요한 문장들이 들어간다.
  • 이 문장들은 함수가 호출되면 처음부터 순차적으로 하나씩 실행되며 return문장을 만나게 되면 함수의 실행이 종료되고 호출한 곳으로 되돌아간다. 

 

이제 함수에 대해 간단히 배워봤으니 함수를 만들어 보자.

 

함수는 사용전 미리 만들어져 있어야한다.

 

 

예제 1

int get_integer()
{
	int value;
    printf("정수를 입력하시오:");
    scanf("%d", &value);
    return value;
 }

생각해보자 ( 드래그하면 보여요. )

 

반환값 : int

함수 이름 : get _ integer

매개 변수 : 없음

 

 

예제 2

int get_max(int x, int y)
{
	if (x>y) return(x);
    else return(y);
 }

생각해보자 ( 드래그하면 보여요. )

 

반환값 : int 

함수 이름 : get_max

매개 변수 : int x, int y

 

  • 위 함수는 두개의 정수가 주어지면 두수 중에서 더 큰수를 찾아서 이것을 반환하도록 하기 위해 만들어졌다.
  • if 문을 사용하여 x가y보다 크면 x를 반환하고 그렇지 않으면 y를 반환한다.

 

 

함수를 호출하여 보자.

함수를 사용하기 위해서는 함수를 호출하여야한다.

int main()
{


    n= get_integer();
    
    
    
    i= get_max(2,3);
    
 }

호출된 함수 안에 있는 문장들은 순차적으로 실행되며 문장들의 실행이 끝나면 호출한 위치로 돌아간다.

 

 

➡ 인수와 매개 변수

  • 인수와 매개 변수는 함수 호출 시에 데이터를 주고 받기 위하여 필요하다.
  • 인수는 호출 프로그램에 의하여 함수에 실제로 전달되는 값이다.
  • 함수가 호출될 때마다 인수는 함수의 매개 변수로 전달된다.
  • 주의할 점은 매개 변수의 개수와 인자의 개수는 정확하게 일치하여야한다.
  • 또한 인수와 매개 변수의 타입은 서로 일치하여야한다.

 

➡ 반환값

 

반환값이란 함수가 반환하는 결과값을 뜻하는데, 인수는 여러 개가 있을 수 있으나 반환 값은 하나만 가능하다.

호출한 곳으로 값을 반환하려면 return문장을 적어주고 이어서 반환하고자 하는 수식을 뒤에 넣어야한다.

return 0;
return (x);
return x+y;

만약 반환할 값이 없다면 return 키워드 다음에 아무것도 쓰지 않으면 된다.

return ;

 

 

➡ 함수 원형 선언

 

  • 일반적으로 함수를 사용할 때는 미리 컴파일러에게 함수에 대한 정보를 알려야한다.
  • 이것을 함수 원형이라고 한다.
  • 함수 원형은 함수가 사용되기 전에 선언되어야한다.
  • 함수 원형 선언은 함수의 이름, 매개변수, 반환형을 함수가 정의되기 전에 미리 한번 써주는 것이다.
  • 함수 원형은 함수 헤더에 세미콜론만을 추가한 것과 똑같다.
  • 함수 원형에서는 매개 변수의 이름은 적지 않아도 되고 자료형만 적으면 된다.

예를 들면 아래와 같다.

int compute_sum(int n);
int compute_sum(int);
int get_integer();

 

그렇다면 함수원형은 왜 필요한 것일까?

 

함수 원형은 컴파일러에게 미리 함수에 대한 정보를 주어 함수의 매개 변수 검사 , 반환형 검사 등을 하게 하기 위한 것이다.만약 함수 원형이 없다면 컴파일러는 이 함수가 어떤 매개 변수를 가지는 함수인지 반환형은 무엇인지를 전혀 알수가 없다.

 

✅ 지역변수와 전역변수

 

지역변수

  • 지역변수는 함수 안에 선언되는 변수이다.
  • 정확히는 블록(중괄호로 둘러싸인 영역)안에 선언되는 변수이다.
  • 지역변수는 변수가 선언된 블록 안에서만 접근과 사용이 가능하다.
  • 지역변수는 정의된 함수 안에서만 사용이 가능하다
  • 지역변수는 초기화 시키지 않으면 쓰레기값을 가지기때문에 반드시 초기화시켜야한다.
  • 블록이 종료되면 지역변수도 사라진다.

 

전역변수

 

  • 전역 변수는 함수 외부에서 선언되는 변수이다.
  • 전역 변수의 범위는 소스 파일 전체이다.
  • 전역 변수는 소스파일 안의 모든 함수에서 사용이 가능한 변수이다.

같은 이름의 전역변수와 지역 변수가 있다면 지역변수가 전역변수보다 우선시된다는 것을 참고하자.

 

 

 

정적 지역 변수

 

정적변수(static variable)는 프로그램이 종료되기 전까지 메모리가 소멸되지 않는 변수다.

함수를 벗어나도 변수가 사라지지 않고 유지된다. 

초기화할 때 반드시 상수로 초기화 해야한다.

초깃값을 지정하지 않으면 디폴트값 0으로 자동 초기화 된다.

 

여기까지는 전역변수와 동일하지만, 차이점은 초기화가 딱 한번만 진행된다는 것이다.

정적변수는 프로그램이 시작될 때 생성 및 초기화 되고 프로그램이 끝날 때 사라진다. 

또한 함수의 매개변수로 사용할 수 없다는 특징이 있다.

 

정적변수는 사용범위에 따라 정적 지역변수와 정적 전역변수로 나뉜다.

 

  • 정적 지역변수(static local variable)는 중괄호 내부에서만 사용할 수 있고, 한번 초기화 되면 이후에 함수 호출 시 값의 초기화를 무시한다.
  • 정적 전역변수(static global variable)는 자신이 선언된 소스 파일에서만 사용할 수 있고, 외부에서는 가져다 쓸 수 없다.
  • 전역변수에 static을 붙이면 변수의 범위를 파일 범위로 제한하는 효과를 낸다.

 

 

 

 

✅ 참고 공부용

 

→ 추후에 자료를 더 추가하겠다.

 

더보기

✔순환호출

 

 

✔라이브러리 함수

 

 

난수 생성 함수(난수 시드)

 

  • 난수는 규칙성이 없이 임의로 생성되는 수를 말한다.
  • 난수는 게임, 시뮬레이션 특히 로또와 같은 프로그래밍에서 사용하곤 한다.
1+ (rand()%45)

예를 들어 1부터 45까지로 난수의 값의 범위를 한정하려면 위와 같이 사용하면 된다.

하지만 위와 같이 사용하면 실행할 때마다 동일한 난수만을 생성하는 문제가 발생한다.

프로그램을 실행할 때마낟 다른 난수를 생성하게 하려면 시드라는 개념을 사용해야한다.

그래서 사용하는 방법이 아래와 같다.

srand(time(NULL));

생김새는 위와 같고, srand는 난수의 시드를 설정하기위해 time(NULL)은 현재시간을 얻는다.

 

함수는 예제를 어떤 문제로 골라서 풀어야할지 고민이 필요할 것 같다.

추후에 codeup을 통해 함수를 사용한 문제를 풀어봐야겠다.

최근 프로그래머스를 통해 함수를 호출하는 기본적인 코딩을 해왔는데 , 그거라도 올려보겠다.

 

 

7월 2주차 과제 : 문제 3_나머지 구하기

7월 2주차 과제로 아래 문제를 풀어볼 것이다. 1. 두 수의 나눗셈 2. 몫 구하기 3. 나머지 구하기 4. 나머지가 1이 되는 수 찾기 세번째 문제이다. 마찬가지로 매개변수 두개가 주어지고 두개를 나눈

jootopia0808.tistory.com

위 코드는 solution이라는 함수를 만들어 main함수에서 호출하는 방식으로 사용하는 간단한 함수의 예제로 보기 좋을 것 같다.

 

 

✅ mini project

 

소수인지를 검사하는 함수 check_prime()를 사용하여 1부터 100사이에 존재하는 소수들을 모두 출력하는 프로그램을 작성해보자.”

예시) 2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97

 

 

 

 

참고 자료 : c언어 정적변수, 지역변수, 전역변수 비교 (static, local, global) (tistory.com)

 

'language : p_study > c language' 카테고리의 다른 글

7월 3주차_C Study 1. 포인터  (0) 2023.07.22
7월 3 , 4주차_C Study 계획서  (0) 2023.07.20
7월 2주차_C Study 1. 배열  (0) 2023.07.15
7월 2주차_C Study 계획서  (0) 2023.07.10
7월 1주차_C Study 계획서  (0) 2023.07.10