' [C/C++] 2강 - 프로그램의 필수 요소, 변수

Programming/C & C++

[C/C++] 2강 - 프로그램의 필수 요소, 변수

mdisprgm 2021. 6. 5. 21:23
728x90

Welcome^^

 

우리가 사용하는 모-든 프로그램은 사용자가 제공하는 정보, 또는 프로그램이 사용자에게 제공하는 내용이 있음.

 

이 정보를 다른 말로 '변수'라고 하는데

 

이번 강좌에서는 이 변수에 대해 알아본다.

 

 

시작하기 전에, 

주석에 대한 내용이니 읽어보도록 하자.

프로그래밍에 없어서는 안 될 중요한 요소.

#include <stdio.h>

int main() {
    //이렇게 역슬래시 두 개를 붙이면 주석을 넣을 수 있다
    printf("HelloWorld");//어느 위치에 와도 그 위치부터는 그 줄이 몽땅 주석처리 된다.
    //주석은 코드 중간중간에 삽입할 수 있는 설명문으로
    /* 코드를 짜면서 아주 중요하다.
    주석 쓰는 걸 습관들여야 나중에 편하다.. (본인 코드도 못알아볼 수 있음 주의)
    눈치챘겠지만 쓰면 /*와 * /를 쓰면 여러 줄 주석도 가능하다 */
    return /*여러 줄뿐만 아니라 한 줄 사이에 넣을 수도 있음*/0;
}

 

 

 

(1) 변수와 자료형

프로그램이 구동하는데 필요한 정보를 컴퓨터는 '변수'라는 곳에 기억하게 되는데

 

변수는 값을 저장하기 위한 메모리 공간으로, 변수는 변수의 주기, 변수가 저장하는 값의 종류, 변수의 성격에 따라 종류가 여러 가지로 나뉘게 된다.

 

메모리 공간에 기억된 값 자체를 변수라고 부르기도 한다.

 

 

C언어에서 변수를 사용하는 방법은 아래와 같다.

#include <stdio.h>

int main() {
    int a; //변수 선언
    a = 10;//변수 초기화

    float b = 3.7;//변수를 선언과 동시에 초기화

    return 0;
}

 

(자료형) (변수 이름) = (대입할 값)

 

위 코드는 두 가지 방식을 사용함.


변수와 자료형을 보통 '그릇'에 비유하곤 하는데,

변수는 하나의 그릇이고 변수의 값은 그 그릇에 들어있는 내용물이라고 이해하면 된다.

변수는 내용물이 변할 수 있는 그릇이라 언제든 값을 변경할 수 있다.

int a = 10;을 실행한 후 메모리 상태를 그린 그림. 메모리의 Stack이라는 영역에 4Bytes만큼 할당하고 그곳에 10을 저장.


int a = 10
int b;
b = a;

물론 이렇게 숫자 대신 변수를 넣어줄 수도 있는데, 이건 b에 a의 값을 '복사'한 것이다.

 

참고로 10, 0x2000 이런 형태의 숫자 자체의 값을 리터럴 상수라고 한다.

 

기호 상수, const 상수 등 여러 상수가 있는데 이것은 다른 포스팅에서 자세히 얘기할 거다.


 

첫 번째는 변수를 선언한 뒤, 다음 줄에서 변수에 값을 저장하는 것이고

 

두 번째는 변수를 선언하고 바로 값을 저장하는 것인데

 

둘 중 어느 방법을 사용해도 상관은 없으니

 

상황에 따라 잘 선택하면 된다.


변수를 초기화 하는 것은 리소스 비용이 비교적 크기 때문에 꼭 필요한 경우만 초기화를 해주는 것이 좋다. (ex. 선언 후 바로 입력을 받는다면 초기화할 필요 없음)


다만 주의할 점은 무조건 값을 대입해주어야 한다는 것이다.

 

아무것도 저장되지 않은 변수에 값을 처음 넣는 것을 '초기화'라고 하는데

 

초기화 되지 않은 변수에 어떠한 연산을 수행할 경우 프로그램에 오류가 발생하게 된다.

 

여느 언어들과 다르게 C/C++은 지역 변수를 자동으로 초기화해주지 않는다.

 

여기서 int 는 정수를 표현하는 변수의 자료형이다. 변수에 저장되는 값은 여러 종류가 있는데

 

정수, 실수, 문자 등이 있다.

(정수가 아닌 decimal, 프로그래밍에선 보통 실수라고 한다. 일반적으로 수학적인 의미로 쓰이는 실수(Real)와는 조금 다름..)

(물론 float a = 3.0;이런 식으로 정수를 저장해도 되지만 a의 소수점이 항상 0인 것이 아닌 한 정수는 int, long 등을 쓰는 게 훨씬 효율적)

 

각 자료형에 대한 설명은 다음과 같다.

자료형(type) 용도 크기(Byte) 범위(signed)
char 단일 문자 1U -128 ~ 127
short 정수 2U -32,768 ~ 32,767
int 정수 4U -2,147,483,648 ~ 2,147,483,647
long 정수 4U -2,147,483,648 ~ 2,147,483,647
long long 정수 8U -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807
float 실수 4U 3.4e-38 ~ 3.4e+38
double 실수 8U 1.79e-308 ~ 1.79e+308

 


변수나 자료형의 크기는 sizeof() 연산자를 이용해 Byte 단위로 구할 수 있다.

sizeof(int)는 4,

sizeof(double)은 8이 된다.


정수 타입의 범위를 구하는 방법은 간단하다.

 

-2^(sizeof(Type) * 8) ~ 2^(sizeof(Type) * 8) - 1

 

.. 이렇게 보니 조금 복잡한가..

 

다시 쓰자면

 

-2^(비트 수) ~ 2^(비트 수) - 1

 

가 된다.

 

 

여기서 다시 표를 보면 int의 범위의 최대값은 2,147,483,647 이죠?

 

2^32는 2,147,483,648인데 그 이유는

 

정수 범위에 0을 포함해야 하기 때문이다.

 

음수는 절대값 1부터 절대값 2,147,483,648까지 꽉 채울 수 있지만 (-2,147,483,648 ~ -1)

 

양수쪽에서는 0도 포함해야 하기 때문에 2,147,483,647 까지여야 총 2,147,483,648개의 경우를 표현할 수 있다. (0 ~ 2,147,483,647)

 

int외의 다른 자료형도 마찬가지인데, char의 최대값은 2^8 - 1, short는 2^16 - 1 이 된다.

 

그런데 뭔가 이상하지 않은가? char는 분명 문자를 저장하는 용도라고 했는데 범위가 숫자..?

 

그 이유는 ASCII라는 것과 관련이 있는데 자세한 내용은 곧 올라갈 자료형 심화 포스팅에서 다루겠다.

 

 

다시 범위를 자세히 보면 괄호에 signed 라고 적혀있는 걸 볼 수 있다.

 

이건 숫자에 부호가 존재하다는 의미다.

 

+ / -, 그 부호가 맞다.

 

반대로 부호가 없는 건 unsigned인데.

 

이들을 왜 구분하냐?

 

가만 생각해보면 굳이 음수는 저장할 일이 절대 없을 때가 있는데

 

사람의 나이, 키, 몸무게, 아니면 게임에서 캐릭터의 레벨 등 같은 거 말이다.

 

이런 건 음수일 경우가 없는데 굳이 음수를 표현하자고 비트를 낭비하는 게 싫다면

 

변수 타입 unsigned를 붙이면 된다.

unsigned int a = 10;

이렇게 하면 a의 범위는 0~4,294,967,295가 된다.

 

그런데 웃기게도 unisigned를 붙여도 -10 같은 음수를 저장할 수 있다.

 

이 역시 곧 자료형 심화 포스팅에서 자세히 얘기하겠다.

 

 

오늘 배운 예제는 단순히 변수를 메모리에 할당하기만 한 거라

 

아무리 실행해도 눈에 보이는 결과는 없을 것이다.

 

 

끝.

728x90

'