2023.01.10 - 안드로이드 앱개발자 과정

CHA·2023년 1월 10일
0

C언어



함수 Function : 특정한 기능의 코드가 작성된 영역


함수 정의 문법

함수 호출

프로그램의 시작은 main() 의 중괄호 시작과 함께 시작되며, 중괄호가 끝나면 프로그램도 종료된다.
함수 호출을 위해서는 1. 함수를 만들어야 하고, 2. 호출해야한다. 다음 코드를 보자.

#include <stdio.h>

void login(){ // 1. 함수 생성
	printf("로그인");
}
void main() {
	login();//2. 함수 호출
}

함수 프로토타입

그런데 문제가 하나 있다. 프로그램의 시작이 main() 함수라고 했는데, 위 코드 처럼 main() 함수 위에 다른 함수가 있다면, 그리고 그 다른함수의 숫자가 굉장히 많아진다면, 프로그램이 시작점이 어딘지 알기 힘들어질것이다. 그러면 다른 함수를 밑으로 내려서 코드를 짜보자.

#include <stdio.h>

void main() {
	login();
}

void login() {
	printf("로그인");
}
결과는 오류!

프로그램은 위에서 밑으로 진행되며 코드를 읽기 때문에, main() 에서 login()을 호출할 수 없다고 오류가 뜬다. 그럴때 사용하는것이 함수의 프로토타입이다. 다음 코드를 보자.

#include <stdio.h>

void login(); // 함수의 프로토 타입 

void main() {
	login();
}

void login() {
	printf("로그인");
}
결과는 정상!

함수의 4가지 형태

  • 종합 예제
#include <stdio.h>

void display();
int input();
int getPlus(int a, int b);
void output(int sum);

void main() {
	//1. 안내문구 기능 호출
	display();

	//2. 사용자로부터 정수 2개를 입력받는 기능 호출
	int a, b;
	a = input();
	b = input();

	//3.2개의 정수값을 덧셈하여 결과를 리턴해주는 기능 호출
	int sum = 0;
	sum = getPlus(a, b);

	//4. 결과를 출력해주는 기능 호출
	output(sum);
}

void display() {
	printf("사용자로 부터 정수 2개를 입력받아 덧셈을 출력하는 프로그램\n");
}

int input() {
	int n;
	printf("input : ");
	scanf_s("%d", &n);
	return n;
}

int getPlus(int a,int b) {
	return a + b;
}

void output(int sum) {
	printf("a + b : %d", sum);
}


변수의 종류

  • 지역변수 ( Local Valuable ) : { } 영역 안에 선언되면 지역변수

  • 전역변수 ( Global Valuable ) : { } 영역 밖에 선언되면 전역변수

#include <stdio.h>

int g; // 전역 변수

int aaa() {
	int a; //	지역 변수
	a = 10;	//	OK!
	g = 100; //	OK!
	//k = 10; -> 에러
}
void main() {
	int k; //	지역 변수
	k = 10; //	OK!
	g = 200;//	OK!
	//a = 10; -> 에러
}
  • 정적변수 ( Static Valuable ) : static 키워드를 변수 앞에 붙여서 생성.

    • 정적 전역 변수 : 사용할 일이 극히 드물다. 일단 정적지역변수만 알아둘것.

    • 정적 지역 변수 : 지역변수 처럼 사용이 가능. But, 중괄호가 종료되도 메모리가 소멸되지 않는다.

      • 정적 변수의 필요성
        예를 들어, 카운트 함수를 만든다고 해보자. 그럴 경우 전역 변수를 이용하면 다음과 같이 코드를 짤 수 있다.

          #include <stdio.h>
        
          int count;
        
          void counting() {
        
              count++;
              printf("%d\n", count);
          }
        
          void main() {
              counting();
              counting();
              counting();
              counting();
          }

        그런데 여기서, 프로그래머의 실수로 인해 main() 함수에서 count 변수에 접근한다면? 큰 실수가 될것이다.그렇다고 다른 함수에서 못쓰게 하기 위해 지역변수로 사용하자니 counting 함수의 기능에 문제가 생긴다.그래서 전역변수처럼 함수가 끝나도 메모리에 남아있으면서, 지역변수처럼 다른 함수에서 접근하지 못하게 하기위해 다음 코드와 같은 static 변수가 생겨났다.

         #include <stdio.h>
        
        void counting() {
            static int count;
            count++;
            printf("%d\n", count);
        }
        
        void main() {
            counting();
            counting();
            counting();
            counting();
        }

변수의 메모리 공간

전역변수를 사용하면 함수의 리턴이나 매개변수를 사용할 필요가 없어보인다. 그런데, 이것은 잘못되었다. 바로 전역변수는 메모리를 비효율적으로 사용하기 때문이다. 변수마다 메모리 공간에 어떠한 차이가 있는지 알아보자.

  • 지역변수의 메모리 생성과 소멸

    • 생성 : 중괄호 시작
    • 소멸 : 중괄호 종료
  • 전역변수의 메모리 생성과 소멸

    • 생성 : 프로그램 시작
    • 소멸 : 프로그램 종료
profile
Developer

0개의 댓글