" />
본문 바로가기

프로그래밍/C언어

[잼민이도 이해하는 C언어 강의] 4. 변수란? / #변수

[잼민이도 이해하는 C언어 강의] 4. 변수란? / #변수

안녕하세요

 

정고리즘의 정고쌤입니다.

 

지난 강의 바로가기

 

지난 강의에서는 자료형에 대해서,

그리고 printf에서 사용되는 변환 문자에 대해서 알아보았습니다.

 

지난 강의를 학습하지 않은 분들은

이번 강의를 이해하기 어려우니

반드시 지난 강의를 학습하고 오시기를 권장드립니다.

 


 

1. 변수

 

오늘의 강의 진행 순서입니다.

변수 하나 밖에 없네요.

 

하지만 내용이 꽤나 깁니다.

그만큼 변수는 중요하고, 꼭 알아야되는 부분입니다.

 


1. 변수

 

변수란 데이터를 보관하는 상자입니다.

 

 

상자에 비유하는 이유는

변수를 통해서 데이터를 보관할 수 있기 때문입니다.

 

하지만,

변수에는 현실의 상자와 다른 점들이 몇 가지가 있습니다.

 


1. 변수는 한번에 1개의 데이터만 보관할 수 있다.

 

현실의 상자는 크기만 된다면

원하는 것은 뭐든지 담을 수가 있습니다.

 

그러나 변수의 경우에는

한번에 1개의 데이터 밖에 담지 못합니다.

 

예를 들어서

10이라는 데이터가 보관되어 있을 때,

20이라는 데이터를 추가로 보관하려고 한다면

10이 자동으로 삭제되고 그 자리에 20이 보관되게 됩니다.

 

 

2. 변수에는 담을 수 있는 자료형이 정해져 있다.

 

지난 강의에서

자료형이라는 것을 알아본 바 있습니다.

 

자료형은 수 많은 데이터들을 용이하게 분류하고, 처리하기 위해

꼭 필요하다고 설명했습니다.

 

변수도 마찬가지입니다.

데이터를 보관하기 위한 목적인 변수도 역시

자료형을 분류하여 데이터를 보관할 필요가 있습니다.

 

그래서 모든 변수에는 정해진 한 가지의 자료형의 데이터 만을 담을 수가 있습니다.

 

 

3. 모든 변수에는 이름이 있다.

모든 변수에는 이름표가 붙습니다.

어떤 변수에 어떤 데이터가 들어있는 지 구분하기 위해서입니다.

 

그리고 그 이름은 코드를 작성하는 사람(프로그래머)가

필요에 따라 마음대로 정할 수 있습니다.

 


 

변수를 만들기 위해서는

변수를 선언해야 합니다.

 

코딩에서 변수를 만드는 것을 '변수를 선언한다'라고 표현합니다.

 

변수를 선언하는 방법은

아래와 같습니다.

 

변수 타입 (변수 이름);

 

변수 타입은 변수에 보관할 데이터의 자료형에 따라서 달라집니다.

 

따라서 보관할 데이터가 정수인지 실수인지

변수를 선언하기 전에 먼저 생각해보아야합니다. 

 

 

변수 타입은 다음과 같습니다.

 

  변수 타입 사용 예시)
정수 int int A;
실수 double double A;
문자 char char A;
문자열 char char A[10];

 

정수를 저장하는 변수를 선언하는 예시와 같이

int A; 처럼 변수를 선언하게 되면

A라는 이름의 변수가 생성되게 됩니다.

 

변수 선언

 

int가 적힌 부분이 변수 타입,

A가 적힌 부분이 변수 이름입니다.

 

 

변수 이름은 위에서 제가 마음대로 정할 수 있다고는 했지만

정해진 규칙이 있습니다.

 

규칙을 따르지 않는다면

컴파일이 되지 않습니다.

 

 

1. 영어를 사용해야 합니다.

 

한글로는 변수를 만들 수 없습니다.

 

불가능한 예) int 가나다;

 

 

2. 숫자를 사용할 수 있지만 첫 글자에 올 수 없습니다.

 

숫자를 변수에 넣는 것은 가능하지만

숫자가 첫 글자에 오는 것은 불가능 합니다.

 

불가능한 예) int 1score;

 

 

3. 특수 문자는 사용할 수 없습니다. _(언더 바)는 사용할 수 있습니다.

 

특수 문자는 변수에 넣을 수 없습니다.

하지만 _(언더 바) 기호는 예외로 사용가능합니다.

 

불가능한 예) int @;

 

 

4. 예약어는 변수 이름으로 사용할 수 없습니다.

 

예약어란 프로그래밍 언어에서 미리 지정된

단어들을 말합니다.

 

예를 들어서 변수를 선언할 때 사용한다고 했던

int, double, char 또한 예약어입니다.

 

이를 변수 이름으로 사용하게 된다면

예약어와 변수 이름이 곂쳐버려 문제가 발생할 수 있기 때문입니다.

 

불가능한 예) int double;

 

5. 변수의 이름은 중복될 수 없습니다.

 

변수 타입이 다르더라도

변수의 이름이 동일하면 컴파일할 수 없습니다.

 

그러나 소문자와 대문자는 서로 다르게 인식하기 때문에

같은 이름이여도 대소문자로 구분된다면 괜찮습니다.

 

불가능한 예) int A; double A;

 

 

위 규칙들만 잘 따른다면

변수의 이름은 원하는 대로 정할 수 있습니다.

 

보통 용도에 따라 변수 이름을 지정하는 것이

가장 좋습니다.

 

예를 들어

점수를 저장할 변수는 score

합계를 저장할 변수는 sum

개수를 저장할 변수는 count

이런 식으로 말이죠.

 


 

이번에는 아래 코드를 작성해 봅시다.

#include<stdio.h>
int main()
{
	int A;
	double B;
	char C;
	
	A = 10;
	B = 3.14;
	C = 'A';
	
	printf("A 변수 : %d\n",A);
	printf("B 변수 : %lf\n",B);
	printf("C 변수 : %c\n",C);
	
	return 0;
}

 

 

 

	int A;
	double B;
	char C;

이 부분은 각각

A라는 정수를 저장하는 변수,

B라는 실수를 저장하는 변수,

C라는 문자를 저장하는 변수

를 선언한 내용입니다.

 

	A = 10;
	B = 3.14;
	C = 'A';

 

이 부분은 선언한 변수에

데이터를 저장하는 내용입니다.

 

데이터를 저장할 때에는 

= 연산자를 사용하여

 

(변수 이름) = (데이터);

 

와 같은 방법으로 작성하여야 합니다.

 

=는 수학에서 '같다'라는 의미로 사용되지만

프로그래밍 언어에서는 '대입 연산자'라고 불리며

데이터를 변수에 저장할 때 사용되는 연산자입니다.

 

이렇게 대입 연산자를 사용하여 데이터를 저장하는 과정을

변수 초기화라고 부릅니다.

 

	printf("A 변수 : %d\n",A);
	printf("B 변수 : %lf\n",B);
	printf("C 변수 : %c\n",C);

 

이 부분은 변수에 저장된 데이터를

출력하는 내용입니다.

 

변환 문자를 통해서 변수의 데이터를 출력할 수 있습니다.

변환 문자는 당연히 변수 타입에 따라 달라집니다.

 

정수가 저장되는 int는 %d

실수가 저장되는 double은 %lf

문자가 저장되는 char는 %c 

 

지난 강의에서 학습한 내용 그대로입니다.

 


이번에는 아래의 코드를 한번 작성해 보겠습니다.

#include<stdio.h>
int main()
{
	int A = 10;
	double B = 3.14;
	char C = 'A';
	
	printf("A 변수 : %d\n",A);
	printf("B 변수 : %lf\n",B);
	printf("C 변수 : %c\n",C);
	
	return 0;
}

 

출력되는 결과는 위의 코드와 동일하기 때문에

생략하겠습니다.

 

실행 결과는 똑같지만

코드의 길이가 줄었습니다.

 

이렇게 변수를 선언함과 동시에

대입 연산자를 사용하여 데이터를 저장하는 것도 가능합니다.

 


 

아래의 코드를 작성해 봅시다.

#include<stdio.h>
int main()
{
	int A = 10, B = 20;
	
	printf("%d와%d",A,B);
	
	return 0;
}

 

 

int A = 10, B = 20;

이처럼 같은 타입의 변수는

하나의 변수 타입을 이용해 선언하는 것도 가능합니다.

 

,(콤마)를 이용하면 2개 뿐만 아니라

3개, 4개 그 이상도 선언하는 것이 가능합니다.

 

 


 

이번에는 아래의 코드를 작성해보겠습니다.

 

#include<stdio.h>
int main()
{
	int A = 10;
	
	printf("A 변수 변경 전 : %d\n",A);
    
	A = 20;
    
	printf("A 변수 변경 전 : %d\n",A);
	
	return 0;
}

 

 

앞에서 설명했던 변수의 특징 중

변수에는 한번에 한 개의 데이터만 저장할 수 있다고 했습니다.

 

위 코드에 의하면

첫 변수 A 선언과 함께 10을 초기화했습니다.

 

그리고 A를 출력하여 10이 출력된 것을 확인할 수 있고,

이후 A = 20;을 통해 20을 다시 대입했습니다.

 

이때 원래 저장되어 있던 10은 삭제되고,

20이 덮어쓰기되며 A에는 20만 남게된 것입니다.

 

이러한 변수의 특징을 적절히 활용한다면

변수를 최소한으로 만들며 코드를 작성하는 것도 가능합니다.

 


"왜 문자열을 저장하는 변수는 없나요?"

 

 

문자열은 조금 독특한 추가 규칙이 있습니다.

이것 때문에 사실 문자열은 매우 까다롭습니다.

 

아래 코드를 작성해 보겠습니다.

 

#include<stdio.h>
int main()
{
	char D[10] = "Hello";
	
	printf("%s",D);
	
	return 0;
}

 

 

문자열은 변수 타입이 문자를 저장하는 변수의 타입과 동일한 것을

눈치 채셨을 겁니다.

 

다만 뒤에 [ ] (대괄호) 기호가 붙는다는 것을 제외하면 말이죠.

 

문자열의 경우에는

char라는 변수 타입을 사용하며,

[ ]을 통해 변수에 저장할 문자열의 최대 길이를 지정해야 합니다.

 

char (변수이름)[최대 길이];

 

이때 길이란, 문자열에 포함된 문자의 개수를 말합니다.

 

위 코드에서 [10]이 사용되었습니다.

즉, 10개 문자 이하의 문자열은 모두 저장이 가능하다는 것입니다.

"Hello" 뿐만 아니라 "Hi", "Banana" 등등...

 

 

그러나 이때 "Strawbarry"는 저장할 수 없습니다.

 

"세보니까 딱 10글자인데, 가능한 거 아닌가요?"

 

10글자는 맞습니다. 그러나,

 

문자열은 총 문자 수 + 1로 문자의 개수를 세야합니다.

 

왜냐하면

문자열의 끝에는 문자열의 마지막을 표시하는 용도인

'\0' 널 문자라는 것이 자동으로 포함되기 때문입니다.

 

이는 프로그래머가 작성하지 않아도

자동으로 들어가기때문에 문자열에서는 항상 '\0' 널 문자를 생각해주어야 합니다.

 

따라서 "Strawbarry" 문자 10개가 아닌 11개이고,

위 코드에서 [10]으로는 저장할 수 없고,

[11]로 지정하면 저장이 가능해집니다.

 


 

그리고 출력 함수를 잘 보면

지난 강의에서 학습하였던 문자열의 변환 문자인 %s를 확인할 수 있습니다.

 

지난 강의에서 %s는 필요없지 않냐는 의문을 가졌었습니다.

 

그러나 이번 강의에서 변환 문자를 통해

변수의 데이터를 출력할 수 있다는 사실을 알게되었습니다.

 

그렇습니다.

%s는 문자열 변수의 데이터를 출력하기 위해

반드시 필요한 변환 문자입니다.

 

 


 

이번에는 아래 코드를 한번 작성해봅시다.

 

#include<stdio.h>
int main()
{
	char D[10];
	
	D = "Hello";
	
	printf("%s",D);
	
	return 0;
}

 

컴파일을 하여도

에러가 나며 컴파일되지 않을 것입니다.

 

그 이유는 D = "Hello"; 때문입니다.

 

문자열은 정말 독특한 녀석입니다.

선언부인 char D[10];에서만 대입연산자를 사용할 수 있고,

그 이후에는 대입연산자 사용이 불가능합니다.

 

 

"그럼 문자열 변수는 한번 저장된 데이터를 바꿀 수 없다는 건가요?"

 

아닙니다.

문자열 변수도 역시 저장된 데이터를 바꾸는 것이 가능합니다.

하지만 아직은 설명하지 않겠습니다.

 

이는 배열 강의에서 다시 알아보도록 하겠습니다.

 


 

오늘은 지난 시간에 배운 자료형과 변환 문자에 이어

변수라는 개념을 알아보았습니다.

 

다양한 변수를 만들어 출력해보며,

변수에 익숙해져 봅시다.

 

다음 강의에서는 출력 함수에 이어

입력 함수에 대해서 알아보도록 하겠습니다.