C++/Chapter03. 함수와 문자열

lullaby ·2025년 10월 1일

C++

목록 보기
3/4
post-thumbnail

1️⃣ 함수의 기본 개념

핵심 개념

  • 함수: 특정 작업을 수행하는 코드 블록
  • 함수 선언: 함수의 이름, 매개변수, 반환형을 미리 정의
  • 함수 호출: 정의된 함수를 실행하는 과정

핵심 문법

// 함수 선언 (함수 원형)
반환타입 함수명(매개변수);

// 함수 정의
반환타입 함수명(매개변수) {
    // 함수 본체
    return;
}

// 함수 호출
결과 = 함수명(인수);

예제 코드

#include <iostream>
using namespace std;

// 함수 원형 선언
int max(int x, int y);

int main() {
    int result = max(10, 20);  // 함수 호출
    cout << "최댓값: " << result << endl;
    return 0;
}

// 함수 정의
int max(int x, int y) {
    if (x > y)
        return x;
    else
        return y;
}

2️⃣ 인수 전달 방법

핵심 개념

  1. 값으로 호출 (Call-by-Value)
    • 인수의 값이 매개변수로 복사됨
    • 원본 값은 변경되지 않음
  2. 참조로 호출 (Call-by-Reference)
    • 인수의 주소가 전달됨
    • 원본 값이 직접 변경됨

핵심 문법

// 값으로 전달
void func1(int x) {
    x = 100;  // 원본 변경 안됨
}

// 참조로 전달
void func2(int& x) {
    x = 100;  // 원본 변경됨
}

예제 코드 - swap 함수

#include <iostream>
using namespace std;

void swap(int& x, int& y) {
    int temp = x;
    x = y;
    y = temp;
}

int main() {
    int a = 100, b = 200;
    cout << "교환 전: a=" << a << ", b=" << b << endl;
    swap(a, b);
    cout << "교환 후: a=" << a << ", b=" << b << endl;
    return 0;
}

3️⃣ 중복 함수 (Function Overloading)

핵심 개념

  • 동일한 이름의 함수를 매개변수 타입이나 개수를 다르게 하여 여러 개 정의
  • 컴파일러가 호출 시 적절한 함수를 자동 선택

예제 코드

#include <iostream>
using namespace std;

int square(int i) {
    cout << "정수 제곱 함수 호출" << endl;
    return i * i;
}

double square(double i) {
    cout << "실수 제곱 함수 호출" << endl;
    return i * i;
}

void print(int i) { cout << "정수: " << i << endl; }
void print(double f) { cout << "실수: " << f << endl; }
void print(char c) { cout << "문자: " << c << endl; }

4️⃣ 디폴트 매개변수

핵심 개념

  • 함수 호출 시 인수가 전달되지 않으면 기본값을 사용
  • 마지막 매개변수부터 디폴트 값을 설정해야 함

핵심 문법

반환타입 함수명(타입 변수1, 타입 변수2 = 기본값, 타입 변수3 = 기본값);

예제 코드

#include <iostream>
using namespace std;

void display(char c = '*', int n = 10) {
    for (int i = 0; i < n; i++)
        cout << c;
    cout << endl;
}

int sum(int x, int y, int z = 0, int w = 0) {
    return x + y + z + w;
}

int main() {
    display();           // 모든 기본값 사용
    display('#');        // c='#', n=10(기본값)
    display('#', 5);     // 모든 값 지정

    cout << sum(10, 20) << endl;        // 30
    cout << sum(10, 20, 30) << endl;    // 60
    cout << sum(10, 20, 30, 40) << endl; // 100
    return 0;
}

5️⃣ 인라인 함수

핵심 개념

  • inline 키워드를 사용하여 함수 호출 오버헤드를 줄임
  • 컴파일러가 함수 코드를 호출 위치에 직접 삽입
  • 간단하고 자주 호출되는 함수에 적합

예제 코드

inline double square(double i) {
    return i * i;
}

inline int max(int a, int b) {
    return (a > b) ? a : b;
}

6️⃣ string 클래스

핵심 개념

  • C++에서 문자열을 다루기 위한 클래스
  • <string> 헤더 파일 포함 필요
  • 동적 크기 조정, 다양한 멤버 함수 제공

핵심 문법

#include <string>
using namespace std;

string s;                    // 빈 문자열 생성
string s = "Hello";          // 초기화
string s{"Hello"};           // 보편적 초기화

주요 연산자와 함수

// 문자열 연산
string s1 = "Hello";
string s2 = "World";
string s3 = s1 + " " + s2;   // 문자열 결합
s3 += "!";                   // 문자열 추가

// 문자열 비교
if (s1 == s2) { }            // 동등 비교
if (s1 > s2) { }             // 사전식 비교

// 주요 멤버 함수
s.length()                   // 문자열 길이
s.find("text")              // 부분 문자열 찾기
s[i]                        // i번째 문자 접근
getline(cin, s)             // 공백 포함 문자열 입력

예제 코드

#include <iostream>
#include <string>
using namespace std;

int main() {
    string name, address;

    cout << "이름을 입력하세요: ";
    cin >> name;
    cin.ignore();  // 버퍼 정리

    cout << "주소를 입력하세요: ";
    getline(cin, address);

    cout << address << "의 " << name << "씨 안녕하세요!" << endl;

    // 문자열 검색
    string text = "When in Rome, do as the Romans.";
    int pos = text.find("Rome");
    cout << "Rome의 위치: " << pos << endl;

    return 0;
}

🔥 예상 문제 및 실전 대비

📝 예상 문제 1: 함수 기본 (★★☆)

// 다음 코드의 출력 결과를 예측하시오
#include <iostream>
using namespace std;

int calculate(int a, int b = 5) {
    return a * b;
}

int main() {
    cout << calculate(3) << endl;
    cout << calculate(3, 2) << endl;
    return 0;
}

정답: 15, 6

해설: 첫 번째 호출에서는 b의 기본값 5가 사용되어 3×5=15, 두 번째 호출에서는 b=2가 전달되어 3×2=6


📝 예상 문제 2: 참조 전달 (★★★)

// 다음 코드를 완성하여 두 변수의 값을 교환하는 함수를 작성하시오
#include <iostream>
using namespace std;

void swap(_______ a, _______ b) {
    _______________________
    _______________________
    _______________________
}

int main() {
    int x = 10, y = 20;
    cout << "교환 전: x=" << x << ", y=" << y << endl;
    swap(x, y);
    cout << "교환 후: x=" << x << ", y=" << y << endl;
    return 0;
}

정답:

void swap(int& a, int& b) {
    int temp = a;
    a = b;
    b = temp;
}

📝 예상 문제 3: 중복 함수 (★★★)

// 다음과 같이 동작하는 중복 함수 print를 작성하시오
// print(100) → "정수: 100"
// print(3.14) → "실수: 3.14"
// print('A') → "문자: A"

#include <iostream>
using namespace std;

// 여기에 중복 함수들을 작성하시오
_________________________________
_________________________________
_________________________________

int main() {
    print(100);
    print(3.14);
    print('A');
    return 0;
}

정답:

void print(int i) {
    cout << "정수: " << i << endl;
}

void print(double f) {
    cout << "실수: " << f << endl;
}

void print(char c) {
    cout << "문자: " << c << endl;
}

📝 예상 문제 4: string 클래스 활용 (★★★)

// 사용자로부터 문자열을 입력받아 특정 문자의 개수를 세는 프로그램을 완성하시오
#include <iostream>
#include <string>
using namespace std;

int main() {
    string text;
    char target;
    int count = 0;

    cout << "문자열을 입력하세요: ";
    getline(cin, text);
    cout << "찾을 문자를 입력하세요: ";
    cin >> target;

    // 여기에 문자 개수를 세는 코드를 작성하시오
    _________________________________
    _________________________________
    _________________________________

    cout << "'" << target << "' 문자의 개수: " << count << endl;
    return 0;
}

정답:

for (int i = 0; i < text.length(); i++) {
    if (text[i] == target) {
        count++;
    }
}

또는:

for (char c : text) {
    if (c == target) {
        count++;
    }
}

📝 예상 문제 5: 해밍 거리 (★★★★)

// 두 DNA 문자열의 해밍 거리를 구하는 프로그램을 작성하시오
// 해밍 거리: 같은 위치에서 다른 문자의 개수

#include <iostream>
#include <string>
using namespace std;

int hammingDistance(string s1, string s2) {
    // 여기에 해밍 거리를 계산하는 코드를 작성하시오
    _________________________________
    _________________________________
    _________________________________
}

int main() {
    string dna1, dna2;
    cout << "DNA1: ";
    cin >> dna1;
    cout << "DNA2: ";
    cin >> dna2;

    if (dna1.length() != dna2.length()) {
        cout << "오류: 길이가 다릅니다." << endl;
    } else {
        int distance = hammingDistance(dna1, dna2);
        cout << "해밍 거리: " << distance << endl;
    }
    return 0;
}

정답:

int hammingDistance(string s1, string s2) {
    int count = 0;
    for (int i = 0; i < s1.length(); i++) {
        if (s1[i] != s2[i]) {
            count++;
        }
    }
    return count;
}

🎯 실전 대비 핵심 포인트

✅ 함수 관련 체크포인트

  1. 함수 원형 선언을 main() 함수 앞에 작성했는가?
  2. 참조 전달이 필요한 경우 & 연산자를 사용했는가?
  3. 중복 함수에서 매개변수 타입이 다른가?
  4. 디폴트 매개변수를 오른쪽부터 설정했는가?

✅ string 관련 체크포인트

  1. #include <string> 헤더를 포함했는가?
  2. 공백 포함 입력에는 getline()을 사용했는가?
  3. cingetline() 사용 시 cin.ignore()를 호출했는가?
  4. 문자열 길이length() 또는 size() 함수로 구했는가?

⚠️ 주의사항

  • 함수에서 지역변수는 함수 종료 시 소멸됨
  • 참조 전달 시 원본이 변경되므로 주의 필요
  • string 객체는 동적으로 크기가 변함
  • 배열 인덱스는 0부터 시작함

📖 추가 연습 문제

연습문제 1

팩토리얼을 계산하는 함수를 작성하고, 중복 함수로 int와 long long 타입을 모두 처리하도록 하시오.

연습문제 2

문자열에서 모든 공백을 제거하는 함수를 작성하시오.

연습문제 3

두 문자열이 애너그램(같은 글자로 구성되었지만 순서가 다른 단어)인지 판별하는 함수를 작성하시오.

0개의 댓글