티스토리 뷰

Table of Contents


개요

정수형 변수의 선언

정수형 변수의 출럭

정수형 변수에 값 입력 및 갱신

정수형 변수에 값 표준 입력 받기

int 범위

문제




1. 개요


 C언어에서 변수란, 저장된 데이터가 변경될 수 있는 저장 공간을 의미합니다. 저장 공간이라는 점에서 흔히 사용하는 '파일'과 개념이 비슷하다고도 볼 수 있습니다. 그리고 파일이 여러가지 유형의 확장자(.txt, .avi, ...)를 가지는 것처럼, C의 각 변수에도 변수의 저장 공간 크기와 레이아웃을 결정하는 특정 유형이 있다는 공통점이 있습니다. 


 하지만 파일과 변수는 그 규모와 용도에 차이가 존재합니다. 보통 파일은 용량이 킬로바이트(KB) 단위 이상인 많은 정보를 저장하지만, C언어의 변수는 123, 23 같은 정수, 'a', 'b' 같은 문자 등을 저장하는데 사용하는 조그마한 저장 공간으로 사용됩니다. 저장 용량은 1 킬로바이트는 커녕 10바이트에도 미치지 못하는 경우가 대부분입니다. 또한 파일을 쓰는 용도의 예시로 '동영상의 저장', '사진의 저장'등이 있다면, 변수의 용도 예시로는 '숫자의 저장', '문자의 저장' 정도가 있습니다.


 예를 들어, 컴퓨터에 '점수'라는 이름의 8 bit 크기의 변수를 만들고 12 를 저장했다고 해보면, 아래와 같이 메모리에 새겨집니다. (컴퓨터는 이진수를 사용하기 때문에 12를 이진수로 변환한 1100이 저장됩니다. 물론 c언어에서 12를 저장하고 싶을 때 1100을 입력할 필요는 없습니다. 십진수로 12라고 쓰면 컴파일러가 알아서 변환해주기 때문입니다.)



 이 글에서는 이러한 C언어의 조그마한 저장 공간, '변수' 중 '정수형 변수'에 대해 다룹니다.


 변수의 유형 중 하나인 정수형 변수 int의 경우엔 4 byte 의 저장 공간을 가지며, 사칙 연산 등 정수에 적용할 수 있는 여러 연산 적용이 가능합니다.




2. 정수형 변수의 선언


 변수의 선언이란, 새로운 변수를 생성함과 동시에 '이름' 을 붙이는 작업입니다. 
위에서 언급했듯이, 변수는 저장 공간입니다. 따라서 변수를 선언하면, 방대한 컴퓨터 저장 공간 중 비어있는 곳의 일부가 그 변수의 이름으로 할당됩니다. 정수형 변수 선언의 예시는 아래와 같습니다.


1
2
3
4
5
6
#include <stdio.h>
 
int main(void) {
    int a;
    return 0;
}
cs


변수유형 변수이름;


 int 는 integer의 약자로, '정수' 라는 의미이며 int a; 를 입력해 주면 a 라는 이름을 가진 하나의 정수형 변수가 선언됩니다.


 이 int a;를 확인한 컴파일러는 비어있는 컴퓨터 저장 공간 중 4 byte (32 bit) 를 이 변수에게 할당하고 a 라는 이름을 붙이는 것입니다.


1
2
3
4
5
6
#include <stdio.h>
 
int main(void) {
    int a, b, c;
    return 0;
}
cs


 이와 같이 ','를 이용하면 한 줄에 여러 개의 변수를 선언할 수도 있습니다. 단, 모두 같은 int 유형으로 선언된다는 점은 기억해야 합니다.




3. 정수형 변수의 출력


 정수형 변수는 printf 함수를 통해 출력할 수 있습니다. 하지만 a 변수를 출력하고 싶다고 해서 printf("a"); 이런 식으로 한다면 a에 저장된 숫자가 아니라 그냥 문자 a 가 출력됩니다. 따라서 C언어는 변수를 출력하기 위한 다른 방식을 제공하고 있습니다.


 정수형 변수를 출력하기 위한 형식은 printf("%d", 변수이름); 입니다.


 '%d' 는 변수의 값을 받기 위한 '서식문자' 중 하나로서 정수형 변수의 값을 받아 십진수로 표현해주는 기호입니다.


1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
 
int main(void) {
    int a;
    a=15;
    printf("a = %d\n",a);
    int b;
    b=12;
    printf("a = %d, b = %d\n",a,b);
}
cs


 따라서 위 프로그램을 실행시켜 보면 변수에 저장된 값이 십진수로 출력되는 걸 확인할 수 있습니다.


printf("%d  %d", 변수이름1, 변수이름2);


 이런 식으로 먼저 출력하고 싶은 변수부터 순서대로 써주면 첫 번째 %d 는 변수이름1에 저장된 값을 나타내고 두 번째 %d는 변수이름2에 저장된 값을 나타내게 됩니다.




4. 정수형 변수에 값 입력 및 갱신


 선언한 a 라는 변수에는 정수를 넣어서 저장하고, 불러내서 사용할 수 있습니다.


1
2
3
4
5
6
7
#include <stdio.h>
 
int main(void) {
    int a;
    a=4;
    return 0;
}
cs



 위와 같이 입력하면 a 에는 4가 저장됩니다. 수학에서 = 은 '같다' 라는 의미이지만, C언어에서는 전혀 다릅니다. 오히려 '같게 만들어라'는 식에 가깝습니다. 위에서 사용한 a=4; 의 의미는 '오른쪽의 값을 왼쪽에 넣어라.'는 의미로 통하게 됩니다.


 따라서, 변수이름 = 변수의 유형에 속하는 값; 의 형식으로 변수에 값을 저장할 수 있습니다. 만일 값이 변수의 유형과 다르다면 에러가 날 수 있습니다.


 a는 정수형 변수이기 때문에 다음과 같이 값을 입력해 줄 수도 있습니다.

1
2
3
4
5
6
7
8
9
#include <stdio.h>
 
int main(void) {
    int a;
    a=4;
    a=3*3;
    a=2+4*1;
    return 0;
}
cs


(*는 c 언어에서 곱하기를 뜻합니다.)


위와 같은 프로그램에선 a 에 4, 9, 6 이 순차적으로 저장됩니다. 최후에는 a 에 6이 저장되어 있지요.


1
2
3
4
5
6
7
8
9
#include <stdio.h>
 
int main(void) {
    int a;
    a=4;
    a=a*3;
    a=a+4*1;
    return 0;
}
cs


 이번에는 등호(=)의 오른쪽에 변수가 들어가는 경우입니다. 변수가 왼쪽이 아닌 오른쪽에 들어갔을 땐, 저장되어 있는 값으로 대체됩니다.


 a=4; 에선 a 에 4가 저장되고,

 a=a*3; 에선 a=4*3; 으로 대체되므로 12가 저장되고,

 a=a+4*1; 에선 a=12+4*1 으로 대체되므로 16이 저장되는 식입니다.


1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
 
int main(void) {
    int a;
    int b;
    a=4;
    b=3;
    a=a*b;
    return 0;
}
cs


물론 다른 변수도 식에 포함될 수 있습니다. 이 경우, a 에는 12가 저장됩니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
 
int main(void) {
    int a, b, c;
    a = 11, b = 2;
    c = a/b;
    printf("11/2 = %d\n",c);
    a = 13, b = 5;
    c = a/b;
    printf("13/5 = %d\n",c);
    a = 14, b = 4;
    c = a/b;
    printf("14/4 = %d\n",c);
}
cs


 정수형 변수끼리 나눗셈을 하면 나머지는 모두 버리고 몫만 남기게 됩니다. 위 프로그램을 직접 실행시켜 보면, 이런 사실을 확인할 수 있습니다.



1
2
3
4
5
6
7
#include <stdio.h>
 
int main(void) {
    int a=14, b=5;
    a=a%b;
    return 0;
}
cs


 C언어에서 %는 나머지 연산을 뜻하고, 따라서 a%b 는 a를 b로 나눈 나머지가 됩니다. a에는 14%5의 결과값인 4가 저장됩니다.


1
2
3
4
5
6
#include <stdio.h>
 
int main(void) {
    int a=1, b=2, c=3;
    return 0;
}
cs


 이와 같이 선언을 할 때에도 값을 넣어줄 수 있습니다.


1
2
3
4
5
6
7
8
#include <stdio.h>
 
int main(void) {
    int a=1;
    a*=3;
    a+=5;
    return 0;
}
cs


 이제부턴 새로운 연산자입니다. C언어에서는 편의를 위해 위와 같은 *=, += 형태의 연산자를 지원합니다. 뜻은 각각 'a에 3을 곱해라', 'a에 5를 더해라' 입니다. 결과적으로 a=a*3; 이런 구문을 a*=3; 이런 식으로 요약할 수 있게 해준 것이지요. 물론 뺄셈, 나눗셈, 나머지 연산도 가능합니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>
 
int main(void) {
    // your code goes here
    int a = 1, b;
    a++;
    printf("1++ 결과 = %d\n",a);
    ++a;
    printf("++2 결과 = %d\n",a);
    b = a++;
    printf("b = a++ 결과 : a = %d, b = %d\n",a,b);
    b = ++a;
    printf("b = ++a 결과 : a = %d, b = %d\n",a,b);
    b = a--;
    printf("b = a-- 결과 : a = %d, b = %d\n",a,b);
    b = --a;
    printf("b = --a 결과 : a = %d, b = %d\n",a,b);
    return 0;
}
cs


 위 프로그램은 꼭 직접 코딩하여 실행시켜 본 후, 설명을 확인하시는 걸 추천합니다.


 정수형 변수를 1만큼 증가시키거나 감소시키고 싶다면, a+=1, a-=1 로도 가능하지만 더 축약하는 것이 가능합니다. C언어에선 변수 a를 1만큼 증가시킬때, a++ 혹은 ++a 로도 가능하도록 되어 있기 때문입니다. 이 두 연산은 단독으로 사용되면 똑같이 1을 증가시키는 역할만 하므로 차이가 없습니다.


 단, 다른 연산과 함께 쓰였을 시 a++ 은 다른 연산을 수행한 이후 a를 1 증가시키고, ++a은 a를 1 증가시킨 이후 다른 연산을 수행한다는 차이점이 있습니다.


 이를 이해하기 위해선 위의 소스코드를 돌려봐야 합니다. 정상적으로 돌아갔다면 아래와 같은 출력 내용이 나올 것입니다.


1++ 결과 = 2

++2 결과 = 3

b = a++ 결과 : a = 4, b = 3

b = ++a 결과 : a = 5, b = 5

b = a-- 결과 : a = 4, b = 5

b = --a 결과 : a = 3, b = 3


b = a++ 을 하였을 때, b 에 a의 값인 3이 들어가고 그 후에 a 가 3에서 4로 1이 증가하기 떄문에 a = 4, b = 3 이란 결과가 나옵니다. 반대로 b = ++a 을 하였을 때는,  a 가 4에서 5로 1이 증가하고 그 후에 b 에 a의 값인 5가 들어가서 a = 5, b = 5 이란 결과가 나옵니다.




5. 정수형 변수에 표준 입력 받기


 지금까지 설명드린 %, *=, ++ 같은 연산자들만 사용하면 프로그램을 돌릴 때마다 계속해서 같은 수를 출력할 수 밖에 없습니다. 만약 계산기처럼 새로운 값을 입력할 때마다 새로운 결과 값을 알려주는 프로그램을 만들고 싶다면 입력을 따로 받아야 합니다.


 C언어에서 입력을 받기 위한 기본 함수는 scanf 로, printf 와 비슷한 형식을 사용합니다. 정수형 변수는 아래와 같은 형식을 사용하면 입력받을 수 있습니다.


scanf("%d",&변수이름);

scanf("%d %d",&변수이름1, &변수이름2);


 실행 방식은 printf 와 반대로 이해하면 됩니다. 먼저 정수형 서식 문자인 %d로 십진수 숫자를 입력 받고, 그 값을 변수에 저장하는 것입니다. '&변수이름' 은 그 변수가 컴퓨터의 방대한 저장 공간 중 어디에 있나를 나타내는 '주소'입니다. scanf 는 변수 이름이 아니라 해당 주소를 찾아가서 숫자를 저장하기 때문에, 이 경우엔 반드시 & 를 붙여줘야 합니다.



 이제 이데온에서 input 탭에 2를 넣어주고, 위와 같은 프로그램을 돌려보면 그러면 output 탭에 2가 출력 됨을 확인할 수 있습니다. 만일 웹 컴파일러가 아니라 visual studio 등의 컴파일러를 이용한다면, 프로그램 실행 시 나오는 콘솔 창에 입력할 값을 타이핑 하고 엔터를 치면 됩니다.




6. int 범위


 int 변수는 한정된 저장 공간이므로, 굉장히 큰 숫자까지 저장할 순 없습니다. int 가 어디까지 저장할 수 있는 지를 알아보려면 우선 int의 저장 용량이 4 바이트라는 걸 기억해야 합니다. 그러면 4byte = 32bit 이므로, int는 가지의 경우의 수를 표현할 수 있다는 걸 알 수 있습니다.


 따라서 int가 0부터 표현할 수 있다면 까지 표현할 수 있습니다. 하지만 까지 표현하도록 하면 음수를 하나도 표현할 수 없기 때문에 그런 식으로 int의 범위를 설정하진 않았습니다. 결과적으로 int 는부터 까지의 정수를 저장할 수 있도록 설정되어 있고, 이는 십진수로 –2,147,483,648 ~ 2,147,483,647 의 범위입니다.


1
2
3
4
5
6
7
8
9
#include <stdio.h>
 
int main(void) {
    int a=1000000000, b=1000000000;
    int c;
    c=a*b;
    printf("%d",c);
    return 0;
}
cs


위처럼 억지로 int의 범위를 넘어가도록 해보면, 제대로 계산된 것이 아닌 이상한 값이 나옴을 확인할 수 있습니다.




7. 문제


백준 온라인 저지 채점 방법


(0) [BOJ 1000] A+B


(1) [BOJ 10869] 사칙연산


(2) [BOJ 10430] 나머지


풀이 모음