본문 바로가기
C언어

세이버의 C언어 강의 21강_ 함수란 무엇인가_Part2(함수의 형태와 변수의 종류)

by 비원(Be one) 2019. 5. 12.
반응형

여러분 안녕하세요. 세이버입니다.

 

이번 강에서는 다양한 함수의 형태와 변수들의 종류에 대해서 알아보겠습니다. 

 

함수의 대한 개념이 부족하신 분들은 이전 강의를 참고하시길 바랍니다.

세이버의 C언어 강의 20강_ 함수란 무엇인가 : https://poci.tistory.com/29

 

세이버의 C언어 강의 20강_ 함수란 무엇인가

여러분 안녕하세요. 세이버입니다. 이번 강에서는 함수에 대해 소개해드리려 합니다. 1. 함수란? 중고등학생 분들은 함수라는 용어를 수학 시간에 많이 들어보셨을 겁니다. 수학에서의 함수는 x와 y의 관계식으..

poci.tistory.com


1. 함수의 형태

지난 강에서 함수의 기본 요소로 출력 타입, 입력 타입이 있다고 설명드렸습니다.

그러나 모든 함수가 출력 타입과 입력 타입을 가지지는 않습니다.

이러한 출력 타입과 입력 타입의 유무로 함수의 형태는 네 가지로 나누어집니다.


출력 타입과 입력 타입이 모두 있는 함수


이러한 함수의 형태는 출력 타입과 입력 타입이 모두 있는 함수입니다.

출력 타입과 입력 타입을 쓰는 곳에 입출력하고자 하는 자료형을 넣어주시면 됩니다.

또한 출력 타입이 있기에 return 값이 있어야 합니다.

 


출력 타입은 있지만, 입력 타입은 없는 함수


이 형태는 출력 타입은 있지만, 입력 타입이 없는 함수입니다.

출력 형태는 그대로 출력하고자 하는 자료형에 맞추어 넣어주시고,

입력 형태를 넣는 곳에는 void를 넣으시면 됩니다.

 

void는 '하나도 없는'이라는 단어로, 컴퓨터 언어에서는 없다는 것을 의미합니다.

void는 없다는 것을 눈으로 확인시켜주기 위해서 쓰는 예약어입니다. 

따라서 void를 안 쓰고 int sum() 이렇게 입력 타입란을 비워두셔도 무관합니다.

 

출력 타입은 있기에 return 값은 있어야 합니다.

 


입력 타입은 있지만, 출력 타입은 없는 함수


이 형태는 입력 타입은 있지만, 출력 타입이 없는 함수입니다.

입력 형태를 쓰는 곳에 입력하고자 하는 자료형과 변수를 넣은 후에 출력 형태란에는 void를 넣으시면 됩니다.

물론 void 없이 sum(int a) 라고 하셔도 무관합니다.

 

출력 형태가 없기 때문에 return 값이 존재하지 않습니다.

 


출력 타입과 입력 타입이 모두 없는 경우


이 형태는 출력 타입과 입력 타입이 모두 없는 함수입니다.

출력 타입과 입력 타입을 쓰는 곳에 모두 void를 넣거나, sum() 이렇게만 쓰셔도 무관합니다.

출력 타입이 없기에 return 값이 없습니다.

 

참고로 저희가 지금까지 예제로 다룬 main 함수가 이런 형태였습니다.

 

 

2. 변수의 종류

변수는 5가지의 종류가 있습니다.

1. 지역 변수

2. 전역 변수

3. 정적 변수

4. 외부 변수

5. 레지스터 변수

 

이제부터 하나씩 소개해드리겠습니다.

 

지역 변수(Local Variable)는 선언된 지역에서만 유효한 변수입니다.

 

main 함수와 sum 함수에 모두 변수 result가 있습니다.

만약 result 변수가 한 함수 안에서 두 번 선언되었다면 오류가 났겠지만,

다른 함수에서 각각 한 번씩 선언된 것이기에 지역이 달라 오류가 나지 않습니다.

17줄의 result 변수는 main 함수의 지역변수, 7줄의 result 변수는 sum 함수의 지역변수입니다.

 

A아파트 102호에 사는 영희와 A아파트 105호에 사는 영희는 이름만 같을 뿐 서로 다른 사람인 것과 마찬가지입니다.

 

지역 변수의 메모리는 선언된 함수가 끝나면 사라지는 특징이 있습니다.

sum 함수가 끝나면 sum 함수의 지역 변수 result는 사라지게 됩니다. 

 

 

전역 변수(Global Variable)는 지역에 제한을 가지지 않는 변수를 의미합니다.

 

예제에서 main 함수와 sum 함수에서 변수 result를 선언하지 않았습니다.

그러나 실행을 하면 문제없이 동작합니다.

3줄에서 변수 result를 함수들 밖에 선언함으로써 result는 지역에 제한을 갖지 않은 전역 변수라는 걸 알 수 있습니다.

 

지역에 제한을 갖지 않으므로 모든 함수에 적용할 수 있다는 것이 전역 변수의 장점입니다.

 

또한, 전역 변수는 초기화를 할 때 상수만으로 초기화해야 합니다.

int num2=num1; 이런 식으로 변수의 값으로 초기화할 수 없습니다.

 

그리고 정수형 전역 변수의 경우는 초기화를 하지 않아도 자동으로 0이 대입되는 특징이 있습니다.

 

전역 변수는 지역 변수와는 달리 선언된 지역이 없기 때문에 프로그램이 끝날 때까지 메모리가 살아있습니다.

 

 

정적 변수(Static Variable)는 초기화를 딱 한 번만 하는 변수입니다.

정적 변수는 전역 변수처럼 상수만으로 초기화하고, 자동으로 0이 대입되지만,

초기화를 딱 한 번만 한다는 특징이 있습니다.

 

변수를 선언할 때 앞에 static을 넣은 변수가 정적 변수입니다.

ex) static int num;

 

count 함수에서 정적 변수 num1와 지역 변수 num2를 선언했습니다.

그리고 이 둘의 값을 1씩 증가한 후 값을 출력하고 있습니다.

 

지역 변수 num2는 count 함수가 실행될 때마다 0으로 초기화되기 때문에 값이 계속 1로만 출력됩니다.

그러나 정적 변수 num1는 초기화가 한 번만 되므로 값이 계속 증가하는 것입니다.

 

외부 변수(Extern Variable)는 현재의 파일이 아닌 다른 파일에서 선언된 변수를 가져와서 사용하는 것을 의미합니다.

다른 파일인 test.c에서 a라는 함수를 가져오고 싶다면 extern 키워드를 이용해서 a함수를 가져올 수 있습니다.

ex) extern int a;

이 함수는 Dev C++에서는 사용할 수 없습니다.

마이크로 소프트의 Visual Studio에서는 사용 가능하니 Visual Studio를 사용하시는 분들은 참고하세요.

 

레지스터 변수(Register Variable)는 CPU 내부의 임시 기억 장소인 레지스터에 할당하는 변수입니다.

레지스터의 처리속도가 빠르다는 장점이 있기에 레지스터 변수 역시 처리속도가 빠르다는 장점이 있습니다.

따라서 지역 변수보다 입출력 속도가 빠릅니다.

 

하지만 레지스터의 용량이 적기 때문에 용량을 벗어날 정도로 변수를 많이 선언하면 지역 변수로 할당됩니다.

그러므로 레지스터 변수는 생성과 소멸이 주기적인 변수들로 사용하면 효과적입니다.

 

register 예약어로 레지스터 변수를 선언할 수 있습니다.

ex) register int a;

 

근데 대분의 컴파일러에서 코드 최적화를 위해 자동으로 레지스터 변수를 설정하는 기능을 제공하니까 직접 지정하지 않아도 컴파일러가 자동으로 해줍니다.

 

그러니 여러분들은 이런 변수가 있다는 것만 알아두시면 됩니다.

 

그럼 왜 알려준겨...


이번 강의는 여기까지입니다.

 

오늘도 수고하셨습니다.

 


정리

- 함수의 형태

    1. 입력과 출력이 모두 있는 경우 : 입력 형태, 출력 형태를 넣는 곳에 맞는 자료형을 쓴다. (return 값 필요)

    2. 입력만 있고 출력이 없는 경우 : 출력 형태를 넣는 곳에 void를 쓴다. (return 값 불필요)

    3. 출력만 있고 입력이 없는 경우 : 입력 형태를 넣는 곳에 void를 쓴다. (return 값 필요)

    4. 입력과 출력이 모두 없는 경우 : 입력 형태, 출력 형태를 넣는 곳에 void을 쓴다. (return 값 불필요)

 

- 변수의 종류

    1. 지역 변수 : 가장 기본적인 변수, 선언된 함수 안에서만 사용 가능한 변수

    2. 전역 변수 : 모든 함수에 적용 가능한 변수

    3. 정적 변수 : 초기화를 한 번만 하는 변수

    4. 외부 변수 : 다른 파일의 함수를 가져와서 사용하는 것

    5. 레지스터 변수 : 처리속도가 가장 빠른 변수


강의가 유익하셨거나 마음에 드셨으면 구독과 좋아요, 댓글 부탁드립니다.

궁금하신 점이나 질문은 댓글이나 메일 남겨주세요.

 

poci5003@gmail.com

 

반응형