프로그래밍 지식/C++

Variable, 변수란, C/C++

게임이 더 좋아 2022. 1. 25. 22:50
반응형
728x170

기초부터 탄탄히 하기 위해서 다시 복습하도록 한다.

한 마디로 말할 수 없으면 공부한 것이 아니라는 말을 듣고 다시 한 마디로 정의해보자

 

변수란?

 

데이터를 저장할 수 있는 메모리의 공간

이라고 생각한다.

해당 변수는 주소 값을 가지고 있고 주소 값으로 접근이 가능하다.

정의했으니 이제 더 자세히 알아보자.

 


 

메모리는 접근 시에 주소로 접근이 가능한데

컴퓨터의 운영체제나 구조에 따라 달라지지만 우리는 32bit의 주소 또는 64bit의 주소를 가지고 있다.

(32 bit라고 하자.)

 

우리는 이 주소에 접근하여 데이터를 메모리에 저장한다.

하지만 우리가 주소를 직접 써서 데이터를 관리했다면 정말 비효율의 끝판왕이었을 것이다.

우리는 조금 더 효율적인 방법인 변수를 써서 데이터를 관리하기로 했다.

(물론 내부적으로는 주소로 접근한다)

 

변수는 다양한 값을 가리킬 수 있는만큼 변수에 대한 크기를 정하는 것도 문제가 되었다.

변수에 무엇을 담느냐에 따라 메모리를 얼마나 쓰는지가 결정된다.

만약 int 타입을 담는다면 int는 4byte의 메모리를 차지한다.

32bit는 약 42억가지의 값이 표현가능하다.

하지만 만약에 더 큰 값을 해당 변수에 넣는다면 어떻게 될까?

 

예를 들어 100억에 대한 값을 int에 넣으면 어떻게 될까? 

오류가 생긴다기보다 우리가 의도한 값과 다른 값이 변수에 저장된다.

그렇다면 1을 넣으면 어떻게 될까??

그대로 1이 들어간다.

그렇다면 32bit중에 31bit를 안써도 되는것 아니냐?

맞다.

1bit만으로도 1을 표현할 수 있다.

 

하지만 변수는 언제나 변할 수 있는 데이터를 가지고 있기 때문에

(안바뀐다면 상수로 선언한다.)

굳이 1bit를 따로 저장하지는 않는다.(할 수는 있다.)

 

그래서 C++에서는 미리 내장된 타입이 여러가지가 있다.

몇 가지만 알아보면

1. bool : 1byte

2. short : 2byte

3. int : 보통 4byte

4. float : 4byte

5. long : 4~8 byte (운영체제 지원에 따라다름)

6. long long : 8byte

7. (long) double : 8byte

8. char : 일반적으로 1byte

** 아스키코드가 아닌 유니코드를 위한 char는 4byte이다.

정도가 있다.

 

 


변수에는 정의, 선언이 있는데

변수란 것은 선언과 정의가 분리되어 있다.


일반적으로 우리는 같이 생각하지만 분리되어있다.

Declaration은 프로그램에 이름을 알리는 것으로 

어딘가에서 해당 이름을 사용하려면 그 이름에 대한 선언이 필요하다.

Definition은 연관된 개체,entity를 만드는 것이다.

extern 키워드를 써서 선언을 할 수 있다.

extern int i; //i를 선언을 하지만 정의는 하지 않음
int j //j를 선언하면서 정의



그리고 명시적으로 값을 초기화한다면 그 선언은 정의가 된다.

extern double pi = 3.14159; //이 문장은 정의다.

 

extern을 쓴 문장에서도 값을 초기화할 수 있지만 이렇게 될 때는 extern이 무시된다.
extern과 초기 값을 같이 쓴다면 해당 문장은 정의가 된다.

 

아니.. 나는 정의랑 선언을 따로해야하는 이유를 모르겠는데..?

아하 !! 선언과 정의를 나누는 것이 왜 중요하냐?
변수를 여러 파일에서 쓸 때 중요하다.

 


즉, 같은 변수를 여러 파일에서 쓰려면 그 변수는 오직 한 파일에서만 정의되어야 하고
다른 파일에서는 해당 변수를 쓰기 위해서 선언만 하면 되는 것이다.

 



미초기화 변수


초기 값을 지정하지 않은 변수를 말한다.


예를 들어 초기 값을 지정하지 않은 클래스 타입 변수는 클래스 정의에서 지정한대로 초기화 한다.


다만 함수 안에서 정의한 내장 타입 변수는 명시적으로 초기화하지 않으면 junk값이 들어있다.

 


c++에서 초기화와 대입은 다른 것이다.
=으로 초기화한다고 생각하지만 다르다. (물론 가능하다)

초기화는 변수를 만들 때 값을 지정하는 것이고


대입은 객체의 현재 값을 지우고 새로운 값으로 바꾸는 것이다.


특히 C++에서는 초기화 방식이 여러가지가 있다.
예를 들어 int라면

int unit = 0;
int unit = {0};
int unit{0};
int unit(0);


int를 초기화하는 방법이다.

중괄호를 사용하는 초기화방식은 list initilization, 목록 초기화라고 한다.

이런 형식은 객체를 초기화할 때면 언제나 사용가능하고 일부는 객체에 새 값을 대입할 때도 허용하기도 한다.

하지만 이러한 방식은 데이터 손실이 발생할 경우 허용하지 않는다 

단적으로 double 타입을 int로 바꿀 때

double pi = 3.14159
int a{pi}; //오류가 생긴다.




만약 초기화 하지 않으면 해당 변수는 기본 초기화(default initialize)가 된다.
'기본' 값이 들어간다.


** 기본 값은 변수 타입과 변수를 정의한 위치에 따라 달라진다.

-> 때문에 컴파일러에서 디버깅할 때 항상 같은 값이 들어간다면.. 우리가 해당 변수를 의심할 필요가 있다.

이 default 초기화도 예외가 있는데
만약 함수 안에서 정의한 내장 타입 변수(int,dobule..등) 은 초기화 되지 않는다.
이런 변수는 사용 시 오류를 불러온다.

반응형
그리드형