본문 바로가기
기계공학부 시절의 기록/C++일기

1.3 int x = 123; 의 작동원리 : 변수, 초기화, 할당

by juhyeonglee 2021. 5. 1.
728x90
반응형

#객체 objects

컴퓨터는 메모리와 CPU로 일을 한다.

물체가 실재함은 어떤 공간을 차지함을 보고 인식할 수 있다면

컴퓨터상에서 무언가 실재함은 메모리상에 존재하느냐로 인식할 수 있다.

메모리상에 존재하는 것이 객체이다.

객체는 메모리에 담겨있다.

 

#변수 variables

메모리상에 존재하는 객체에 이름을 붙인 것.

예를 들어 메모리를 아파트, 객체를 그 안에 사는 가구라고 하면

특정 가구의 위치는 ***동***호이다. 

이렇게 숫자로 이루어진 ***동***호는 컴퓨터에게는 익숙하지만 사람에게는 '누구누구네집'이 더 와닿는다.

그래서 객체에 이름을 짓고 이름을 가져와 코드 작성을 하는 것이다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
 
int main()
{
    // x라는 변수이름이 가리키고 있는 메모리공간에
    // 정수 123을 저장
    int x;
    x = 123//assignment
 
    std::cout << x << std::endl//123
    std::cout << &<< std::endl//00EFF9D4
 
    return 0;
}
cs

 

#Left-values, Right-values

x = 123; 처럼 123이라는 값을 x가 가리키고 있는 메모리공간에 할당했을 때

왼쪽이 Left-values, 오른쪽이 Right-values가 된다.

 

#Left-values는 메모리 주소를 갖고 있지만 Right-values는 그냥 값이라고 생각하자.

 

#초기화(initialization), 대입(assignment), 초기화를 안했을 때의 문제점

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
 
int main()
{
    // x라는 변수이름이 가리키고 있는 메모리공간에
    // 정수 123을 저장
    int x =123//initialization(초기화)
    x = 5//assignment
 
    std::cout << x << std::endl//123
    std::cout << &<< std::endl//00EFF9D4
 
    return 0;
}
cs

int x =123;은 초기화 과정이고

x=5;는 대입과정이다.

초기화 과정은 x객체가 차지할 메모리를 부여함과 동시에 123을 대입하는 것이고

대입과정은 x가 차지한 메모리에 값을 대입하는 것이다.

비슷하지만 엄연히 다르다.

 

초기화를 하는 이유를 살펴보려면 컴퓨터동작원리를 이해해야 한다.

우리는 데이터를 메모리에 기록하고 CPU를 이용해 처리한다. 한정된 메모리공간은 OS가 관리한다.

즉, 그 메모리 공간은 Sharehouse이다. 즉, 게임을 할 때는 게임에게 메모리공간을 주고, 코드를 돌릴 때는 이에 필요한 공간을 준다. 

Sharehouse에서 먼저 사용했던 사람들이 쓰레기를 치우고 갔을 수도, 아닐 수도 있다. 불확실함을 제거하고자 초기화를 수행하는 것이다.

 

# 예제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
 
int main()
{
    int x = 1;
    x = x + 2;
    std::cout << x << std::endl//3
 
    int y = x;
    std::cout << y << std::endl;//3
 
    std::cout << x + y << std::endl//R-value  6
 
    std::cout << x << std::endl//3
 
    // 초기화를 안해주면?
    int z;
    std::cout << z << std::endl;
 
    //return 0;
}
cs

포인트1) int z;는 에러가 뜬다.

위처럼 int z=(정수);로 초기화를 하지 않고 int z;로만 한다면 빌드과정에서 에러가 뜨며 에러 메시지는 아래와 같다.

하지만 debug모드(개발용)가 아닌 release모드(배포용)로 빌드를 한다면 에러없이 실행을 진행한다. release모드는 우선 실행되는 것이 중요하기 때문이다.

 

포인트2) return 0; 꼭 필요한가

마지막에 return 0;를 주석처리하고 실행해보았는데 문제없이 실행이 되었다.

return 0;의 의미 : 함수에는 입력과 출력이 필요한데 정수형 함수에서 0을 출력값으로 반환하며 함수의 종료를 컴퓨터에게 알리는 의미를 갖는다. C에서는 필수적이었는데 C++로 넘어오면서 main함수에 있어서는 없어도 있다고 자동으로 인식하게끔 되었다고 한다.

출처:edu.goorm.io/qna/2523

 

 

출처)

홍정모의 따배씨++

www.youtube.com/playlist?list=PLNfg4W25Tapw5Yx4yuExHNybBIUk68aNz

 

 

좋은 강의에 너무나 감사하다.

이전에는 그냥 무작정 따라썼던 코드들을 한줄한줄 이해하며 공부할 수 있다.

언젠가 어느 언어든 자신감이 있는 코드마스터가 될 것이다.

 

데이터가 인간을 대신해 일을 하게하고

데이터를 제어해 로봇을 제어하고 싶다.

 

'아앙의 전설'에서 주인공은 물/불/흙/공기 원소를 자유자재로 다룬다.

수많은 데이터가 넘실대는 현대에서는 데이터를 자유자재로 다루는 프로그래머.

실력있는 프로그래머가 되기 위해서는 코드 한줄이 내부적으로 어떻게 작동되는지를 이해해야한다.

 

 

728x90
반응형

댓글0