F.R.I.D.A.Y.

변수 초기화 본문

DEV/C C++

변수 초기화

F.R.I.D.A.Y. 2019. 4. 6. 06:43
반응형

 변수를 사용하는 것만큼, 중요한 것이 변수 초기화 과정입니다. 이 포스트에서는 변수 초기화는 무엇이고 언제 초기화를 해야 하는지 알아봅니다.


초기화란?

 먼저 시작에 앞서 초기화는 무엇인지 알아봅니다. 네이버 지식백과에선 초기화를 다음으로 정의하고 있습니다.

컴퓨터 프로그램의 최초 또는 미리 정해진 계수, 스위치, 주소, 기억 장치의 내용 등을 '0' 또는 기타의 값으로 설정하는 것.

 일반적으로 설명을 할 때는 이렇게 말을 하곤 합니다만, 저는 다른 정의를 말씀드리고 싶습니다.

 변수의 값을 예측 가능한 값으로 만드는 것.

 

 실제로 변수는 메모리에 위치하는데, 메모리는 PC내 모든 프로그램이 공유해 사용합니다. 내 프로그램이 사용하기 전에 다른 프로그램이 사용했을 수 있다는 것입니다. 이러한 특성 때문에 메모리에는 어떠한 값이 들어있는지 알 수 없습니다. 알 수 없는 값으로 인해 발생 가능한 문제를 줄이고자 변수를 사용하기 이전에 초기화라는 과정을 거칩니다. 이 과정을 거쳐 변수 값이 예측 가능한 값으로 수정되는 것입니다.


초기화를 꼭 해야할까요?

 인터넷의 많은 자료에서

변수는 선언과 동시에 초기화해야 합니다.

 라고 말을 합니다. 그러나 이는 사실이 아닙니다. 초기화는 필요할 때만 하면 됩니다. 그런데 왜 꼭 초기화해야 한다고 말을 했을까요? 설명이 쉽기 때문입니다. 초심자에게 선택의 기회를 주면 초심자는 선택이라는 것 때문에 혼란을 가집니다. 무엇을 선택해야 할지 모르니까요. 그래서 초심자도, 설명하는 본인도 편하기 위해 모두 선언과 동시에 초기화를 하라고 말하는 것입니다.


초기화 방법 1: 모두 다 초기화 하기

 가장 간단한 방법입니다. 모든 변수를 선언과 동시에 초기화를 해주는 과정을 거치는 것인데요, 사실 어느 정도 숙련이 되면 상관없지만 그렇지 않은 경우에는 모두 다 초기화해주는 게 오히려 편할 수 있습니다.

 

 이런 식으로 변수 선언과 동시 초기화를 할 수도 있구요,

int a = 0, b = 0, c = 0;
// , 를 기준으로 같은 자료형 변수를 선언할 수 있어요.

 선언을 하고 난 뒤 초기화를 하는, 즉 선언과 초기화를 분리해 할 수도 있습니다.

int a;
a = 0;

 

 이 방식의 장점은, 어떤 변수던 사용 전에 초기화가 이미 되어있기 때문에 C6001 문제를 생각하지 않아도 됩니다.

 다만, 초기화가 불필요한 변수에 대해서도 초기화를 진행하기 때문에 미세하지만 속도가 느려지는 단점이 있습니다. 크게 걱정할 수준은 아니기 때문에 공부할 때 고민하지 않아도 됩니다.


초기화 방법 2: 선택적 초기화 하기

 초기화가 필요한 변수만 선택적으로 초기화하는 방법입니다. 이 방식은 소스코드마다 무엇을 초기화해야하는지 직접 찾아보아야 하는 단점이 있지만 쓸 데 없는 코드가 추가되지는 않습니다.

#include <stdio.h>

int main(void) {
	int var1 = 0,var2;

	scanf("%d", var2);

	printf("%d %d\n", var1, var2);
	
	return 0;
}

 이 코드의 경우 scanf로 var2에 값을 대입하는 작업을 하기 때문에 var2는 초기화를 할 필요가 없습니다. 그러나 var1은 아무 작업 없이 바로 사용하기 때문에 var1 = 0;으로 초기화를 해주었습니다. 즉, 선택적 초기화는 대입 작업을 거치는 변수에 대해서는 초기화하지 않는 것입니다.

 그러나 여기에서도 예외가 있습니다. 다음 코드를 볼까요?

#include <stdio.h>

int main(void) {
	int var1;

	var1 += 5 + 2;

	printf("%d\n", var1);

	return 0;
}

 이 경우에는 어떨까요? 복합 대입 연산자를 사용했으니 정상적으로 동작할까요? 아닙니다. 복합 대입 연산자는 결국 더하고 대입하는 과정이 함축된 과정입니다. 풀어 써보죠.

#include <stdio.h>

int main(void) {
	int var1;

	var1 = var1 + (5 + 2);

	printf("%d\n", var1);

	return 0;
}

 var1 변수에 대입하기 전에 var1 변수를 사용합니다. 따라서 이 코드는 정상적으로 동작하지 않습니다.

 

 선택적 초기화는 불필요한 코드가 없다는 장점이 있지만, 비교적 생각해야하는 문제가 있기 때문에 초심자가 다루기에는 살짝 까다로울 수 있습니다. 따라서 초심자의 경우에는 모두 다 초기화 하는 것을 권장하고, 어느정도 숙련도가 오른 사람에게는 선택적 초기화를 권장하고 있습니다.

# index

728x90
반응형

'DEV > C C++' 카테고리의 다른 글

예외처리 - assert 사용해보기  (0) 2019.04.12
숫자의 형변환  (2) 2019.04.11
부동소수점은 ==으로 비교하지 마세요  (6) 2019.04.05
C/C++ 표준 코드(main 함수 표준)  (0) 2019.03.25
C언어 프로젝트 생성하기  (0) 2019.03.12
Comments