2007. 3. 2. 11:49

return 은 두가지 역할을 합니다.

1. 함수의 실행을 끝냅니다.
2. 함수를 호출한 다른 함수나 시스템에게 어떤 값을 돌려줍니다.

return; // 이와 같이 값이 없이 그냥 return을 사용하면 돌려주는 값 없이 함수를 끝낸다는 의미입니다.

return 뒤에 따라오는 값은 함수의 선언 또는 정의와 일치해야 합니다.

int f(); // 함수가 정수형으로 선언되었습니다.

main()
{
    int i;
    i = f();                 // f() 함수가 돌려준 값을 i라는 변수에 넣습니다.
}

int f()                     // 함수의 정의 부분입니다. 역시 정수형입니다.
{
    return 3;             // 이 함수는 3이란 정수값을 돌려줍니다. 
                            // 여기에서 정수가 아닌 값을 돌려주려하면 에러가 됩니다.

}

void 로 선언된 함수는 return; 처럼 돌려주는 값이 없습니다.
그리고 함수의 끝부분에서는 return; 을 생략해도 함수가 끝납니다.
돌려주는 값이 있는 return은 생략할 수 없습니다.

void f(); // 돌려주는 값이 없는 함수입니다.

void f()
{

} // return; 이 생략되었습니다.

int main() 함수의 리턴값은 시스템(OS)이 받습니다.
예를 들어 윈도우즈에서 프로그램을 실행시키면 윈도우즈는
프로그램이
끝날 때 main()함수의 리턴값을 받아서 이 프로그램이 올바로 끝났는지 여부를 판단합니다.

하지만 main()함수는 void로 선언해도 상관 없습니다.
에러 처리는 시스템이 알아서 하니까 최근에는 void로 선언해서 사용합니다.

마지막으로 예전의 C언어에서는 void형 함수를 지원하지 않았습니다.
따라서 모든 함수는 무언가 리턴값이 있어야 했고, 프로그래머들은 필요 없는 리턴값을 코딩에 넣어야 했었습니다.

Posted by Paul Hwang
2007. 2. 26. 18:00

전역변수를 쓸 경우 '이런 전역변수가 있고 이것은 이러한 경우에 이렇게 써야 한다'는
사실을 프로그래머가 항상 인지하고 있어야 한다.(도큐멘트를 항상 잘 하는 습관이 있으면 된다)

그렇지 못하면 이렇게 써야 할 변수를 저렇게 써버리면서 프로그램이 꼬이기 시작,
또는 이런 변수가 있다는걸 잊어버리고 같은 일을 하는 변수를 또 만드는 지저분한 경우도 생깁니다.

이게 프로그램이 작을 때는 별 문제가 안되는데 제법 큰 프로그램을 짤 때는 재앙의 시작이 될 수가 있습니다.
전역변수만 100개가 넘는다고 생각해보세요. 그리고 그걸 다 완벽하게 기억해두고 써야 한다면.. 끔찍하죠.

그래서 경험이 쌓인 프로그래머들은 지역변수로 처리할 수 있는건 다 지역변수로만 처리합니다.
지역변수라는건 그 함수 내지는 그 클래스 내에서만 쓰이는 놈이기 때문에
설령 이게 뭐하는 변수인지를 잊어버렸더라도 코드 전체를 싸그리 점검해야 할 일은 없죠.

Posted by Paul Hwang
2007. 2. 26. 17:54

전역 변수는 프로그램의 내부에서 사용이 가능한 변수로 개념적인 정의를 할 수 있습니다.
하지만 실제 언어를 구현하여 컴파일을 하는 과정에서 조금 달라지게 됩니다.

예를 들어 C언어 인 경우

소스 파일 마다 obj(오브젝트 파일) 을 만들고 각각의 오브젝트 파일을 합쳐 실제 실행 파일을 만들게 되는데 이때 전역변수는 각각의 오브젝트 파일 마다 메모리 공간을 할당 하지 않고 하나에만 할당을 받게 됩니다.

A.c 에서 전역변수 a를 선언하면 a.obj 에만 전역변수 a가 메모리를 할당받음
B.c 소스에서 전역변수 a를 다시 선언하면
링크 과정(오브젝트 파일을 묶어 실행파일을 만드는 과정) 에서
양쪽에 선언된 전역변수 a 가 충돌이 일어납니다.

해결방법은 B.c는 전역변수 a가 이미 선언되었으니 메모리는 할당하지 않고 A.c의 a 를 가져다 쓰게 해야 합니다.
즉 B.c 에서 extern 키워드를 쓰면 할당하지 않고 가져다 쓰게 됩니다.

------------- a.c ---------------

// 전역변수 a의 메모리 할당 (실체화)

int a = 0;

...

------------- b.c ---------------

// 전역변수 a ( 할당은 하지 않고 a.c에 선언된 것(외부)을 가져오기)

extern int a;

'STUDY > C 언어' 카테고리의 다른 글

명령어 이해 - for 문  (0) 2007.03.07
명령어 이해 - #ifdef / #ifndef / #endif  (0) 2007.03.02
명령어 이해 - if / while / brake  (0) 2007.03.02
명령어 이해 - return  (1) 2007.03.02
전역변수 사용시 주의 할 점  (0) 2007.02.26
Posted by Paul Hwang