티스토리 뷰

C언어

C언어 지역 변수/전역 변수

블로그 강승 2021. 3. 12. 13:54

C언어 지역 변수/전역 변수

C언어 지역 변수와 전역 변수에 관한 요약이다. Do it! C언어 입문(저자:김성엽) 이란 책을 통해 공부했으며, 책의 카테고리를 바탕으로 필자가 이해한 내용을 요약하는 글이다. 내용이 궁금하거나 찾아야 할 내용이 있으면, 필자가 정리한 글을 다시 보면서 복습하기위해 작성했다. 바로 아래에서 글을 확인하도록 하자.

 

지역 변수

함수 안에서 선언된 변수.
함수와 생명주기(Lifetime)이 같음.
지역 변수이름은 중복해서 사용할 수 있음.(다른 함수에서 같은 이름으로 사용해도 어차피 다른 변수임)

 

전역 변수

함수 밖에서 선언된 변수여서 모든 함수에서 적용됨.
전역 변수 result를 선언 후, 지역 변수 result를 선언하면 그 함수에선 지역 변수 result만 가지고 놀 수 있음.
전역 변수는 꼭 필요한 경우만 사용하는 게 좋음.
다른 사람이 만든 라이브러리를 사용 할 수도 있는데, 거기에 전역 변수가 내 전역 변수와 이름이 같다면
오류가 나는데 기계어인 라이브러리를 볼 수도 없고 난감해짐

 

extern 키워드

같은 프로젝트 안에, 소스파일을 여러개 만들 수 있다. 그래야지 컴파일할 때 효과적일 때가 많기 때문이다.
A라는 소스파일에서 전역변수 int result를 선언했을 때, B라는 소스파일에서 result를 이용하려면
extern int result; 를 쓰고나면 result 변수를 참조할 수 있다.

 

※extern 주의할점

/*A소스파일 */

int g_data1 = 0;
int g_data2 = 0;
int g_data5 = 0;
/* B소스파일 */
int g_data1; /*A 소스파일에서 전역변수를 이미 선언했기 때문에 링크에서 오류가남.*/
extern int g_data2; /*A 전역변수 g_data2를 참조하는거니까 정상적임 */
extern int g_data3; /* 어디에도 없는 전역변수 g_data3를 참조한거라 오류남 */
extern int g_data4 =0; /* extern을 첬지만 마지막에 초기화까지하면
                          그냥 전역변수 g_data4 선언한거랑 똑같아서 오류안남*/
extern int g_data5=0; /* A소스파일에 g_data5 전역변수 선언 돼 있는데, 똑같은거 선언해서 오류남 */

 

static 키워드

내가 사용하고 있는 소스 파일에서만 지역변수를 선언하고 싶으면 자료형 앞에 static을 써주면 된다.
또, 함수만의 지역 변수를 선언하고 싶을 때도 함수 안에서 static 지역 변수를 선언하면 함수가 끝나도 나중에 불리어질 때 그 변수에 있는 수가 변하지 않고 이어진다.

 

const 키워드

자료형 옆에 const를 입력하면 변수에 들어있는 값을 변경했을 때 오류가 난다.
변수 값을 바꾸면 안 되는 상황에서 const를 옆에 써놓으면 혹시나 실수로 바꿨을 때 컴파일 과정에서 오류가 뜨니, 아주 좋다.

 

함수가 필요한 이유

함수를 무작정 쓰면 처리 속도를 늦추기 때문에 모든 걸 다 함수로 만들면 안되겠지만 나중에 다시 수정할 일이 생길거 같거나, 여러번 쓰일거 같은 부분을 함수로 만들면 나중에 수정할 때도 함수 부분만 수정하면 돼서 대용량을 다루는 코드에서 엄청 효율적으로 프로그램을 관리할 수 있다.

 

if 조건문은 줄이는 것이 좋다

if(5==A) A=A+2; /*위 식과 아래식은 같음. if 없는게 처리속도가 더 빠름 */

A=A+2*(5==A); /*(5==A)에서 A가 5랑 같으면 참이돼서 A=A+2*(1) 되고
                A가 5가 아니면 거짓이돼서 A=A+2*(0)이 됨. */
int i;
for(i=0, i<10; i++){
/*i를 5로 나눈 나머지를 출력함. i=5,6,7,8,9 일때는 0,1,2,3,4로 출력됨 */
printf("%d,",i%5); /* if최대한 안쓰고 %5를 이용해서 0123401234 가 나오게했음. */
}

 

if조건문에서 조건 수식은 단순화시키자

if(0 != A)
if(A) */두 식은 같음 */

if(0==A)
if(!A) /*두 식은 같음. '!'은 참을 거짓으로 거짓을 참으로 바꿔주는거임 '~'는 비트를 반대로 바꿔줌*/

 

사용하는 시스템의 메모리 정렬 방식

CISC(Complex Instruction Set Computer)와 RISC(Reduced Instruction Set Computer)로 나뉨.
RISC 기반의 하드웨어에서 동작하도록 만든 유닉스(Unix), 리눅스(Linux)
CISC 기반의 하드웨어에서 동작하도록 만든 윈도우(Windows)

 

빅 엔디언 방식

16진법 0x12345678 (4바이트)을 예로 들면 0x12 , 0x34, 0x56, 0x78 순으로 낮은 메모리부터 차근차근 저장되는 방식은 RSIC 기반의 하드웨어에서 동작하도록 만든 유닉스, 리눅스임. Java는 어느 운영체제에서 쓰든 빅 엔디언 방식을 씀.

 

리틀 엔디언 방식

16진법 0x12345678 (4바이트)를 예로 들면 0x78, 0x56, 0x34, 0x12 순으로 낮은 메모리부터 차근차근 저장되는 방식은 CISC 기반의 하드웨어에서 동작하도록 만든 윈도우 운영체제임.

※빅 엔디언 방식, 리틀 엔디언 방식이 다르기 때문에 다른 운영체제 간 네트워크로 데이터를 주고받을 때 주의해야 함.

 

자료형이 다른 두 변수간에 값을 대입하면?

unsigned int a = 0x12345678, b = 0x12345678;
unsigned char c= 0x48, d = 0x00;
a=c; /* a=00000048 */
d=b; /* d=78 이 되긴하는데 경고가뜸. 경고가 안뜨게하려면 */
d=(unsigned char)b; /* 경고가 안뜨게 하려면
                      일시적으로 대입할때만 형변환 시키는 이런표현을 쓰면됨*/

 

글을 마음대로 배포하셔도 되지만, 출처(링크)는 반드시 남겨주시기 바랍니다.

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

C언어 포인터  (0) 2021.03.14
C언어 배열  (0) 2021.03.12
C언어 반복문/시프트 연산자/비트 연산자  (0) 2021.03.11
C언어 연산자/조건문  (0) 2021.03.11
C언어 함수/표준출력함수  (0) 2021.03.11
댓글