<stdio.h> 헤더파일에 정의
scanf : 입력문
변수 앞에 반드시 & 연산자(주소 연산자)를 사용
| 형식 | 설명 | 예시 출력 |
|---|---|---|
%d | 10진수 정수 | 10 |
%f | 실수 | 3.14 |
%c | 문자 | 'A' |
%s | 문자열 | "hello" |
%x | 16진수 (소문자) | 1a |
%o | 8진수 | 12 |
%p | 포인터 주소 | 0x7ffe... |
printf : 출력코드
콘솔(화면)에 출력
| 형식 | 설명 |
|---|---|
%d | 정수 입력 |
%f | 실수 입력 |
%c | 문자 입력 |
%s | 문자열 입력 (공백 이전까지) |
산술 연산자 (Arithmetic Operators)
| 연산자 | 의미 | 예시 | 결과 |
|---|---|---|---|
+ | 덧셈 | 3 + 2 | 5 |
- | 뺄셈 | 3 - 2 | 1 |
* | 곱셈 | 3 * 2 | 6 |
/ | 나눗셈 | 5 / 2 | 2 (정수 나눗셈) |
% | 나머지 | 5 % 2 | 1 |
대입 연산자
| 연산자 | 의미 | 예시 | 동등 표현 |
|---|---|---|---|
= | 대입 | a = 5 | - |
+= | 덧셈 후 대입 | a += 2 | a = a + 2 |
-= | 뺄셈 후 대입 | a -= 1 | a = a - 1 |
*= | 곱셈 후 대입 | a *= 3 | a = a * 3 |
/= | 나눗셈 후 대입 | a /= 2 | a = a / 2 |
%= | 나머지 후 대입 | a %= 2 | a = a % 2 |
증감 연산자 (Increment / Decrement)
| 연산자 | 의미 | 예시 | 설명 |
|---|---|---|---|
++ | 1 증가 | a++, ++a | 후위/전위 |
-- | 1 감소 | a--, --a | 후위/전위 |
비교 연산자
| 연산자 | 의미 | 예시 | 결과 |
|---|---|---|---|
== | 같다 | a == b | 1(참) 또는 0(거짓) |
!= | 다르다 | a != b | 1 or 0 |
> | 크다 | a > b | 1 or 0 |
< | 작다 | a < b | 1 or 0 |
>= | 크거나 같다 | a >= b | 1 or 0 |
<= | 작거나 같다 | a <= b | 1 or 0 |
논리 연산자 (Logical Operators)
| 연산자 | 의미 | 예시 | 결과 | ||||
|---|---|---|---|---|---|---|---|
&& | AND (둘 다 참) | a > 0 && b > 0 | 1 or 0 | ||||
| ` | ` | OR (하나라도 참) | `a > 0 | b > 0` | 1 or 0 | ||
! | NOT (부정) | !a | 1이면 0, 0이면 1 |
비트 연산자 (Bitwise Operators)
| 연산자 | 의미 | 예시 | ||
|---|---|---|---|---|
& | AND | a & b | ||
| ` | ` | OR | `a | b` |
^ | XOR | a ^ b | ||
~ | NOT | ~a | ||
<< | 왼쪽 쉬프트 | a << 1 (2배) | ||
>> | 오른쪽 쉬프트 | a >> 1 (2로 나눔) |
#include <stdio.h>
int main() {
int a = 5; // 00000101 (2진수)
int left = a << 1; // 00001010 (5 * 2 = 10)
int right = a >> 1;// 00000010 (5 / 2 = 2)
printf("a << 1 = %d\n", left); // 10
printf("a >> 1 = %d\n", right); // 2
return 0;
}
조건 연산자 (Ternary Operator)
조건 ? 참일 때 실행 : 거짓일 때 실행;
int max = (a > b) ? a : b;
쉼표 연산자 (Comma Operator)
여러 문장을 한 줄에 나열할 때 사용 (순서대로 실행)
a = (b = 3, b + 2); // b=3 먼저, 그 후 b+2 → a=5
조건문은 프로그램이 상황에 따라 다른 명령을 실행하도록 할 때 사용
조건문은 주로 if, else if, else, 그리고 switch로 구성
| 조건문 종류 | 설명 |
|---|---|
if | 조건이 참일 때 실행 |
if-else | 참/거짓 두 갈래 분기 |
else if | 여러 조건 판단 가능 |
switch | 변수 값에 따라 분기 (정수/문자형 주로) |
if - else if - else 문
if (조건1) {
// 조건1 참일 때 실행
} else if (조건2) {
// 조건2 참일 때 실행
} else {
// 모두 거짓일 때 실행
}
#include <stdio.h>
int main() {
int num;
printf("숫자를 입력하세요: ");
scanf("%d", &num);
if (num > 0) {
printf("양수입니다.\n");
} else if (num < 0) {
printf("음수입니다.\n");
} else {
printf("0입니다.\n");
}
return 0;
}
switch 문 : 하나의 변수 값을 기준으로 여러 분기
switch (변수) {
case 값1:
// 값1일 때 실행
break;
case 값2:
// 값2일 때 실행
break;
default:
// 모두 해당 안 될 때 실행
}
#include <stdio.h>
int main() {
int day;
printf("요일 번호를 입력하세요 (1~7): ");
scanf("%d", &day);
switch (day) {
case 1:
printf("월요일입니다.\n");
break;
case 2:
printf("화요일입니다.\n");
break;
case 3:
printf("수요일입니다.\n");
break;
case 4:
printf("목요일입니다.\n");
break;
case 5:
printf("금요일입니다.\n");
break;
case 6:
printf("토요일입니다.\n");
break;
case 7:
printf("일요일입니다.\n");
break;
default:
printf("1부터 7 사이의 숫자를 입력해주세요.\n");
}
return 0;
}
반복문(loop)은 조건이 참인 동안 동일한 코드 블록을 반복 실행하도록 하는 문법
| 문 종류 | 반복 조건 | 최소 1회 실행? |
|---|---|---|
for | 반복 횟수 지정 | 아니요 |
while | 조건 검사 → 반복 | 아니요 |
do-while | 실행 → 조건 검사 | 예 |
for 문
반복 횟수가 명확할 때 사용 (예: 1~10까지 출력)
구조
for (초기식; 조건식; 증감식) {
// 반복 실행할 코드
}
예제
#include <stdio.h>
int main() {
for (int i = 1; i <= 5; i++) {
printf("i = %d\n", i);
}
return 0;
}
i = 1
i = 2
i = 3
i = 4
i = 5
while 문
조건이 참이면 계속 반복. 반복 횟수가 불명확할 때 사용
구조
while (조건식) {
// 반복 실행할 코드
}
예제
#include <stdio.h>
int main() {
int i = 1;
while (i <= 5) {
printf("i = %d\n", i);
i++;
}
return 0;
}
do-while 문
코드 블록을 최소 한 번은 실행한 후 조건 검사
구조
do {
// 반복 실행할 코드
} while (조건식);
예제
#include <stdio.h>
int main() {
int i = 1;
do {
printf("i = %d\n", i);
i++;
} while (i <= 5);
return 0;
}
제어 키워드: break & continue
break: 반복문을 즉시 종료
continue: 다음 반복으로 건너뜀
하나의 이름으로 정의된 작업 묶음
입력값(매개변수)을 받아 작업을 수행한 후, 결과값(반환값)을 돌려줄 수 있음
| 용어 | 의미 |
|---|---|
| 반환형 | 함수가 돌려주는 값의 자료형 (int, void) |
| 함수 이름 | 함수 호출 시 사용하는 이름 |
| 매개변수 | 함수에 전달되는 입력값 |
| return | 함수 결과를 호출한 쪽으로 돌려줌 |
| void | 반환값이 없음을 의미 |
예제 : 두 수 더하기 함수
int add(int a, int b) {
return a + b;
}
#include <stdio.h>
// 함수 선언 (프로토타입)
int add(int, int);
int main() {
int result = add(3, 5);
printf("3 + 5 = %d\n", result);
return 0;
}
// 함수 정의
int add(int a, int b) {
return a + b;
}
반환값이 없는 함수 (void)
void greet() {
printf("안녕하세요!\n");
}
매개변수가 없는 함수
int getNumber() {
return 7;
}
✅ 함수의 장점
코드 재사용 (한 번 정의하면 여러 번 사용 가능)
가독성 향상
디버깅/유지보수 용이
모듈화 (기능별로 나눌 수 있음)
✅ 함수 사용 팁
함수는 보통 main() 함수 외부에서 정의
함수 선언은 main() 위에서 하거나 헤더 파일에 따로 분리 가능
반환값이 없으면 void 사용
함수 호출 시 전달 방식
| 방식 | 설명 | 예시 |
|---|---|---|
| 값에 의한 전달 | 복사본 전달 (원본 변경 ❌) | int add(int a, int b) |
| 참조에 의한 전달 | 주소값 전달 (원본 변경 가능 ⭕) | void change(int *p) |
배열 : 변수들의 집합
고차원 배열
포인터 : 데이터 주소값 보관하는 변수
서로 다른 데이터 타입을 하나의 그룹으로 묶을 수 있는 사용자 정의 자료형
//기본구조
struct 구조체이름 {
데이터형 멤버1;
데이터형 멤버2;
...
};
struct Student s1;
struct Student {
char name[20];
int age;
float grade;
} s1, s2;
strcpy(s1.name, "Alice");
s1.age = 20;
s1.grade = 4.3;
printf("%s, %d세, 학점: %.1f\n", s1.name, s1.age, s1.grade);
#include <stdio.h>
#include <string.h>
struct Student {
char name[20];
int age;
float grade;
};
int main() {
struct Student s1;
strcpy(s1.name, "홍길동");
s1.age = 22;
s1.grade = 3.9;
printf("이름: %s\n", s1.name);
printf("나이: %d\n", s1.age);
printf("성적: %.1f\n", s1.grade);
return 0;
}
struct Student students[3];
students[0].age = 21;
strcpy(students[0].name, "김철수");
요약
| 기능 | 문법 또는 키워드 |
|---|---|
| 구조체 정의 | struct |
| 멤버 접근 | . 또는 -> |
| 문자열 처리 | strcpy, strlen, ... |
| 포인터로 전달 | struct Type *ptr |
| 이름 간소화 | typedef 사용 |
구조체포인터
동적 메모리할당
링크드리스트
헤더파일
배열은 같은 자료형의 값들을 연속적으로 저장하는 변수들의 모음
int arr[5] = {10, 20, 30, 40, 50};
arr[0] → 첫 번째 요소
arr[4] → 다섯 번째 요소
int arr[5]; // 정수형 배열
char name[20]; // 문자형 배열 (문자열)
float scores[3]; // 실수형 배열
포인터는 변수의 메모리 주소를 저장하는 변수입니다.
int a = 10;
int *p = &a;
p는 a의 주소를 저장
*p는 a가 저장된 주소의 값을 참조 (간접 접근)
주요 연산자
| 연산자 | 의미 | 예시 |
|---|---|---|
& | 주소 연산자 | &a → 변수 a의 주소 |
* | 간접 참조 | *p → 포인터 p가 가리키는 값 |
배열 이름은 포인터처럼 행동함
int arr[3] = {1, 2, 3};
int *p = arr; // == &arr[0]
배열과 포인터 접근 비교
printf("%d\n", arr[1]); // 2
printf("%d\n", *(p + 1)); // 2
즉, arr[i] == *(arr + i)
포인터 배열 순회
int arr[3] = {10, 20, 30};
int *p = arr;
for (int i = 0; i < 3; i++) {
printf("%d\n", *(p + i));
}
포인터와 문자열
char *str = "Hello";
printf("%c\n", *(str + 1)); // e
이중 포인터
int a = 10;
int *p = &a;
int **pp = &p;
printf("%d\n", **pp); // 10
요약
| 개념 | 설명 |
|---|---|
| 배열 | 같은 자료형의 데이터 집합 |
| 포인터 | 변수의 주소를 저장하는 변수 |
arr[i] | *(arr + i)와 동일 |
| 포인터 순회 | *(p + i) 형태로 배열 접근 가능 |
| 문자열 | 문자 배열 = 포인터로 사용 가능 |
배열 포인터 차이점
| 구분 | 배열 | 포인터 |
|---|---|---|
| 크기 변경 | 불가능 (고정 크기) | 가능 (malloc 등 사용) |
| 주소 변경 | 불가능 (배열 이름은 상수) | 가능 (p = other_ptr) 가능 |
Ref
Chatgpt