딩굴댕굴

C 14Day (20160126)

by jennysgap

BOX

기억 클래스

정의

  • 데이터를 저장하는 메모리 공간의 영역을 규정짓는 것
  • 어떤 변수가 메모리 어느 영역에 할당되냐에 따라 변수의 생존 범위와 생존 기간, 사용 범위가 달라진다.
지역 변수
  • 중괄호 내에 선언되는 변수 (지금까지 우리가 사용했던 것들 ~~전부 지역변수라고 생각하면 됨)
  • 지역변수는 해당지역을 벗어나면 자동으로 소멸된다.
  • 선언된 지역 내에서만 유효하기 때문에 선언된 지역이 다르면 이름이 같아도 문제가 되지 않는다.
    (함수가 시작될 때 메모리 공간이 생기고 함수가 종료될 때 메모리 공간에서 없어진다.)
    이러한 지역변수들은 stack메모리에 할당된다.

전역 변수

  • 전역변수는 함수 외부에 선언된다.
  • 프로그램의 시작과 동시에 메모리 공간에 할당되어 종료 시까지 존재한다.
  • 별도의 값을 초기화하지 않으면 0으로 초기화한다.
  • 프로그램 전체 영역 어디서든 접근이 가능하다




지역변수(Local Variable) 예제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <stdio.h>
 
int One(void)
{
    int num = 10;
    num++;
    printf("One : %d \n", num);
    return 0;
}
 
int Two(void)
{
    int num1 = 20;
    int num2 = 30;
    num1++, num2--;
    printf("num1 & num2 : %d %d \n", num1, num2);
    return 0;
}
 
int main(void)
{
    int num = 17;
    One();
    Two();
    printf("maint num : %d \n", num);
    return 0;
}
cs


main ---> 17 num

One ---> 10 num ---> 11num 출력 ---> 종료

Two ---> 20 num1 / 30 num2 ---> 21 num1 / 29 num2 출력 ---> 종료

main ---> 17 num 출력 ---> 종료


즉, num은 이름이 같지만 서로 다른 변수임 (각 함수 내에서만 유효)





다양한 형태의 지역변수 예제

지역변수는 외부에 선언된 동일한 이름의 변수를 가린다.


1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
int main(void)
{
    int num = 1;
    if (num ==1)
    {
        int num = 7;
        num += 10;
        printf("if문 내 지역변수 num : %d \n", num);
    }
    printf("main 함수 내 지역변수 num : %d \n", num);
    return 0;
}
cs







전역변수(Global Variable) 예제

  • 프로그램이 시작되면 전역변수에 대한 메모리가 할당
  • 프로그램이 종료될 때 메모리공간에서 소멸됨
  • 메모리 공간중 Data영역에 저장됨
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>
 
void Add (int val);
int num;                        //전역변수는 기본 0으로 초기화됨 (지역변수와의 차이점)
 
int main(void)
{
    printf("num : %d \n", num);
    Add(3);
    printf("num : %d \n", num);
    num++;                        //전역변수 num의 값 1증가
    printf("num : %d \n", num);
    return 0;
}
 
void Add(int val)
{
    num += val;                    //전역변수 num의 값 val만큼 증가
}
cs


0 num

main ---> 0 출력 ---> 매개변수를 통한 3값이 저장 ---> 3 출력 ---> +1 ---> 4 출력





전역변수의 문제점 ? 



전역변수의 변경은 전체 프로그램의 변경으로 이어질 수 있으며

전역변수에 의존적인 코드는 프로그램 전체 영역에서 찾아야 한다.

어디서든 접근이 가능한 변수기 때문에....

가급적이면 사용금지 (사용 안하는 것을 추천!!)





static변수

전역변수의 문제점을 어느정도 해결하고 사용할 수 있는 변수

  • 중괄호 내부에 선언되어 반환형 앞에 static 변수 입력하면 됨
  • 프로그램이 시작되면 메모리 공간에 할당된다. (=전역변수랑 비슷)
  • Data 영역에 저장된다.
  • 지역변수와 전역변수의 짬뽕이라고 생각하면 된다.
  • static변수는 무조건 내부에서만 접근이 가능하다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>
 
void SimpleFunc(void)
{
    static int num1 = 0;    // 초기화하지 않으면 0 초기화
    int num2 = 0;            // 초기화하지 않으면 쓰레기 값 초기화
    num1++, num2++;
    printf("static : %d, local : %d \n", num1, num2);
}
 
int main(void)
{
    int i;
    for(i=0; i<3; i++)
        SimpleFunc();
    return 0;
}
cs


num=0 / num=0 ---> +1 +1 ---> 종료

함수가 종료되도 static변수는 메모리 공간에 남아있다.

static변수는 그대로~~~

프로그램이 실행되면 static지역변수는 해당 함수에 존재하지 않는다.






기억 클래스

static변수

  • 선언된 함수 내에서만 접근이 가능하다. (지역변수 특성)
  • 딱 1회 초기화되고 프로그램 종료 시까지 메모리 공간에 존재한다. (전역변수 특성)
Register변수
  • 다음 시간에 수업





register 변수 맛보기~

1
2
3
4
5
6
#include <stdio.h>
int main(void)
{
    register int num = 5;
    ....
}
cs
  • 레지스터는 CPU내부에 존재하는 메모리로 접근이 가장 빠른 메모리 장치다.
  • Resister는 힌트를 제공하는 키워드
  • 컴파일러는 이를 무시하기도 한다.
    (무시하기 때문에 안쓴다고 생각하면 됨!!!)






static 변수의 활용

  • 전역변수가 필요한 이유
    선언된 변수가 함수를 빠져나가도 계속해서 메모리 공간에 존재할 필요가 있다.

  • 전역변수, static변수
    함수를 빠져나가도 계속해서 메모리 공간에 존재해야 하는 변수를 선언하는 방법
    (전역변수는 왠만하면 사용하지 말라고 했었죠
    그래서 조금이나마 안전하게 사용하라고 static변수를 사용하면 됨)

  • static 지역변수를 사용하여 전역변수의 선언을 최소화하자
    static 지역변수는 접근의 범위가 전역변수보다 훨씬 좁기 때문에 훨씬 안정적이다.





메모리 공간

메모리 공간은 4가지로 분류됨

  1. Code : 내가 작성한 모든 코드~가 저장됨 (기계어로 변환되어 저장)
  2. Data : 전역변수가 저장되는 영역 (프로그램 종료되면 소멸)
  3. Heap : 동적할당(가변적 공간 할당), 원하는 시점에 할당-원하는 시점에 소멸
  4. Stack : 지역변수, 매개변수 (함수가 시작될 때 메모리에 할당했다가 종료되면 자동 소멸)







메모리 구조


  • 피라미드 형!
  • 피라미드의 크기는 용량을 의미
  • CPU와의 거리를 의미
    모든 연산은 CPU에서 처리함(CPU가 좋으면 빠르고 좋겠죠?)






















20160126 c언어 14day.txt





반응형

'BOX' 카테고리의 다른 글

C 16Day (20160128)  (0) 2016.01.31
C 15Day (20160127)  (0) 2016.01.31
C 13Day (20160125)  (0) 2016.01.27
C 12Day (20160122)  (0) 2016.01.23
C 11Day (20160121)  (0) 2016.01.22

블로그의 정보

jennysgap

jennysgap

활동하기