1. 변수와 데이터 타입
- C에서는 데이터를 저장하기 위해 변수를 선언하며, 각 변수는 저장할 값의 종류에 따라 데이터 타입(data type)을 가져야 함
- 기본 데이터 타입으로 정수형(int), 문자형(char), 실수형(float) 등이 있음
int age = 25; // 정수형 변수 age를 선언하고 25로 초기화
char grade = 'A'; // 문자형 변수 grade를 선언하고 'A'로 초기화
double pi = 3.14; // 실수형 변수 pi를 선언하고 3.14로 초기화
- 위의 예에서 int는 4바이트 정수를, char는 1바이트 문자를, double은 8바이트 실수를 저장
- 변수 선언 시 초기값을 줄 수도 있고, 나중에 할당(= 연산자 사용)할 수도 있음
- 변수를 사용하기 전에 반드시 선언되어야 하며, C는 정적 타입 언어이므로 한 번 선언된 변수의 타입은 변경할 수 없음
2. 상수와 리터럴
- 상수(constant)는 프로그램 실행 중에 값이 변경되지 않는 데이터를 의미
- C에서 상수를 사용하는 방법은 크게 두 가지
- #define 전처리기 지시어를 사용하여 매크로 상수로 정의하는 것
- const 키워드를 사용하여 심볼릭 상수(변수처럼 취급되는 상수)를 선언하는 것
#define MAX_VALUE 100 // 매크로 상수 정의
const float TAX_RATE = 0.1f; // 실수형 상수 정의 (값 변경 불가)
- MAX_VALUE는 컴파일 시 100으로 대체되는 상수이고, TAX_RATE는 0.1로 초기화된 후 값을 변경할 수 없는 상수 변수
- 리터럴(literal)은 코드에서 직접 표현된 값 그 자체
- 예를 들어, 정수 100, 문자 'A', 문자열 "Hello"는 각각 정수 리터럴, 문자 리터럴, 문자열 리터럴
- 리터럴은 그 자체로 하나의 값을 의미하므로, 변수에 대입하거나 함수 호출 시 인자로 전달되는 등의 방식으로 사용
3. 연산자
- C 언어에는 다양한 연산자(operator)가 존재하며, 이를 활용하여 산술 계산이나 논리 판단 등을 수행
1) 산술 연산자: + (덧셈), - (뺄셈), * (곱셈), / (나눗셈), % (나머지) 등
- 예: a + b, x * y.
2) 대입 연산자: = (값 대입). 왼쪽 변수에 오른쪽 값을 저장합니다. 또한 +=, -=, *= 등 복합 대입 연산자도 있음
- 예: x += 5는 x = x + 5와 동일한 동작
3) 비교 연산자(관계 연산자): == (같은가), != (같지 않은가), > (보다 큰가), < (보다 작은가), >=, <= 등이 있으며,
결과는 참(true)/거짓(false) 값으로 나타남
4) 논리 연산자: && (AND), || (OR), ! (NOT)가 있으며, 참/거짓 값을 조합하거나 뒤집을 때 사용
- 예: (a > 0 && b < 5)는 a가 0보다 크고 동시에 b가 5보다 작은지 검사
5) 비트 연산자: & (비트 AND), | (비트 OR), ^ (비트 XOR), ~ (비트 NOT), << (비트 왼쪽 시프트), >> (비트 오른쪽 시프트)
가 있음. 정수의 이진 표현에 대해 비트 단위로 연산을 수행할 때 사용됨
- 연산자를 사용할 때는 연산자 우선순위와 결합 방향에 유의해야 하지만, 복잡한 식에서는 보통 소괄호 ()를 사용하여 연산 순서를 명시적으로 지정하는 것이 안전
4. 입출력 함수 (printf, scanf)
- 표준 라이브러리 <stdio.h>에서는 콘솔 입출력을 위한 표준 출력 함수 printf와 표준 입력 함수 scanf를 제공
- printf는 원하는 형식(format)에 따라 콘솔에 출력
- scanf는 지정한 형식에 따라 키보드 입력을 받아 변수에 저장
- 형식을 지정하기 위해 형식 지정자(format specifier)를 사용
#include <stdio.h>
int main() {
int a, b;
printf("두 정수를 입력하세요: ");
scanf_s("%d %d", &a, &b); // 정수 두 개를 입력받음
printf("합계: %d\n", a + b);
return 0;
}
- 사용자가 scanf에서 %d %d에 맞춰 두 정수를 입력하고 엔터 키를 치면, a와 b 변수에 각각 값이 저장
- 이후 printf가 두 수의 합을 출력
- scanf_s를 사용하는 이유
- scanf, strcpy, fopen 과 같은 함수들을 사용하면 최신 Visual Studio에서 C4996 오류가 발생
- 이 함수들은 버퍼 오퍼플로우(BOF) 등의 보안 취약점을 가지고 있으므로 사용을 자제하라는 의미
해결 방법
1) 안전한 함수로 대체 하기 scanf_s, strcpy_s, fopen_s
2) 매크로 추가 #define_CRT_SECURE_NO_WARNINGS
- 취약점에 민감할 필요가 없는 코드를 작성하는 경우 코드 최상단에 _CRT_SECURE_NO_WARNINGS 를 정의해주면
해당 소스 파일(c, cpp)에서 이전과 같이 안전하지 않은(unsafe) scanf, strcpy, fopen 등의 함수를 사용할 수 있음 - '#define _CRT_SECURE_NO_WARNINGS'는 반드시 최상단('#include <studio.h>' 보다 위)에 정의
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
3) 프로젝트 속성에서 SDL 검사 옵션 해제
- SDL(Security Development Lifecycle) 옵션을 해제해주면 모든 소스 파일에서 안전하지 않은 함수를 사용할 수 있음
- [프로젝트 속성] -> [C/C++] -> [SDL 검사]: 아니요(/sdl-) 선택
※ SDL(Security Development Lifecycle)이란? 보안 개발 수명주기의 줄임말로서, 개발 프로세스의 모든 단계에서 보안 및 개인 정보 고려 사항을 도입하여 개발자가 매우 안전한 소프트웨어를 구축하고 보안 규정 준수 요구 사항을 해결하며 개발 비용을 줄일 수 있도록 마련된 지침
'Language > C' 카테고리의 다른 글
06. 포인터 (0) | 2025.03.18 |
---|---|
05. 배열과 문자열 (0) | 2025.03.18 |
04. 함수 (0) | 2025.03.18 |
03 제어문과 반복문 (0) | 2025.03.18 |
01. C언어 소개 (0) | 2025.03.16 |