👉 프로그래밍을 하다 보면 반복적으로 사용되는 코드나 논리적으로 하나로 묶이는 코드가 있다. 이런 코드를 이름을 붙여 정의하고 가져다 쓰는 방식으로 구현하면 코드라 깔끔해지고 재사용성이 높아진다.
이렇게 작업을 정의하고 이름을 붙이는 문법을 함수라고 합니다.
아래 그림처럼 코드가 반복되는 경우에는 설계가 수정되면 모든 코드를 하나씩 다 수정해야 하지만, 함수를 정의하고 호출하는 방식으로 함수만 변경하면 됩니다.
즉 가독성 및 재사용성이 향상된다.

C++에서 일반적인 변수(값 타입 변수)는 값을 복사하여 함수로 전달된다.
따라서 함수 내부에서 값을 변경해도 원본 변수의 값은 변경되지 않는다.
C++에서 변수의 주소값을 함수에 전달하면, 해당 변수에 접근할 수 있게 된다. 따라서 함수가 종료가 된 이후에도 해당 주소의 변수는 값이 수정되어 있다.
C++에서 배열의 주소값을 함수에 전달하면, 해당 배열에 접근 할수 있게 된다. 따라서 함수가 종료가 된 이후에도 해당 배열의 값이 수정되어 있다.
(포인터의 원리를 생각해 보면 변수를 전달하는 경우와 동일하다.)
#include <iostream>
using namespace std;
// 함수: 포인터를 사용한 값 변경
void modeifyArr(char* ptr) {
ptr[0] = 'X'; // 포인터가 가리키는 변수의 값을 변경
}
int main() {
char str[4] = {'A', 'B', 'C', 'D'};
modeifyArr(str); // num의 주소 전달
cout << "포인터 전달 후 str[0] = " << str[0] << endl;
// 출력: 포인터 전달 후 str[0] = X
return 0;
}
참조자로 값을 전달하면, 함수 내부에서 값을 변경할 때, 원본 변수의 값도 변경된다.
#include <iostream>
using namespace std;
// 함수: 참조를 사용한 값 변경
void modifyValueByReference(int& x) {
x = 200; // 참조를 사용하여 원본 값 변경
}
int main() {
int num = 50;
modifyValueByReference(num); // 참조 전달
cout << "참조 전달 후 num: " << num << endl;
// 출력: 참조 전달 후 num: 200
return 0;
}
조건문을 통해 특정 조건을 명시하고 해당 조건이 참 혹은 거짓인 경우를 원하는 코드를 실행할 수 있다.
if / if-else / if-else if-else 와 같은 표현이 가능하다.
#include <iostream>
using namespace std;
int main() {
int score;
cout << "Enter your score: ";
cin >> score;
// 조건: 0 <= score <= 100
if (score >= 0 && score <= 100) {
if (score >= 90) {
cout << "Grade: A\n";
} else if (score >= 80) {
cout << "Grade: B\n";
} else if (score >= 70) {
cout << "Grade: C\n";
} else if (score >= 60) {
cout << "Grade: D\n";
} else {
cout << "Grade: F\n";
}
} else {
cout << "Invalid score. Please enter a value between 0 and 100.\n";
}
return 0;
}
#include <iostream>
using namespace std;
int main() {
string weather;
int temperature;
cout << "Enter weather (sunny/rainy): ";
cin >> weather;
cout << "Enter temperature: ";
cin >> temperature;
// 조건: 맑은 날씨(sunny)이고 온도가 20도 이상일 때 외출
if (weather == "sunny" && temperature >= 20) {
cout << "It's a nice day to go out!\n";
}
// 조건: 비가 오거나 너무 추운 날씨
else if (weather == "rainy" || temperature < 10) {
cout << "Better stay indoors.\n";
}
// 나머지 경우
else {
cout << "You can go out, but dress appropriately.\n";
}
return 0;
}
반복의 범위가 명확하게 주어지는 상황이 있다.
예를 들어, 5번 반복해라 혹은 i라는 변수를 선언하고 i가 0부터 시작해서 5가 되기 전까지 반복하는 경우가 있다.
이때 for 문을 많이 사용한다.
for 문의 전체적인 동작은 다음과 같다.
초기화 과정은 한 번만 하고,
이후에 종료 조건 확인 → 동작 → 사후 동작 → 종료 조건 확인 순으로 반복된다.
반복은 종료 조건을 만족할 때까지 계속된다.
#include <iostream>
using namespace std;
int main() {
int sum = 0; // 합을 저장할 변수 초기화
for (int i = 1; i <= 10; i++) { // 초기화: i = 1
// 종료 조건: i <= 10
// 사후 동작: i++
sum += i; // 실제 동작: sum에 i를 더함
}
cout << "Sum: " << sum << endl; // 출력: 합계 출력
// 출력값: Sum: 55
return 0;
}
반복 범위가 명확한 경우보다, 특정 조건만 확인하며 반복해야 하는 경우가 있다.
이럴 때는 while 문을 사용하면 코드가 깔끔해진다..
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
int main() {
srand(time(0)); // 랜덤 시드 초기화
int secretNumber = rand() % 100 + 1; // 1부터 100 사이의 랜덤 숫자
int guess;
cout << "Guess the number (1 to 100): ";
cin >> guess; // 초기 동작: 첫 번째 추측 입력 받기
while (guess != secretNumber) { // 종료 조건: 추측이 정답과 다를 경우 반복
if (guess < secretNumber) {
cout << "Too low! Try again: ";
} else {
cout << "Too high! Try again: ";
}
cin >> guess; // 사후 동작: 새로운 추측 입력 받기
}
cout << "Congratulations! You guessed the number!" << endl;
// 출력 예시:
// Guess the number (1 to 100): 50
// Too low! Try again: 75
// Too high! Try again: 60
// Congratulations! You guessed the number!
return 0;
}
사용자로부터 정수를 입력받아, 해당 크기에 맞는 다이아몬드 모양을 *로 출력하는 프로그램을 작성하시오.
예시 입출력은 아래와 같습니다.
# 예시 1
입력:
4
출력:
*
***
*****
*******
*****
***
*
# 예시 2
입력:
2
출력:
*
***
*
# 예시 3
입력:
5
출력:
*
***
*****
*******
*********
*******
*****
***
*
#include <iostream>
using namespace std;
int main()
{
int num;
cout << "숫자를 입력하세요 : ";
cin >> num;
int i = 0;
for (i = 0; i < num; i++)
{
for (int j = 0; j < num - i; j++) {
cout << " ";
}
for (int j = 0; j < i * 2 - 1; j++) {
cout << "*";
}
cout << endl;
}
for (i-1 ; i > 0; i--)
{
for (int j = 0; j < num - i; j++) {
cout << " ";
}
for (int j = 0; j < i * 2 - 1; j++) {
cout << "*";
}
cout << endl;
}
return 0;
}