정수를 넣을 공간은 int를 사용
int a; //정수를 저장할 공간을 a라 이름 붙여 메모리에 4바이트를 할당하겠다고 컴파일러에 알려줍
컴퓨터의 메모리 공간은 재활용되며, 프로그램이 종료되면 사용하던 메모리 공간을 반납하고 새로 실행된 프로그램이 그 공간을 사용하는데 이 때 종료된 프로그램이 어떤 값을 메모리에 남겨 놓았는지 알 수 없다.
새 프로그램에서 이 값은 의미가 없으므로 이를 쓰레기 값이라 하고 이 값때문에 오류가 생길 수 있으므로 반드시 원하는 값으로 바꾸는 초기화 과정이 필요하다.
a = 10;
프로그램에서는 대입 연산자라 부르며, 오른쪽 값을 왼쪽에 저장(할당)한다는 의미
중괄호의 블록({}
)안에 변수를 선언하며 선언한 위치부터 블록 끝까지 사용할 수 있습니다.
컴파일러에 따라 변수의 선언 위치가 제한될 수 있습니다.
변수의 자료형이 같으면 동시에 둘 이상의 변수를 선언할 수 있습니다.
int a;
int a, b, c;
대입 연산자(=)는 연산자 왼쪽의 변수에 오른쪽의 값을 저장합니다.
변수는 대입 연산자 왼쪽에서는 저장 공간이 되고, 오른쪽에서는 값이 됩니다.
#include <stdio.h>
int main(void)
{
//1. int형 변수 a를 선언하세요.
int a;
//2. int형 변수 b, c를 한 줄로 선언하세요.
int b, c;
double da; // double형 변수 da 선언
char ch; // char형 변수 ch 선언
//3. int형 변수 a에 10을 초기화하세요.
a = 10;
//4. int형 변수 b에 a를 대입하세요.
b = a;
//5. int형 변수 c에 a + 20을 대입하세요.
c = a + 20;
da = 3.5; // double형 변수 da에 실수 3.5 대입
ch = 'A'; // char형 변수 ch에 문자 'A' 대입
printf("변수 a의 값 : %d\n", a);
printf("변수 b의 값 : %d\n", b);
printf("변수 c의 값 : %d\n", c);
printf("변수 da의 값 : %.1lf\n", da);
printf("변수 ch의 값 : %c\n", ch);
return 0;
}
변수 a의 값 : 10
변수 b의 값 : 10
변수 c의 값 : 30
변수 da의 값 : 3.5
변수 ch의 값 : A
변수의 형태 = 자료형 혹은 데이터형
크게 정수형과 실수형으로 구분
같은 정수형이라도 메모리 저장 공간의 크기에 따라char
,short
,int
,long
,long long
으로 구분된다.
ex) 예를 들어 char형은 크기가 1바이트로 8비트
−2^7 ~ 2^7 −1,
결국 -128~127의 값을 저장할 수 있다.
char
형은 작은 범위의 정수를 저장할 수 있지만, 그 이름에서 예상할 수 있듯이 주로 문자를 저장하는 용도로 쓰인다.
char
형에는 문자, 숫자 모두 저장할 수 있지만 이 값을 문자로 출력하느냐 값으로 출력하느냐는 변환 문자가 결정한다.
char a = 'A';
printf("%d", a);
//출력값은 65
printf("%c", a);
//출력값은 A
char
형 변수를 출력할 때 %c
를 사용하면 변수에 저장된 값을 아스키 코드 값으로 해석하여 그 값에 해당하는 문자
를 출력하고 %d
를 사용하면 정수
로 출력한다.
#include <stdio.h>
int main(void)
{
//1. char형 변수 ch1을 선언과 동시에 ‘A’로 초기화하세요.
char ch1 = 'A';
//2. char형 변수 ch2을 선언과 동시에 65로 초기화하세요.
char ch2 = 65;
printf("문자 %c의 아스키 코드 값 : %d\n", ch1, ch1);
printf("아스키 코드 값이 %d인 문자 : %c\n", ch2, ch2);
return 0;
}
정수형 자료형에는
char
,short
,int
,long
,long long
등이 있다.
각 자료형은 저장 값의 범위가 다르지만 출력할 때는 모두%d
를 사용한다.
단,long
형은 소문자 l(엘)을 붙여서%ld
로 출력하고 long long형은 2개 붙여서%lld
로 출력한다.
int
를 사용한다.int
형은 연산의 기본 단위로 컴퓨터에서 가장 빠르게 연산된다. short
형은 int
형보다 크기가 작아 메모리를 적게 사용하지만, 연산 과정에서는 int
형으로 변환되므로 실행 속도가 느려질 수 있다.
long long
형은 크기가 8바이트이므로int
형으로 저장할 수 없는 큰 범위의 값을 저장할 수 있지만 메모리의 낭비가 큼
long
형은 큰 값을 저장할 때 사용한다.int
형은 4바이트이지만, int
형이 2바이트로 구현된 컴파일러가 간혹 있다.long
형을 사용합니다.sizeof
연산자로 확인할 수 있다.printf("long long형의 크기 : %d바이트\n", sizeof(long long));
#include <stdio.h>
int main(void)
{
//1. short형 변수 sh를 선언과 동시에 32767로 초기화하세요.
short sh = 32767;
//2. int형 변수 in를 선언과 동시에 2147483647로 초기화하세요.
int in = 2147483647;
//3. long형 변수 ln를 선언과 동시에 2147483647로 초기화하세요.
long ln = 2147483647;
//4. long long형 변수 lln를 선언과 동시에 123451234512345로 초기화하세요.
long long lln = 123451234512345;
printf("short형 변수 출력 : %d\n", sh);
printf("int형 변수 출력 : %d\n", in);
printf("long형 변수 출력 : %ld\n", ln);
printf("long long형 변수 출력 : %lld\n", lln); // long long형은 lld로 출력
//printf("long long형의 크기 : %d바이트\n", sizeof(long long));
printf("long long형의 크기 : %d바이트\n", sizeof(lln));
return 0;
}
short형 변수 출력 : 32767
int형 변수 출력 : 2147483647
long형 변수 출력 : 2147483647
long long형 변수 출력 : 123451234512345
//long long형의 크기 : 8바이트
정수형은 보통 양수와 음수를 모두 저장하지만, 양수만을 저장하면 두 배 더 넓은 범위의 값을 저장할 수 있다.
따라서 나이와 같이 음수가 없는 데이터를 저장할 때는
unsigned
를 사용한다.
unsigned
가 없으면 자동으로signed
로 선언된다.
unsigned
자료형을 사용할 때는 출력시 변환 문자 사용에 주의해야 합니다. unsigned
변수에 큰 양수를 저장하고 %d
로 출력하면 음수로 출력될 가능성이 있으며, 음수를 저장하고 %u
로 출력하면 양수가 출력된다.
그 이유는 메모리에 저장되는 형태는 같으나 printf()
함수가 데이터를 해석해서 보여주는 방법이 다르기 때문
unsigned
형 변수에 음수도 저장하고 출력할 수 있지만 연산하거나 대소를 비교할 때는 부호 비트를 고려하지 않고 항상 양수로 처리하므로 결과가 예상과 다를 수 있다.
따라서
unsigned
자료형은 항상 양수만 저장하고%u
로 출력하기를 권합니다.
#include <stdio.h>
int main(void)
{
//1. unsigned int형 변수를 a를 선언하세요.
unsigned int a;
//2. a를 4294967295로 초기화하세요.
a = 4294967295;
printf("%d\n", a); // %d로 출력
//3. a를 -1로 초기화하세요.
a = -1;
printf("%u\n", a); // %u로 출력
return 0;
}
실수는 데이터를 구현하는 방법이 정수와 다르므로 별도의 자료형을 사용한다. 크기에 따라 float
, double
, long double
로 구별하며, 값을 저장할 수 있는 범위가 다르다.
가장 작은 float
도 4바이트이므로 저장 범위가 큰 편,
실수 자료형은 값의 범위보다 유효 숫자의 개수에 주목할 필요가 있다.
실습에서 다루겠지만 초깃값을 1.234567890123456789로 저장을 해도 출력값이 다르게 나오는 것을 확인할 수 있다.
그 이유는 컴퓨터에서 실수를 표현하는 방식이 오차를 갖고 있기 때문
따라서 float
형은 유효 숫자 7자리, double
형은 15자리의 범위 내의 값을 사용하는 것이 좋다.
유효 숫자의 개수를 계산해가며 프로그래밍하는 것이 걱정이라면 다음 두 가지 방법을 따라 사용하면 됩니다.
정수형을 기본으로 사용하고 실수형은 꼭 필요한 경우만 사용한다.
실수형은 유효 숫자가 많은 double
형을 기본으로 사용합니다.
#include <stdio.h>
int main(void)
{
//1. float형 변수 ft를 선언과 동시에 1.234567890123456789로 초기화하세요.
float ft = 1.234567890123456789 ;
//2. double형 변수 db를 선언과 동시에 1.234567890123456789로 초기화하세요.
double db = 1.234567890123456789 ;
//3. “float형 변수의 값 : ft\n” 이 문장을 출력하려고 합니다. 서식문자 %f를 사용하되 소수점 이하 20자리까지만 출력하세요.
printf("float형 변수의 값 : %.20f\n", ft);
//4. “double형 변수의 값 : db\n” 이 문장을 출력하려고 합니다. 서식문자 %lf를 사용하되 소수점 이하 20자리까지만 출력하세요.
printf("double형 변수의 값 : %.20lf\n", db);
return 0;
}
문자열은
char
형을 배열 형태로 만들어 저장char 배열명[문자열길이 + 1] = 문자열;
// ex 문자열 “apple”을 저장
char fruit[6] = "apple";
문자열의 길이보다 배열의 크기를 하나 더 크게 잡는 이유는 컴파일러가 문자열의 끝에 \0(널 문자)를 자동으로 추가하기 때문
※ 널 문자는 문자열의 끝을 표시하는 특별한 문자
※ 기본 자료형을 여러 개 묶어 사용하는 것을 배열이라 함
char
배열은 문자열을 저장하는 변수의 역할을 하며 %s
로 출력
#include <stdio.h>
int main(void)
{
//1. 길이가 20인 char형 배열 fruit을 선언과 동시에 “strawberry”로 초기화하세요.
char fruit[20]= "strawberry";
//2. “딸기 : fruit\n” 이 문장을 출력하려고 합니다. 서식문자 %s를 사용해서 출력하세요.
printf("딸기 : %s\n", fruit);
//3. “딸기쨈 : fruit "jam"\n” 이 문장을 출력하려고 합니다. 서식문자 %s를 두 번 사용해서 출력하세요.
char j[4] = "jam";
printf("딸기쨈 : %s %s\n" , fruit, j);
return 0;
}
딸기 : strawberry
딸기쨈 : strawberry jam
배열에는 대입 연산자(=)를 사용할 수 없다.
대입 연산은 대상 자료형의 크기가 일정해야 하는데 선언에 따라 크기가 달라지는 char
배열은 대입 연산을 사용할 수 없습니다.
char
배열에 새로운 문자열을 저장하는 방법char
배열에 초기화 이외에 문자열을 저장할 때는 strcpy
함수를 사용strcpy
를 사용하기 위해서는 string.h
헤더파일을 불러와야 한다.#include <string.h>
// 문자열을 다룰 수 있는 string.h 헤더 파일 포함
int main(void)
{
char a[20] = "abcdef";
// abcdef로 초기화
strcpy(a, "ghijkl");
// a에 ghijkl 복사
}
#include <string.h>
//1. 헤더파일 string.h를 추가하세요.
int main(void)
{
char fruit[20] = "strawberry"; // strawberry로 초기화
printf("%s\n", fruit); // strawberry 출력
//2. strcpy()를 사용해서 fruit에 “banana”를 저장하세요.
strcpy(fruit, "banana");
//3. fruit을 서식문자를 사용하고 개행을 포함해서 출력하세요.
printf("%s\n", fruit);
return 0;
}
strawberry
banana
변수는 저장 공간이므로 언제든지 그 값을 바꿀 수 있지만
const
를 사용한 변수는 예외
const
를 사용한 변수는 다음과 같은 형식으로 선언한다.const 자료형 변수명 = 값;
const
를 사용하면 이후에는 값을 바꿀 수 없으므로 반드시 선언과 동시에 초기화해야 한다.
초기화하지 않으면 변수의 쓰레기 값이 계속 사용되며, 만약 초기화 이후에 값을 바꾸고자 하면 컴파일 과정에서 에러가 발생한다.
#include <stdio.h>
int main(void)
{
int income = 0; // 소득액 초기화
double tax; // 세금
//1. const를 사용해서 double형 변수 tax_rate를 선언하고 0.12로 초기화하고 실행하세요.
const double tax_rate = 0.12;
//2. tax_rate를 0.15로 초기화하고 실행을 눌러 에러가 뜨는 것을 확인하세요.
// tax_rate = 0.15
// strcpy(tax_rate, 0.15);
income = 456; // 소득액 저장
tax = income * tax_rate; // 세금 계산
printf("세금은 : %.1lf입니다.\n", tax);
return 0;
}
지시사항 1번 실행결과입니다.
세금은 : 54.7입니다.
지시사항 2번 실행결과입니다.
main.c: In function ‘main’:
main.c:10:14: error: assignment of read-only variable ‘tax_rate’
tax_rate = 0.15;
^
/elice/runner.sh: line 2: ./main: No such file or directory
scanf()
함수는 키보드에서 입력한 값을 변수에 저장할 때 사용
- 변수의 형태에 맞는 변환 문자를 사용하고 입력할 변수 앞에
&
기호를 붙인다.scanf("%d", &a);
예를 들어 int
형 변수 a에 정수를 입력하는 방법은 다음과 같습니다. 변환 문자와 변수 사이는 콤마로 구분합니다.
scanf("%d", &a);
scnaf()
함수에서 변수명을 지정할 때는&
을 붙여야 한다.scanf()
함수에서 사용한 변환 문자와 맞는 형태의 데이터를 입력해야 한다.
#include <stdio.h>
int main(void)
{
int a;
//1. scanf()를 사용해서 값을 입력받아 a에 저장하세요.
scanf("%d", &a);
printf("입력된 값 : %d\n", a); // 입력한 값 출력
return 0;
}
10 //10 입력
입력된 값 : 10
scanf
함수는 여러 개의 변환 문자를 나열하여 한 번에 2개 이상의 변수에 값을 입력할 수 있다.
ex) int
형 변수 a와 double
형 변수 b에 입력
scanf("%d%lf", &a, &b);
#include <stdio.h>
int main(void)
{
int age; // 나이는 정수형
double height; // 키는 실수형
printf("나이와 키를 입력하세요 : "); // 입력 안내 메시지 출력
//1. scanf()를 사용해서 나이와 키를 입력 받아 age와 height에 저장하세요.
scanf("%d%lf", &age, &height);
printf("나이는 %d살, 키는 %.1lfcm입니다\n", age, height); // 입력값 출력
return 0;
}
나이와 키를 입력하세요 :
>> 17, 187.5
나이는 17살, 키는 187.5cm입니다
char
형 변수에 문자를 입력할 때는 키보드로 입력하는 모든 문자가 대상이 된다. 즉, 스페이스(공백 문자)나 엔터(개행 문자)도 하나의 문자로 전달된다.
문자열은char
배열에%s
변환 문자를 사용하여 입력하는데, 문자열을 입력할 때는 배열명에&
기호를 붙이지 않는다.char a[20]; scanf("%s", a);
또한 스페이스나 엔터, 탭 등을 만나면 바로 전까지만 저장되므로 공백 없이 연속으로 입력해야 한다.
#include <stdio.h>
int main(void)
{
//1. char형 변수 grade와 길이가 20인 char형 배열 name을 선언하세요.
char grade;
char name[20];
printf("학점 입력 : ");
//2. scanf()를 사용해서 학점을 입력받아 grade에 저장하세요.
scanf("%c", &grade);
printf("이름 입력 : ");
//3. scanf()를 사용해서 이름을 입력받아 name에 저장하세요.
scanf("%s", name);
printf("%s의 학점은 %c입니다.\n", name, grade);
return 0;
}
학점 입력 : A
이름 입력 : 홍길동
홍길동의 학점은 A입니다.