과학

조루년들아 몇개만 찍싸고 도망가냐 -3- (프로그래밍, C언어)

안녕하시냐.

 

원래라면 어제 찍 싸야 할 글이었는데, 지인이 불러 크리스마스에 같이 놀자고 해서 많이 늦었다.

 

고로 크리스마스 이브,크리스마스도 앵간하면 쉴거고 니들이 존내 불쌍하면 글 하나 더 싸고 크리스마스에 놀러다닐거야.

 

암튼, 오늘 배울건 지역변수와 전역변수를 배우도록 할게 게이새끼들아.

 

 

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. 지역변수와 전역변수가 동시에 존재하면, 지역변수가 우선순위를 가지게 된다.

 

이제 꺼져 통화해야됨 

 

13개의 댓글

2013.12.24
보츙 설명으로 지역 변수는 함수가 스택 공간에 생성 되면서 변수 역시 스택 공간에 만들어 지게되고 함수가 끝나면 사용했던 스택 공간은 없어짐.. 그러한 이유로 지역 변수가 사라지는거고, 전역 변수나 정적 변수는 프로세스 메모리중 data영역에 만들어지고 이공간은 프로세스가 종료 되기 전까지 유효함.
0
2013.12.24
@잉텔
게이들의 수준으론 이해못함. 단어를 하나하나 나열하면서 설명해줘야함 후로게이야
0
2013.12.24
@StudyOfIT
히힠ㅋ
2
NaG
2013.12.25
@잉텔
마자마자 그런식으로 설명하면 못알아먹어!
이왕 이렇게된김에 메모리영역이나 좀 설명해줘
스택공간과 DATA영역은 뭔지설명좀
0
@잉텔
"히잌ㅋ" 라니 ㅋㅋㅋㅋㅋ 앜 ㅋㅋㅋ 귀여워 ㅋㅋㅋㅋㅋㅋㅋㅋㅋ 추천 줘야지 ㅋㅋㅋㅋㅋㅋㅋ
0
2013.12.25
으응???긍데 지역변수랑 전역변수 두개 섞은 예시있자나
거기서 왜 1이 먼저나오고 그다음 2가나와??
hamsoo1에서 a=2라고 지역변수를 정의했으니까 2가 나오고 그다음 hamsoo2에서 사용되는게 전역번수라서 a=1이나와야하는거 아니야?
0
2013.12.26
@숫자키
hamsoo1에서는 a=2 지역함수로 선언하여 출력했고,
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 함수 인거지.
0
2013.12.26
@숫자키
- 실질적인 수행 순서 -

메인함수 시작!

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함수 종료!
0
2013.12.26
@숫자키
이래도 아리송하다면,

hamsoo1(); 와, 그 함수의 시작과 끝이 다~ 치환된다고 생각하면 됨.

즉,

hamsoo1 ();이 있는 자리에

{
int a=2;
printf("a는 %d데쓰요~!",a);
}

요게 쏙! 하고 들어간다는거지. 앞으로는 코딩을 짜고 하나하나를 보고 위의 댓글처럼 실행 순서를 머릿속으로 나열해봥.
도움 많이됨.
0
2013.12.27
@StudyOfIT
하앍 친절한 설명! 반하겠어...ang~♥
0
2013.12.27
@숫자키
빨리 커서 능력자들을 대체할 코딩노예가 되렴 ^오^
0
2013.12.26
크리스마스~일요일까지 꿀같은 휴일
다들 월요일에 보자 ㅗㅗ
0
2013.12.27
이거에 대해선 뭐라 할말이 없다~
이해하기 쉽게 잘 적어놨네~
0
무분별한 사용은 차단될 수 있습니다.
번호 제목 글쓴이 추천 수 날짜
563 [과학] 경계선 지능이 700만 있다는 기사들에 대해 34 LinkedList 12 21 일 전
562 [과학] 번역)새들은 왜 알을 많이 낳는가? - 후투티의 형제살해 습성... 7 리보솜 3 2024.03.23
561 [과학] 학계와 AI, 그리고 Bitter Lesson (쓰라린 교훈) 26 elomn 35 2024.02.17
560 [과학] 지구의 속삭임, 골든 레코드의 우주 9 Archaea 10 2024.02.16
559 [과학] 잔혹한 과학실험 이야기 <1> 절망의 구덩이 19 개드립하면안됨 37 2024.02.15
558 [과학] 스트레스를 받으면 술이 땡기는 이유 12 동식 16 2024.02.10
557 [과학] 지능은 모계유전이 아니다. 40 울릉특별자치도 35 2024.01.26
556 [과학] 진화를 생각할 때 고려할 것들 23 날씨가나쁘잖아 12 2024.01.17
555 [과학] 학문적(과학적) 접근과 유사 진화심리"학" 26 날씨가나쁘잖아 19 2024.01.15
554 [과학] 호모 사피엔스의 야릇한 은폐된 배란에 대한 남녀 학자의 다... 14 개드립하면안됨 15 2023.12.29
553 [과학] 김영하의 작별인사를 읽고 느낀 점 (스포있음) 21 장문주의 2 2023.11.28
552 [과학] 제4회 포스텍 SF 어워드 공모전 ( SF 단편소설 / SF 미니픽션 ) 2 따스땅 1 2023.11.25
551 [과학] 펌) CRISPR 유전자 가위 치료제 "최초" 승인 12 리보솜 7 2023.11.25
550 [과학] 러시아는 기술산업을 어떻게 파괴시켰는가(펌) 9 세기노비는역사비... 15 2023.11.18
549 [과학] 고양이에 의한 섬생태계 교란과 생물 종의 절멸 (펌) 2 힘들힘들고 6 2023.11.16
548 [과학] 번역) 알츠하이머병 유전자는 어떻게 살아남았는가? 12 리보솜 10 2023.11.15
547 [과학] 『우영우』의 자폐 스펙트럼 장애 개념이 왜곡인 이유 (펌) 47 힘들힘들고 10 2023.11.12
546 [과학] 흑수저 문과충 출신 구글 취직하는 파이썬 특강 -1 14 지방흡입기 11 2023.09.27
545 [과학] 국가별 당뇨 유병율 이거 뭐가 바뀐건지 아는사람? 8 LAMBDA 1 2023.09.27
544 [과학] 물샤워 ㅇㅈㄹ 하는 놈들 봐라 171 철동이 48 2023.09.23