정수를 넣을 공간은 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입니다.