TIL 2024/07/22

Sung Joo Lee·2024년 7월 22일
0

변수와 메모리(중요)

  • 0.5 byte = 4 bit = 2^4 = 16개의 숫자 표현 가능 (0~15)

  • 1 byte = 8 bit = 2^8 = 256개의 숫자 표현 가능 (0~ 255)

  • Hexadecimal ( Hex , 16진수)

    • 16진수 2개로 1 byte를 보기 쉽게 표현 ← Hex의 사용 이유
    • 16 ^ 2 = 256 (0 ~ 255 까지 표현 가능)
    • 쉽게 말 하면 255를 표현 하기 위해서는 2진수는 8개의 자릿수가 필요하지만
      16진수는 2자리면 표현 가능하다.
    • Hex 표현임을 알리기 위해 0x를 앞에 붙여줌
    • 0부터 F까지 사용하여 표현한다.
    • EX)
      • 10 진수 255를 16진수로 표현
        • 255 / 16 = 15 , 255 % 16 = 15
        • 15 는 16진수로 F
        • 즉, 0x FF로 나타낼 수 있다.
      • 반대로 FF를 10 진수로 바꾸어 보자
        • F 16^1 + F 16^0 = 15 * 16 + 16 =255

메모리

메모리는 읽고 쓸 수 있는 바이트의 집합

  • 보통 우리가 메모리라 함은 RAM을 지칭

(보통 위와 같은 모양을 생각하면 된다.)

  • 각 칸은 1바이트 ( 8 bit)의 데이터를 저장 할 수 있음. 0 ,1 의 bianry로 저장된다.
  • 각 바이트에는 번호가 붙어있고 , 이를 ‘주소’라고 부른다.
    • 주소 또한 컴퓨터이기 때문에 Hex로 표현되어 있음

Memory and Variables

  • 정수를 저장할 때 타입에 따라 아래와 같은 용량의 바이트를 사용하도록 되어있다.
    • Char : 1 바이트
    • Short : 2 바이트
    • Int : 4 바이트
    • ex ) 10이라는 값을 저장 하는 경우
      • Char : 0A

      • Short : 00 0A

      • Int : 00 00 00 0A

        참고) 1바이트를 16진수로 표현 할 때 왜 4 비트씩 나누어서 표현하나? 라는 생각을 가져 찾아 보았다.

      • 답은 간단하다 16진수는 한 자릿수 마다 0~15까지 표현이 가능하다. 즉 2진수로 표현 하면 2^4 = 16, 4 자리가 필요하다. 컴퓨터는 항상 2진수로 표현하기 때문에 우리가 16진수로 써도 2진수로 저장 및 변환이 된다.

변수

메모리 주소에 붙이는 이름

  • 변수를 만들면, 메모리에 변수를 위한 공간(바이트) 확보
    • 공간의 크기는 변수의 타입에 따라 결정
      • char = 1 칸, int = 4 칸
    • 변수에 값을 대입하면, 해당 공간에 값이 기록됨
    • 변수를 만든다 → 변수를 정의한다와 동일한 표현

(위와 같은 그림을 머리에 넣어 놓자!)

변수의 사용

  • 변수가 정의된 이후에는 해당 메모리에 접근하기 위해 사용됨
  • 메모리에 값을 ‘읽고 쓰게 하는 것’이 변수의 사용

정수

사실 CPP로 코딩 테스트 문제를 풀다 보면 값의 범위를 고려해서 풀어야 하는 문제가 있다. 다 외우지는 못 하더라도 눈에 익혀두어서 필요할 때 사용하자.

상수

  • 변수와 유사하지만, 초기화 이후에 값을 변경 하지 못하게 하는 값
  • 실수를 방지하는 것이 가장 큰 목적
const int num = 4;
//위의 num은 4로 선언 및 초기화가 진행되었고 이후 변경이 불가능 하다c 

const

바로 뒤의 , 단독으로 쓰일 수 있는 의미 있는 ‘최소 단위’랑 묶인다.

예전에 공부 했을 때 이 const의 위치에 따른 의미가 달라져서 많이 헷갈렸던 기억이 존재한다.

이번 기회에 한번 제대로 정리하고 넘어가 보자.

출처

https://m.blog.naver.com/oh-mms/222044543049

https://gps-homepage.tistory.com/11


int val = 10;

const int* a = &val;
int const* b = &val;
int* const c = &val;
  1. const int* a 의 const는 최소 단위인 int와 묶인다.
  • ‘a라는 포인터 변수가 상수 정수 변수를 가리킨다’ 라고 이해하면 된다.
  • 정수가 상수라는 의미는 값을 변경 할 수 없다는 의미이다
const int* a= &val; //일 때

*a = 4;// 오류
a = &other; // 오류 발생하지 않음.

즉, 우리는 a를 통해서 값을 변경 할 수 없는 것이지 a가 가리키는 것을 변경하지 못 하는 것이 아니다.

  1. int const b 의 const는 b와 묶이게 된다
  • b라는 놈이 *b형태로 있는 값을 변경 불가
int val = 10;

int other = 15;

int const* b = &val;

*b = other; // b가 *b 형태일 때의 값을 변경 불가능
b = &other; // 사용가능
  • 놀랍게도 1번과 정확히 똑같은 의미를 가진다
  • b를 통한 값의 변경은 불가능 하지만 가리키는 대상은 변경이 가능하다.
  1. int* const c의 const는 c와 묶여있다.
  • c가 c 자체 형태일 때 값의 변경이 불가능 하다.
int* const c = &val;

int other = 15;

*c = other ; //사용가능
c = &other;  //c 자체 형태일 때 값의 변경이 불가능

추후에 조금 더 이해하기 쉬운 방법이 있으면 수정해 보도록 하겠다.

profile
개발로그

0개의 댓글