728x90
💻 4강: 함수
🟢 프로그램 실행 흐름
- 프로그램이 실행되면 main() 함수가 먼저 실행됩니다.
- main() 함수가 종료되면 프로그램도 종료됩니다.
🟢 증감연산자 사용법
- 특별한 이유가 없다면 전위형(++변수)을 사용하는 것이 권장됩니다.
🟢 반복문 사용법
🔎 For문
for (초기값; 유지조건; 반복자 변경) {
// 실행할 코드
}
for (int i = 0; i < 10; ++i) {
printf("output test\n");
continue; // 이후 코드 건너뛰고 다음 반복으로
break; // 반복문 종료
}
🔎 While문
while (유지 조건) {
// 실행할 코드
}
🖥️ 함수 – 콘솔창 printf(), scanf()
🔎 전처리
- #include를 사용해 헤더 파일을 포함하여 기능을 확장합니다.
#include <stdio.h>
🔎 콘솔 출력 (printf())
printf("출력할 내용");
✅ 서식 지정자 (Format Specifiers)
서식 지정자 | 설명 | 예시 (printf() 출력) |
%d | 정수 (10진수) | printf("%d", 123); → 123 |
%i | 정수 (10진수) | printf("%i", 123); → 123 |
%u | 부호 없는 정수 (10진수) | printf("%u", 123); → 123 |
%o | 8진수 | printf("%o", 83); → 123 |
%x | 16진수 (소문자) | printf("%x", 255); → ff |
%X | 16진수 (대문자) | printf("%X", 255); → FF |
%f | 실수 (소수점 형태) | printf("%.2f", 3.14159); → 3.14 |
%e | 지수 표기법 (소문자) | printf("%e", 123.45); → 1.234500e+02 |
%E | 지수 표기법 (대문자) | printf("%E", 123.45); → 1.234500E+02 |
%g | 자동으로 소수점/지수 표기 | printf("%g", 123.45); → 123.45 |
%G | g의 대문자 버전 | printf("%G", 123.45); → 123.45 |
%c | 문자 (char) | printf("%c", 'A'); → A |
%s | 문자열 (char 배열) | printf("%s", "Hello"); → Hello |
%% | 퍼센트 기호 출력 | printf("%%"); → % |
%p | 포인터 주소 출력 | printf("%p", ptr); → 0x7ffdabcd1234 |
✅ 이스케이프 시퀀스 (Escape Sequences)
이스케이프 시퀀스 | 설명 | 예시 (printf() 출력) |
\n | 개행 (줄 바꿈) | printf("Hello\nWorld"); → HelloWorld |
\t | 탭 | printf("A\tB"); → A B |
\\ | 백슬래시 출력 | printf("\\"); → \ |
\" | 큰따옴표 출력 | printf("\"Hello\""); → "Hello" |
\' | 작은따옴표 출력 | printf("\'Hello\'"); → 'Hello' |
\r | 캐리지 리턴 (커서 맨 앞으로 이동) | printf("Hello\rWorld"); → World |
\b | 백스페이스 (이전 문자 삭제) | printf("AB\bC"); → AC |
\f | 폼 피드 (새 페이지) | 사용 거의 없음 |
\v | 수직 탭 | printf("A\vB"); → AB |
\a | 경고음 (벨 소리) | 소리 발생 (환경에 따라 다름) |
\0 | 널 문자 (문자열 끝) | 사용자가 직접 확인 어려움 |
🔎 콘솔 입력 (scanf())
scanf("%d", &변수);
1. 기본 데이터형 서식 지정자
서식 지정자 | 데이터형 | 설명 및 예시 |
%d | int | 정수(10진수)를 입력받습니다. 예시: scanf("%d", &a); |
%u | unsigned int | 부호 없는 정수(10진수)를 입력받습니다. 예시: scanf("%u", &b); |
%ld | long | 긴 정수를 입력받습니다. 예시: scanf("%ld", &c); |
%lu | unsigned long | 부호 없는 긴 정수를 입력받습니다. 예시: scanf("%lu", &d); |
%lld | long long | 매우 긴 정수를 입력받습니다. 예시: scanf("%lld", &e); |
%llu | unsigned long long | 부호 없는 매우 긴 정수를 입력받습니다. 예시: scanf("%llu", &f); |
%o | int | 8진수를 입력받습니다. 예시: scanf("%o", &g); |
%x | int | 16진수(소문자)를 입력받습니다. 예시: scanf("%x", &h); |
%X | int | 16진수(대문자)를 입력받습니다. 예시: scanf("%X", &i); |
2. 실수형 서식 지정자
서식 지정자 | 데이터형 | 설명 및 예시 |
%f | float | 소수점 형태의 실수를 입력받습니다. 예시: scanf("%f", &x); |
%lf | double | 배정밀도 실수를 입력받습니다. 예시: scanf("%lf", &y); |
%Lf | long double | 확장 배정밀도 실수를 입력받습니다. 예시: scanf("%Lf", &z); |
%e | float | 지수 표기법(소문자)를 사용한 실수를 입력받습니다. 예시: scanf("%e", &x); |
%E | float | 지수 표기법(대문자)를 사용한 실수를 입력받습니다. 예시: scanf("%E", &x); |
3. 문자 및 문자열 서식 지정자
서식 지정자 | 데이터형 | 설명 및 예시 |
%c | char | 단일 문자를 입력받습니다. 예시: scanf("%c", &ch); |
%s | char[] | 공백 전까지 문자열을 입력받습니다. 예시: scanf("%s", str); |
%[ ] | char[] | 지정한 문자 집합에 해당하는 문자만 입력받습니다. 예시: scanf("%[A-Z]", str); (예: "HELLO123" 입력 시 → "HELLO"만 입력됨) |
4. 기타 서식 지정자
서식 지정자 | 데이터형 | 설명 및 예시 |
%p | void* | 포인터 주소를 입력받습니다. 예시: scanf("%p", &ptr); |
%n | int* | 지금까지 읽은 문자 수를 저장합니다. 예시: scanf("%d%n", &x, &count); |
%% | 없음 | 퍼센트 기호 자체를 입력받습니다. 예시: scanf("%%"); |
✅ 추가 설명
내용 | 설명 및 예시 |
공백 처리 | %c나 %s는 공백 및 개행 문자를 처리하지 않으므로 입력 전에 " "나 "\n"을 추가하여 공백을 무시합니다. 예시: scanf(" %c", &ch); |
버퍼 문제 해결 | 입력 후 버퍼에 남은 개행 문자(\n)는 fflush(stdin) 또는 getchar()로 제거합니다. 예시: cpp<br>scanf("%d", &a);<br>getchar(); // 개행 문자 제거<br>scanf("%c", &ch);<br> |
배열 입력 시 주의점 | %s는 공백 전까지만 입력받으므로, 여러 단어 입력 시 fgets() 또는 scanf("%[^\n]s", str);를 사용합니다. 예시: scanf("%[^\n]s", str); |
✅ 추가 설명
- 공백 처리
- %c나 %s는 공백이나 개행 문자를 무시하지 않으므로, 입력 전에 " "나 "\n"을 추가하여 처리합니다.
- 예시: scanf(" %c", &ch);
- %c나 %s는 공백이나 개행 문자를 무시하지 않으므로, 입력 전에 " "나 "\n"을 추가하여 처리합니다.
- 버퍼 문제 해결
- 입력 후 남은 개행 문자는 fflush(stdin)이나 getchar()로 제거합니다.
- 예시:
- scanf("%d", &a); getchar(); // 버퍼의 개행 문자 제거 scanf("%c", &ch);
- 입력 후 남은 개행 문자는 fflush(stdin)이나 getchar()로 제거합니다.
- 배열 입력 시 주의점
- %s는 공백 전까지만 입력받으므로, 여러 단어를 입력받으려면 fgets() 또는 scanf("%[^\n]s", str);를 사용합니다.
- 예시: scanf("%[^\n]s", str);
- %s는 공백 전까지만 입력받으므로, 여러 단어를 입력받으려면 fgets() 또는 scanf("%[^\n]s", str);를 사용합니다.
📂 자료구조 (Data Structure)
자료구조란?
- 데이터를 어떤 방식으로 정리하고 효율적으로 다룰지를 고민하는 학문입니다.
🌟 주요 자료구조
🥞 스택 (Stack)
- 후입선출 (LIFO, Last In First Out) 구조를 가집니다.
- 예시 사용처 📞
- 함수 호출 관리
- 괄호 검사
- 되돌리기 기능
🚶 큐 (Queue)
- 선입선출 (FIFO, First In First Out) 구조를 가집니다.
- 예시 사용처
- 프린터 대기열
- BFS(너비 우선 탐색)
🔄 재귀 함수 (Recursive Function)
📌 재귀 함수란?
- 자기 자신을 호출하는 함수입니다.
- 주로 트리 탐색, 피보나치 수열, 팩토리얼 계산 등에 사용됩니다.
- 기본적으로 탈출 조건(Base Case)이 필요합니다.
✅ 피보나치 수열 (Fibonacci Sequence) 구현
#include <iostream>
using namespace std;
// 재귀 함수로 피보나치 수열 계산 🔄
int fibonacci(int n) {
if (n <= 1) {
return n; // F(0) = 0, F(1) = 1
}
return fibonacci(n - 1) + fibonacci(n - 2);
}
int main() {
int n;
cout << "피보나치 수열의 n번째 항을 입력하세요: ";
cin >> n;
cout << "피보나치 수열의 " << n << "번째 항: " << fibonacci(n) << endl;
return 0;
}
- 시간 복잡도: O(2ⁿ) (비효율적)
✅ 팩토리얼 (Factorial) 구현
#include <iostream>
using namespace std;
// 재귀 함수로 팩토리얼 계산 🔄
int factorial(int n) {
if (n <= 1) {
return 1; // 0! = 1, 1! = 1
}
return n * factorial(n - 1);
}
int main() {
int n;
cout << "팩토리얼을 계산할 값을 입력하세요: ";
cin >> n;
cout << n << "! = " << factorial(n) << endl;
return 0;
}
- 시간 복잡도: O(n) (효율적)
📌 재귀함수 정리
- 재귀 함수는 자기 자신을 호출하며, 문제를 작은 단위로 나누어 해결합니다.
- 탈출 조건 (Base Case)이 필수이며, 없으면 무한 루프가 발생합니다.
- 호출 스택 (Call Stack)을 사용하며, 호출된 함수는 스택에 쌓이고, 종료 후 제거됩니다.
- 재귀 함수는 오버헤드가 발생할 수 있으므로, 반복문으로 대체하는 것이 성능 면에서 유리할 수 있습니다.
'C++ > 유튜브 어소트락 게임아카데미 C++무료강의' 카테고리의 다른 글
6. 구조체(Structure) (0) | 2025.03.30 |
---|---|
5. 배열 (0) | 2025.03.26 |
3. 연산자 및 전처리 구문 (0) | 2025.03.24 |
2. 자료형 (0) | 2025.03.17 |
C언어/C++ 무료강의 - 1_인트로 (0) | 2025.03.14 |