독개

#따배씨 1.3 변수와의 첫만남 (Initialization 초기화 ,메모리공간)

by #독개#

 

객체 objects

메모리에 담겨있다

의미있는 값들이 메모리에 저장되어있는 정보

 

변수 variables

메모리에 담겨있는 객체를 사용하기 위해서는 주소가 있어야지

숫자로된 주소 대신에 다루는 이름

 

Left-values

Right-values

 

 

Initialization 초기화

 

초기화X = 컴파일❌

 

#include <iostream>

int main()
{
    int x;
    std::cout << x << std::endl;
    int y;
    std::cout << y << std::endl;
    int a;
    std::cout << a << std::endl;
    return 0;

}

/* 빌드시 error
    warning: 'x' is used uninitialized in this function [-Wuninitialized]
    std::cout << x << std::endl;
    
    
    ★ 초기화 안할시 빌드자체가 안됨 (C++,C#)
    
    initialized 되지 않은 변수가 있으면 빌드자체가 되지 않았다.
    
    debug든 release든 무조건 초기화 시키라는것 같다. C#도 마찬가지 였다.

    옛날에는 초기화 하지 않은 값에는 컴파일러가 자동으로 0을 넣어줬다는데

    이는 컴파일러를 바꾸거나 대형 프로젝트에서 큰문제가 될수 있다

    그래서 최신 컴파일러에서는 아예 빌드자체를 해주지 않나보다

    Visual studio의 최신 Msbuild는 컴파일을 해주지 않았다
    
    그런데 Vscode에서 사용하는 Gcc에서는 컴파일을 해주었다
    
    gcc로 빌드후 출력값
    4201099
    6422352
    4201008
*/

 

근데 gcc로 컴파일한 출력값은 도대체 뭘까?

int x = 0; // copy initialization
int x(0); // direct initialization
int x{0}; // uniform initialization

이세개 가 모두같게 작동한다
c++ 에는 초기화 방법이 3개다

int k = 1 , l = 2, m=123; // 이방식은 괜찮다
이렇게 같은 자료형에 대하여 동시에 초기화도 가능하다

하지만 int k, l, m=123; //이방식은 쓰지말자

이렇게 쓸경우 사람이 보기에 아~ k,l,m모두다 123으로 초기화했구나 라는 오해를 할 수 있으므로

그래도 알아두는 이유는 다른사람의 코드를 볼때 이해할수 있어야하니까

 

초기화 위치

 

예전에는 상단에 모두다 초기화해두고 시작하는게 약간 원칙 같았지만

 

요즘에는 사용하기 직전에 초기화 하는 방식으로 변하고 있다

 

그래야 디버깅시 유리하다

 

 

 

메모리 공간에 대한 이해

 

메모리에 대한 이해를 하니 모든게 풀렸다

메모리 공간을 할당해주는 것은 운영체제이다
 
우선 우리가 int a;
 
이렇게 프로그램에 코딩을하면 운영체제에서 프로그램 실행시 이를 읽고
 
int를 담을 수 있는 공간을 할당한다
 
예를들어서 할당한 실제 메모리 공간 주소가 0x38920 라고하자
 
이걸 요청한대로 이 프로그램이 실행되어 있는동안 프로그램에선 a로 이주소에 접근할수 있게 약칭을 a라 해준다

그런데 컴퓨터의 메모리공간은 한정적이지
 
메모리 공간은 내가 할당받기전에 다른 프로그램(지금은 종료된)에서 할당 받았을 것이다
 
즉 내가 내 프로그램에서 a라는 공간을 할당 받았는데,
 
이 메모리값에 이전에 다른 프로그램에서 쓰던 값이 남아있다는 말이다
 
그래서 내가 초기화(시작시 값을 넣어줌)를 해주지 않고 이공간을 빌리고
 
a라는 변수로 불러오면 메모리공간엔 이전에 쓰던 값이 나오게 된다

그래서 무조건 메모리를 할당받을때 초기화를 해주어야 한다!

운영체제는 친절하게 메모리를 정리해주지 않는다

아파트 전세 들어오는데 세입자가 입주청소 하지 않으면 더러운 쓰레기들을 사용해야 하는 것이다.

초기화는 입주청소다! 입주청소 하고 들어가자

 
 

 

LeftValue , RightValue

 

#include <iostream>

int main()
{
    // int정수가 들어갈 수 있는 메모리에 저장해서 공간을 만들고
    // 그 이름을 주소의 이름을 x라고 지정해둔다 (원래는 숫자로된주소)
    int x; 
    // = assignment(대입연산자) 이등호는 같다는 의미가 절대아니다!
    // 위에서 만든 이름이 x인 저장공간에 123이란 값을 넣는다

    //Lvalues(left value)는 좌측값 변수명을 의미한다
    //Rvalues(right value) 값을 의미한다
    x = 123; 

    //그러면 여기선 왼쪽의 x는 Lvalues를 의미(즉 주소이다)
    //오른쪽의 x는 x가 가지고 있는 값을 Rvalues로 가져온다
    x = x + 2;

    int y;
    y = 5; //이건 assignment(대입)
    int z = 10; //이건 initialization(초기화) int z(10); 이거랑 같다

    
    std::cout << x << std::endl;

    std::cout << &x << std::endl; // 변수x가 실제로 메모리에서의 숫자주소를 알려준다

    return 0;
}

/* 
출력값
125
0x61ff04 //메모리 주소값
 */

 

 

 

 

 

 


🐱‍👓독하게 개발

블로그의 정보

독한 개발자

#독개#

활동하기