이번시간은 C언어 정리 네번째 시간으로 C언어의 함수와 프로그램 구조에 대해서 알아보자.
함수란 무엇인가?
함수는 많은 연산작업들을 작은 여러개의 연산작업들도 세분하여 프로그래머들로 하여금 처음부터 큰 프로그램을 작성해야 하는 어려움을 덜게 해준다.
함수의 적당한 사용은 자세히 알 필요 없는 세세한 연산들을 감추어 주므로 전체적으로 프로그램이 명확해지며 수정을 용이하게 해준다.
예를들어 특정한 문자열이나 패턴을 포함하는 라인을 출력하는 프로그램을 작성한다고 하면
while(행이 있는 동안)
if(그 패턴이 행 속에 있으면)
그 행을 출력한다.
이렇게 하면 된다.
이것을 main 루틴에서 구현할 수도 있으나, 각 부분을 독립적인 함수로 만들어서 구조화하는 것이 더욱 효과적이다.
그럼 함수는 어떻게 사용할까?
C언어에서 함수 형태는 다음과 같다.
리턴형 함수이름(매개변수 선언)
{
선언문과 다른 문장들
}
리턴형에는 아무것도 리턴하지않은 void형이 있고, C에서 사용하는 각 데이터형을 사용할 수 있다.
그리고 함수는 연산된 결과값을 리턴형에 맞게 return문을 이용하여 리턴한다.
그리고 C언어에서 매개변수 전달 방법에는 call by value, call by reference 두가지가 있는데 다음 포인터시간에 자세히 알아보자.
변수에는 외부 변수와 내부 변수가 있는데, 이 둘은 반대 개념이다.. ^^;
내부 변수는 함수내에서 정의되는 변수이고, 외부 변수는 함수밖에서 선언됨으로 여러 함수들이 사용할 수 있다.
함수는 항상 외부형으로 정의된다.
왜냐하면 함수내에서 또다른 함수를 정의할 수 없기 때문이다.
외부 변수를 사용하면 매개변수를 이용한 데이터 처리보다 훨씬 편리하다.
하지만 편리하다고 너무 많이 쓰게 되면 프로그램 가독성을 떨어뜨리고 함수들간 많은 데이터 연결이 필요하게 된다.
뭐든지 적당한게 제일 좋은것 같다. ^^
C에서 사용되는 함수들이나 외부변수들은 동시에 컴파일 될 필요는 없다.
프로그램 소스는 여러개의 파일로 나누어질 수도 있고, 이전에 컴파일된 루핀들은 라이브러리로부터 로드 될 수도 있다.
아래에 몇가지 흥미로운 의문점을 적어 보았다.
● 컴파일되는 동안 변수들이 올바르게 선언되도록 하려면 선언들을 어떻게 하여야 할까?
● 프로그램이 로드될 때 모든 부분들이 올바르게 연결되도록 하려면 선언을 어떻게 하여야 할까?
● 외부변수들은 어떻게 초기화시킬까?
● 같은 라이브러리를 사용하는 여러 프로그램을 링크하여 실행시켜도 변수가 중복되어 선언되지 않고 하나만 선언되는 이유는 무엇일까? 즉 #include "stdio.h"가 각 파일마다 있어도 되는 이유는?
앞으로 하나씩 답을 알아가도록 하자.
모든 변수는 범위(scope)가 있다. 범위라 함은 그 변수가 프로그램내에서 효력을 발생하는 부분이다.
외부변수는 프로그램이 끝날대 까지 효력이 유지 되고, 내부변수는 그 변수가 선언된 함수가 끝나게 되면 효력 역시 살아진다.
즉, 내부변수는 변수가 선언된 블록을 벗어나면 할당된 메모리가 자동으로 해제된다.
그래서 자동변수, 혹은 지역변수라고도 한다.
외부변수를 정의된 파일이 아니고 다른 파일에서 사용하고자 할때에는 extern문을 이용해서 외부변수를 사용하고자 하는 파일에 선언을 해야 한다.
그럼 선언과 정의에 대한 의미부터 알아야 하는데, 선언은 변수의 성질을 나타내는 것이고, 정의는 실제로 메모리가 할당되도록 하는 것이다.
즉, 현재 파일에서 외부변수로 int a; 라고 정의하면 a를 위한 기억공간이 할당된다.
그리고 다른 파일에서 이 a변수를 사용하기 위해서 extern int a; 라고 선언하면 이것은 변수의 성질과 형만 선언하게 되고 기억공간과는 전혀 상관이 없게된다.
쉽게 말해서 현재 파일의 외부변수 앞에 extern이 붙어 있으면 이 변수는 현재 파일이 아닌 다른 어느곳에서 정의가 되었고 메모리가 할당 되었다고 생각하면 되는 것이다.
헤더파일은 확장자가 .h인데, 각 c파일들이 공통으로 사용하는 부분을 헤더파일에 선언해 놓고 각 c파일들이 이 헤더파일을 include 하는 방식을 사용한다.
#include 는 뒤에 붙는 파일을 현재 위치에 그대로 펼쳐주는 역할을 한다.
헤더파일은 컴파일 될때는 #include문에 의해서 각 c파일에 확장되어서 컴파일 된다. 즉, 헤더파일만 따로 컴파일 되는 것이 아니다.
혹시 헷갈리시는 분이 있을까 하여... ^^;
그리고 같은 헤더파일을 여러 c파일에서 include 하여도 변수들이 중복 되지 않는 이유는 헤더파일을 다음과 같이 코딩하기 때문이다.
#ifndef _TEST_H_
#define _TEST_H_
내용
#endif
위의 '내용'은 딱 한번만 수행이 된다.
그러므로 여러 파일이 include해도 '내용'은 중복이 안되는 것이다.
static은 정적변수를 선언하기 위함인데, 변수 데이터형 앞에 사용된다.
예) static int a;
외부변수에 사용하면 그 변수는 현재 파일에서만 사용할 수 있게된다.
내부변수에 사용하면 그 변수는 외부변수화 되어서 현재 블록을 빠져나가도 효력이 유지된다.
내부변수이지만 외부변수처럼 쓰기 위해서 자주 사용한다.
C 프로그램에서 초기화는 아주 중요하다.
왜냐하면 외부변수는 별다른 초기화가 없을 경우 0으로 자동 초기화 되지만, 내부 변수는 별다른 초기화가 없을 경우 정의가 되지 않은 쓰레기 값이 들어가게 됨으로 프로그램이 정상동작을 하지 않을 수도 있다.
C컴파일러는 이것을 오류로 보지 않기 때문에 초기화의 중요성은 더해지는 것이다.
항상 어떠한 변수든지 초기화 하는 습관을 가지자!!
C 함수들은 재귀적으로 자기 자신을 계속 호출할 수가 있다. 이른 재귀호출 혹은 순환호출이라고 하는데, 현재 함수 어느 위치에서 자기자신을 다시 재귀호출하게 되면 그 재귀호출된 함수의 내부변수들은 또다른 메모리 공간을 가지게 된다.
즉, 재귀호출을 계속하면 같은 함수내의 같은 변수지만 다른 메모리 공간을 계속 가지게 되는것이다.
재미있지 않은가?? ^^;
이것으로 이번시간은 마치도록 하겠다..
다음시간에는 C언어의 꽃이라고 할 수있는 포인터와 배열에 대해서 알아보자!
1. 함수의 기초
함수란 무엇인가?
함수는 많은 연산작업들을 작은 여러개의 연산작업들도 세분하여 프로그래머들로 하여금 처음부터 큰 프로그램을 작성해야 하는 어려움을 덜게 해준다.
함수의 적당한 사용은 자세히 알 필요 없는 세세한 연산들을 감추어 주므로 전체적으로 프로그램이 명확해지며 수정을 용이하게 해준다.
예를들어 특정한 문자열이나 패턴을 포함하는 라인을 출력하는 프로그램을 작성한다고 하면
while(행이 있는 동안)
if(그 패턴이 행 속에 있으면)
그 행을 출력한다.
이렇게 하면 된다.
이것을 main 루틴에서 구현할 수도 있으나, 각 부분을 독립적인 함수로 만들어서 구조화하는 것이 더욱 효과적이다.
그럼 함수는 어떻게 사용할까?
C언어에서 함수 형태는 다음과 같다.
리턴형 함수이름(매개변수 선언)
{
선언문과 다른 문장들
}
리턴형에는 아무것도 리턴하지않은 void형이 있고, C에서 사용하는 각 데이터형을 사용할 수 있다.
그리고 함수는 연산된 결과값을 리턴형에 맞게 return문을 이용하여 리턴한다.
정수를 인자로 받아서 덧셈을 하는 프로그램..
그리고 C언어에서 매개변수 전달 방법에는 call by value, call by reference 두가지가 있는데 다음 포인터시간에 자세히 알아보자.
2. 외부변수
변수에는 외부 변수와 내부 변수가 있는데, 이 둘은 반대 개념이다.. ^^;
내부 변수는 함수내에서 정의되는 변수이고, 외부 변수는 함수밖에서 선언됨으로 여러 함수들이 사용할 수 있다.
함수는 항상 외부형으로 정의된다.
왜냐하면 함수내에서 또다른 함수를 정의할 수 없기 때문이다.
외부 변수를 사용하면 매개변수를 이용한 데이터 처리보다 훨씬 편리하다.
하지만 편리하다고 너무 많이 쓰게 되면 프로그램 가독성을 떨어뜨리고 함수들간 많은 데이터 연결이 필요하게 된다.
뭐든지 적당한게 제일 좋은것 같다. ^^
외부변수 예제..
3. 변수 범위 규칙(Scope Rules)
C에서 사용되는 함수들이나 외부변수들은 동시에 컴파일 될 필요는 없다.
프로그램 소스는 여러개의 파일로 나누어질 수도 있고, 이전에 컴파일된 루핀들은 라이브러리로부터 로드 될 수도 있다.
아래에 몇가지 흥미로운 의문점을 적어 보았다.
● 컴파일되는 동안 변수들이 올바르게 선언되도록 하려면 선언들을 어떻게 하여야 할까?
● 프로그램이 로드될 때 모든 부분들이 올바르게 연결되도록 하려면 선언을 어떻게 하여야 할까?
● 외부변수들은 어떻게 초기화시킬까?
● 같은 라이브러리를 사용하는 여러 프로그램을 링크하여 실행시켜도 변수가 중복되어 선언되지 않고 하나만 선언되는 이유는 무엇일까? 즉 #include "stdio.h"가 각 파일마다 있어도 되는 이유는?
앞으로 하나씩 답을 알아가도록 하자.
모든 변수는 범위(scope)가 있다. 범위라 함은 그 변수가 프로그램내에서 효력을 발생하는 부분이다.
외부변수는 프로그램이 끝날대 까지 효력이 유지 되고, 내부변수는 그 변수가 선언된 함수가 끝나게 되면 효력 역시 살아진다.
즉, 내부변수는 변수가 선언된 블록을 벗어나면 할당된 메모리가 자동으로 해제된다.
그래서 자동변수, 혹은 지역변수라고도 한다.
외부변수를 정의된 파일이 아니고 다른 파일에서 사용하고자 할때에는 extern문을 이용해서 외부변수를 사용하고자 하는 파일에 선언을 해야 한다.
그럼 선언과 정의에 대한 의미부터 알아야 하는데, 선언은 변수의 성질을 나타내는 것이고, 정의는 실제로 메모리가 할당되도록 하는 것이다.
즉, 현재 파일에서 외부변수로 int a; 라고 정의하면 a를 위한 기억공간이 할당된다.
그리고 다른 파일에서 이 a변수를 사용하기 위해서 extern int a; 라고 선언하면 이것은 변수의 성질과 형만 선언하게 되고 기억공간과는 전혀 상관이 없게된다.
쉽게 말해서 현재 파일의 외부변수 앞에 extern이 붙어 있으면 이 변수는 현재 파일이 아닌 다른 어느곳에서 정의가 되었고 메모리가 할당 되었다고 생각하면 되는 것이다.
4. 헤더 파일
헤더파일은 확장자가 .h인데, 각 c파일들이 공통으로 사용하는 부분을 헤더파일에 선언해 놓고 각 c파일들이 이 헤더파일을 include 하는 방식을 사용한다.
#include 는 뒤에 붙는 파일을 현재 위치에 그대로 펼쳐주는 역할을 한다.
헤더파일은 컴파일 될때는 #include문에 의해서 각 c파일에 확장되어서 컴파일 된다. 즉, 헤더파일만 따로 컴파일 되는 것이 아니다.
혹시 헷갈리시는 분이 있을까 하여... ^^;
그리고 같은 헤더파일을 여러 c파일에서 include 하여도 변수들이 중복 되지 않는 이유는 헤더파일을 다음과 같이 코딩하기 때문이다.
#ifndef _TEST_H_
#define _TEST_H_
내용
#endif
위의 '내용'은 딱 한번만 수행이 된다.
그러므로 여러 파일이 include해도 '내용'은 중복이 안되는 것이다.
5. 정적변수(Static Variables)
static은 정적변수를 선언하기 위함인데, 변수 데이터형 앞에 사용된다.
예) static int a;
외부변수에 사용하면 그 변수는 현재 파일에서만 사용할 수 있게된다.
내부변수에 사용하면 그 변수는 외부변수화 되어서 현재 블록을 빠져나가도 효력이 유지된다.
내부변수이지만 외부변수처럼 쓰기 위해서 자주 사용한다.
6. 초기화
C 프로그램에서 초기화는 아주 중요하다.
왜냐하면 외부변수는 별다른 초기화가 없을 경우 0으로 자동 초기화 되지만, 내부 변수는 별다른 초기화가 없을 경우 정의가 되지 않은 쓰레기 값이 들어가게 됨으로 프로그램이 정상동작을 하지 않을 수도 있다.
C컴파일러는 이것을 오류로 보지 않기 때문에 초기화의 중요성은 더해지는 것이다.
항상 어떠한 변수든지 초기화 하는 습관을 가지자!!
7. 재귀호출(Recursion)
C 함수들은 재귀적으로 자기 자신을 계속 호출할 수가 있다. 이른 재귀호출 혹은 순환호출이라고 하는데, 현재 함수 어느 위치에서 자기자신을 다시 재귀호출하게 되면 그 재귀호출된 함수의 내부변수들은 또다른 메모리 공간을 가지게 된다.
즉, 재귀호출을 계속하면 같은 함수내의 같은 변수지만 다른 메모리 공간을 계속 가지게 되는것이다.
재미있지 않은가?? ^^;
이것으로 이번시간은 마치도록 하겠다..
다음시간에는 C언어의 꽃이라고 할 수있는 포인터와 배열에 대해서 알아보자!


당신의 의견을 작성해 주세요.
재미없다 ㅡㅡ;;
이런 교육적인글이 의외로 인기가 높은건가
역시 난 유해싸이트인가
오케바리*^^* 2005/09/08 10:37 편집/삭제 댓글 작성 댓글 주소
슬랜// 무슨말인지 한참 생각했음... ^^; 나의 마지막 멘트 때문에 그랬구만... ㅎㅎ
무장공비// 무슨말씀을... 유해사이트가 인기가 더 높은 법이요.. ^^*
씨언어의 기초는 역시 함수죠 !!
(재귀호출 잘못쓰면 정말 위험하죠... =ㅅ=)
포인터 배열도 멋진 강의 부탁드려요~//
제 강의를 보시는 분도 계시는군요...
감사합니다... ^^