일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 28 | 29 | 30 | 31 |
- 배열
- Win32
- 김성엽
- CS
- Javascript
- Tips강좌
- 이지스퍼블리싱
- 지식나눔강좌
- c
- 프로그래밍
- Desktop
- doit코틀린프로그래밍
- 포인터
- 백준
- 함수
- Direct2D
- Tips프로그래밍강좌
- 연산자
- 티스토리
- Windows
- VS ERROR
- Programming
- c#
- 문법
- Kotlin
- tipssoft
- c++
- 알고리즘
- Visual Studio
- 리뷰
- Yesterday
- Today
- Total
F.R.I.D.A.Y.
지식인: static 변수의 초기화와 대입 본문
C언어 중에서도 static 변수의 초기화와 대입에 대한 내용을 질문하셨습니다.
변수
많은 변수들은 각각 생존 주기(Life cycle)를 가집니다. 대부분 자신으로부터 가장 가까운 바깥 블록의 생존 주기를 가집니다.
int main(void){
int a;
{
int b;
{
int c;
} // 3
} // 2
} // 1
이 코드에서 a 변수의 생존 주기는 1번 블럭 안에서, b 변수는 2번 블럭 안에서, c 변수는 3번 블럭 안에서 사용할 수 있습니다.
만일 자신에게 허용된 범위 바깥에서 변수를 사용하려하면 오류가 발생하지요. 각각의 변수는 생존 주기가 끝나면 가진 데이터를 잃습니다. 이 과정에서 static 키워드를 붙여준다면 생존 주기를 늘릴 수 있게 됩니다.
static 키워드
static 키워드는 대상의 생존 주기를 main 함수와 같이 가도록 합니다.[# main 함수와 같이 간다는 말은, 결국 프로그램의 시작과 끝을 함께 한다고 볼 수 있습니다.]
다음 코드를 보겠습니다.
int cPlus(int a, int b){
static int var = 3;
int result = a + b + var;
var = a;
return result;
}
int main(void){
int num1, num2;
printf("첫 번째: %d\n", cPlus(4, 5));
printf("두 번째: %d\n", cPlus(1, 5));
printf("세 번째: %d\n", cPlus(5, 5));
printf("네 번째: %d\n", cPlus(7, 5));
printf("다섯 번째: %d\n", cPlus(1, 5));
}
이 코드를 함수로 실행시켜보면 cPlus로 넘긴 값이 연산되어 돌아올 때, 이전 cPlus 함수를 실행하며 넘긴 첫 번째 수가 더해져 옴을 알 수 있습니다.
이것이 static 키워드의 기능입니다. 함수가 끝날 때, result 변수는 생존 주기를 다해 사라지게 됩니다. 그러나 우리의 var 변수는 static 키워드의 영향으로 자신이 몸담고 있는 cPlus 함수가 연산을 마쳐 끝나더라도 사라지지 않습니다. 그리고 다시 cPlus 함수를 호출할 때는 아래의 코드가 무시된 채 대입, 증감에만 자신의 값을 변경합니다.
static int var = 3; // 두 번째 cPlus 호출부터 무시됨.
초기화와 대입
초기화는 대입의 한 가지 방법이라 볼 수 있습니다. 결국 초기화도 특정 공간에 값을 넣는것, 대입과 별반 차이가 없으니까요. 그러나 초기화는 변수나 요소를 생성하는 그 시점에서만 할 수 있습니다.
int a = 3;
int b;
b = 3;
a와 b 코드 모두 3으로 값을 집어넣고 있습니다. 그러나 a는 "변수의 선언과 동시에 초기화 한다" 라고 하겠지만, b 변수는 "b 변수를 선언하고 3을 대입한다"라고 말할 수 있습니다.[# 나중에 더 많이 배우게 되면 귀찮아서 b의 선언 방법도 "초기화 한다"라고 말할 수도 있겠습니다.] 즉, 선언과 동시에 대입을 한다면 그것은 초기화로 볼 수 있습니다. 한 편으로 선언은 하지만 대입은 선언이 끝난 뒤에 한다면 그것은 초기화보다는 대입에 가깝습니다.
static 변수의 경우 꼭 한 번 초기화를 해주어야 합니다. 그리고 나선 대입이나 증감 연산자를 통해 값을 바꾸더라도 초기화가 아니므로 값을 변경할 수 있습니다. 선언과 초기화, 대입을 명확히 구분해야 이 문제가 해결되겠군요.
# index
'외부활동 > 지식in' 카테고리의 다른 글
지식인: C++의 String.data() (0) | 2020.02.15 |
---|---|
지식인 질문하기 (0) | 2019.04.02 |
지식인 : 리스트 자료구조 포인터 (0) | 2019.03.06 |
지식인 : 성적을 xls(엑셀)로 출력하기 (0) | 2019.01.16 |
지식인 : 시간 문자열을 숫자(초)로 변환하기 (0) | 2018.11.13 |