안녕하시냐.
원래라면 어제 찍 싸야 할 글이었는데, 지인이 불러 크리스마스에 같이 놀자고 해서 많이 늦었다.
고로 크리스마스 이브,크리스마스도 앵간하면 쉴거고 니들이 존내 불쌍하면 글 하나 더 싸고 크리스마스에 놀러다닐거야.
암튼, 오늘 배울건 지역변수와 전역변수를 배우도록 할게 게이새끼들아.
3-1. 지역변수
니들같은 좁밥새끼들은 코딩을 할 때 메인함수 외에는 사용하지 않을거야.
하지만 좀 더 복잡한 코딩을 사용 할 시에는 여러가지 함수를 선언하여 사용하게 돼.
int hamsoo1()
{ }
int hamsoo2()
{ }
int hamsoo3()
{ }
이런식으로 말이야.
여기서 '지역 변수'란, 하나의 함수영역 (지역) 안에서만 사용 가능한 변수(변수)를 뜻해.
그렇기에 지역 변수 인거지.
한번 예를 들어 볼게.
그 전에, 지역변수의 예시는 실제로는 메인함수로 함수의 호출을 사용하지 않았기에 사용이 불가능하니 눈으로만 보렴
int hamsoo1()
{
int a=1;
printf("a는 %d데쓰요~!",a);
}
일단 첫번째 함수만 사용 했을때, 이를 실행하면
a는 1데쓰요~!
라는 결과물이 나와.
그렇다면, 이어서 두번째 함수를 붙여 주자.
int hamsoo1()
{
int a=1;
printf("a는 %d데쓰요~!",a);
}
int hamsoo2()
{
printf("a는 %d데쓰요~!",a);
}
이를 실행해 보면, a가 초기화 되지 않았다고 오류문구가 뜨지.
왜 이런 일이 발생했는지 설명해 줄게.
우리가 함수 안에서 선언하게 되는 모든 자료는 메모리영역에 올라가게 돼.
int a를 선언하여 a=10이다! 라고 초기화 해주었으니, 메모리 영역 어딘가에 정수형 변수 a는 10으로 초기화 되었다! 라고 '기록' 되는거야.
그런데, 이 지역변수에는 한가지 큰 특징을 지니고 있어.
바로
* 해당 지역의 함수가 끝남과 동시에 그 함수에서 사용된 지역 변수들은 메모리 공간에서 '사라진다' 라는거야. *
그렇기에,
int hamsoo1()
{
int a=1;
printf("a는 %d데쓰요~!",a);
}
hamsoo1에서 사용된 int a는
a는 1데쓰요~! 라는 문구를 출력하고 함수가 종료되었기에 메모리 공간에서 ㅃㅃ 당했겠지?
int hamsoo2()
{
printf("a는 %d데쓰요~!",a);
}
이어서 hamsoo2로 들어왔을떄는 이미 메모리공간에서 삭제당한 이후였기에 a의 값이 남아있지 않았던 거야.
그래서 오류문구가 떴던 것이고.
결론을 내리자면, 지역변수란 한 지역 함수 내에서만 선언되어 사용되는 변수이고. 지역 함수의 영역에서 벗어나면 메모리 공간에서 사라지게 된다! 라는거야.
3-2 전역변수
자! 지역 변수가 끝난 다음에 나오게 된 건 '전역변수'야.
그런데 느낌아는 게이들은 바로 감이 왔을거야.
'지역' 다음이 '전역'이 나왔으니, 지역과는 반대되는 개념이 아닐까! 하는 감 좋은 게이가 여기 있을리가 없지 미친 ㅉㅉ
전역 변수는, 말 그대로 모든 영역의 함수에서 사용되는 변수를 뜻해.
닥치고 예제를 보자!
#include <stdio.h>
int a=1;
int hamsoo1()
{
printf("a는 %d데쓰요~!",a);
}
int main()
{
printf("a는 %d데쓰요~!",a);
hamsoo1();
getchar();
return 0;
}
코딩의 처음부터 자세하게 설명을 해 줄게.
#include <stdio.h>
int a=1;
함수를 사용하기 전에 정수형 변수 a를 선언해서 1로 초기화 했지?
이런 형태를 처음 보는 게이들은 될지 안될지 에매할거야. 하지만 실제로는 허용이 돼.
*앞으로 사용할 모든 함수에서 정수형 변수 a는 1이돠!!! 라고 미리 선언해주는거라고 생각해야해. *
int hamsoo1()
{
printf("a는 %d데쓰요~!",a);
}
hamsoo1라는 지역함수에서 a라는 변수를 선언하지도, 1로 초기화 하지 않아도
이미 전역변수로써 모든 함수들에게 정수형 변수 a는 1이다! 라고 알렸다고 했으니, 모든 함수들도 int a=10; 라고 알고 있는 상태야.
그렇기에 a는 1데쓰요~! 라고 출력이 되는거야.
int main()
{
printf("a는 %d데쓰요~!",a);
hamsoo1();
getchar();
return 0;
}
메인함수의 선언이야.
위의 3-1.지역 변수에서 굵은줄 친 부분을 읽었겠지?
함수가 아무리 많아도 중심축이 되주는 main 함수의 선언이 없으면 코딩은 실행되지 않아. 그러므로 메인함수는 필히 선언해 주어야 하지.
여기서 또한 이미 a는 1로 초기화 되었기에 a는 1데쓰요~! 라고 출력이 돼.
중요한건 바로 그 밑이야!
hamsoo1();
hamsoo1는 분명 메인함수 이전에 존재했던 지역함수였어. 그렇지?
그런데 말야. * 중심이 되는 메인 함수 외의 함수는, 메인함수가 불러주지 않으면 실행이 되지 않아. *
이를 * '함수의 호출' *이라고 해.
그렇기에
int hamsoo1()
{
printf("a는 %d데쓰요~!",a);
}
이를 실행하여, 사용자가 볼 수 있도록 해주기 위해 main 함수에서 hamsoo1 함수에게 이리와영 뿌잉뿌잉! 하고 불러주는거지.
함수의 호출에 대해서는 다음 시간에 자세히 설명해 주도록 할게. 오늘은 그냥 맛만 보는거임.
아무튼, hamsoo1를 출력하고 ... 개념없는 컴파일러는 디버그-실행을 모두 마치면 자동으로 종료된다고 했지?
최소한 볼 수 있는 시간을 갖기 위해 문자 하나를 사용자에게 입력받는 함수인 getchar();를 사용해 주고는 return 0; 를 거쳐 코딩이 끝나.
결과값은 이렇게 되겠지?
a는 1데쓰요~!a는 1데쓰요~!
물론, 써져 있는건 지역변수의 출력이 먼저 써져 있으나, 모든 중심은 메인함수라고 했지?
메인함수의 출력이 이루어 진 다음에서야 함수의 호출이 들어갔으니, 사실 먼저 출력된 건 메인함수의 것이고 뒤에 있는것이 지역변수의 것이야.
둘 다 a는 1라고 알아서 선언,초기화 되었음을 보고 우리는 한가지를 알게 되었어.
* 전역변수는 모든 메인,지역함수에게 변수의 선언,초기화를 알려야 하므로 메모리공간에 프로그램이 끝날 때 까지 존재할 수 있다 *
헌데 이런 경우는 어떨까?
전역변수와 똑같은 이름의 변수를 지역변수 안에 다른 값으로 초기화 해보는거야.
위의 소스에 이렇게만 추가해 주자.
#include <stdio.h>
int a=1;
int hamsoo1()
{
printf("a는 %d데쓰요~!",a);
}
int main()
{
printf("a는 %d데쓰요~!",a);
hamsoo1();
getchar();
return 0;
}
<변경 전>
#include <stdio.h>
int a=1;
int hamsoo1()
{
int a=2;
printf("a는 %d데쓰요~!",a);
}
int main()
{
printf("a는 %d데쓰요~!",a);
hamsoo1();
getchar();
return 0;
}
<변경 후>
전역 변수 a가 존재함에도 불구하고, hamsoo1에 따로 a를 선언-초기화 해주었어.
이렇게 된다면 실행 결과는 이렇게 돼.
a는 1데쓰요~!a는 2데쓰요~!
어후 씨팔. 바른말 고운말로 서술하니 존나 힘드네
봐봐, 지역변수 저 개새끼가 꼴에 지네 지역에선 짱먹는다고 차카디 차칸 전역변수를 밀쳐냄.
고로 지역변수 개새끼와 전역변수가 동시에 존재하게 되면, 그 지역에선 지역변수가 더 우선시 되는거임.
우선순위 : 지역변수 > 전역변수
메모리공간 : 지역변수(지역을 빠져나가면 ㅃㅃ) < 전역변수(프로그램이 종료되면 ㅃㅃ)
함수영역 : 지역변수(한 함수 내에서만) < 전역변수(전역변수가 선언된 이후의 모든 함수들)
ohohoh전역변수느님ohohoh
요약 -
1. 지역변수는 자신이 선언된 지역함수에서만 사용되고 그 함수를 빠져나가면 메모리 공간에서 사라진다
2. 전역변수는 자신이 선언된 이후 모든 함수에 사용되고 프로그램이 종료되면 메모리 공간에서 사라진다
3. 지역변수와 전역변수가 동시에 존재하면, 지역변수가 우선순위를 가지게 된다.
이제 꺼져 통화해야됨
잉텔
StudyOfIT
잉텔
NaG
이왕 이렇게된김에 메모리영역이나 좀 설명해줘
스택공간과 DATA영역은 뭔지설명좀
너도나도건강하게
숫자키
거기서 왜 1이 먼저나오고 그다음 2가나와??
hamsoo1에서 a=2라고 지역변수를 정의했으니까 2가 나오고 그다음 hamsoo2에서 사용되는게 전역번수라서 a=1이나와야하는거 아니야?
StudyOfIT
main에서는 전역함수인 a=1만으로 그대로 출력했어
그런데 메인 함수가 중심이라고 했지 게이얌?
메인 함수 외의 함수, 즉 hamsoo1는 메인함수가 불러주지 않으면 실행되지 않아.
main이 hamsoo1를 "님 이리와서 코딩좀 보여주셈 ㅇㅇ." 하고 불러야 "헠헠 넹!!" 하고 실행하는겨.
int main()
{
printf("a는 %d데쓰요~!",a);
hamsoo1();
getchar();
return 0;
}
이랬지?
즉. main함수에서 먼저 전역함수 a를 이용하여
printf("a는 %d데쓰요~!",a);
를 출력하고, 그 밑에 문구가 되어서야 hamsoo1를 부르잖아?
hamsoo1(); <-- (요렇게 부름)
그렇기에 실질적인 수행 순서는 메인함수 - > hamsoo1 함수 인거지.
StudyOfIT
메인함수 시작!
↓
printf("a는 %d데쓰요~!",a); 를 실행!
↓
a값 참조해야징! 함수 내 지역함수가 없넹? 전역함수 a = 1를 냠냠!
↓
a는 1데쓰요~! 출력!
↓
hamsoo1(); 를 실행!
↓
hamsoo1 시작!
↓
전역함수로 선언된 int a는 1이지만, 이 지역함수에서의 값은 2로 하자!
↓
printf("a는 %d데쓰요~!",a); 를 실행!
↓
a값 참조해야징! 함수 내 지역함수가 있넹? 지역함수 a = 2를 냠냠!
↓
a는 2데쓰요~! 출력!
↓
hamsoo1에 더 실행할 내용이 없으므로 종료!
↓
getchar(); 를 실행!
↓
사용자에게 하나의 문자를 받음!
↓
return 0; 를 실행!
↓
더 실행할 게 없넹? main함수 종료!
StudyOfIT
hamsoo1(); 와, 그 함수의 시작과 끝이 다~ 치환된다고 생각하면 됨.
즉,
hamsoo1 ();이 있는 자리에
{
int a=2;
printf("a는 %d데쓰요~!",a);
}
요게 쏙! 하고 들어간다는거지. 앞으로는 코딩을 짜고 하나하나를 보고 위의 댓글처럼 실행 순서를 머릿속으로 나열해봥.
도움 많이됨.
숫자키
StudyOfIT
StudyOfIT
다들 월요일에 보자 ㅗㅗ
준가르
이해하기 쉽게 잘 적어놨네~