Language/C

02. 기본 문법

BlackWhale 2025. 3. 16. 19:29

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