24.12.23 언리얼 cpp 기초 복습

alwaysyoung2 ㅣ 2024. 12. 23. 21:26

getter 와 setter에 대한 내용입니다.

#include <iostream>
#include <algorithm> //max 함수 사용
#include <string>

using namespace std;

class Student
{
public:
    //동작 정의(이를 멤버함수라고 합니다)
    double getAvg();
    int getMaxScore();

    void setMathScore(int math)
    {
        this->math = math;
    }
    void setEngScore(int eng)
    {
        this->eng = eng;
  
    }
    void setKorScore(int kor)
    {
        this->kor = kor;
    }

    int  getMathScore() { return math; }
    int  getEngScore() { return eng; }
    int  getKorScore() { return kor; }

private:
    //데이터 정의(이를 멤버변수라고 합니다.)
    int kor;
    int eng;
    int math;
};

double Student::getAvg()
{
    return (kor + eng + math) / 3.0;
}

int Student::getMaxScore()
{
    return max(max(kor, eng), math);
}

int main()
{
    Student s;

    //점수 입력(변수로 해도 되지만 간단히 
    s.setEngScore(32);
    s.setKorScore(52);
    s.setMathScore(74);

    //평균 최대점수 출력
    cout << s.getAvg() << endl;
    cout << s.getMaxScore() << endl;

    return 0;
}

 

 

기본생성자?

#include <iostream>
using namespace std;

class Person {
public:
    string name;
    int age;

    // 기본 생성자
    Person() {
        name = "Unknown";
        age = 0;
    }

    void display() {
        cout << "Name: " << name << ", Age: " << age << endl;
    }
};

int main() {
    Person p; // 기본 생성자 호출
    p.display();
    return 0;
}

 

 

매개변수가 있는 생성자?

#include <iostream>
using namespace std;

class Person {
public:
    string name;
    int age;

    // 매개변수가 있는 생성자
    Person(string n, int a) {
        name = n;
        age = a;
    }

    void display() {
        cout << "Name: " << name << ", Age: " << age << endl;
    }
};

int main() {
    Person p("Alice", 25); // 매개변수가 있는 생성자 호출
    p.display();
    return 0;
}

 

매개 변수를 설정하기 않아도 기본 매개변수 존재하는 생성자?

#include <iostream>
using namespace std;

class Person {
public:
    string name;
    int age;

    // 기본 매개변수가 있는 생성자
    Person(string n = "DefaultName", int a = 18) {
        name = n;
        age = a;
    }

    void display() {
        cout << "Name: " << name << ", Age: " << age << endl;
    }
};

int main() {
    Person p1;              // 기본값 사용
    Person p2("Bob", 30);   // 값을 지정
    p1.display();
    p2.display();
    return 0;
}

 

하지만 잘못된 매개변수를 전달하면 에러발생

#include <iostream>
using namespace std;

class Person {
public:
    string name;
    int age;

    // 매개변수가 있는 생성자
    Person(string n, int a) {
        name = n;
        age = a;
    }
};

int main() {
    Person p("Tom"); // 에러: 생성자에 필요한 매개변수 부족
    // 컴파일 에러: "no matching function for call to 'Person::Person(const char [4])'"
    // 매개변수 두 개를 요구하는 생성자에 하나의 매개변수만 전달하여 매칭되지 않음
    p.display();
    return 0;
}

 

선언만 하고 정의를 하지 않았을경우

#include <iostream>
using namespace std;

class Person {
public:
    string name;
    int age;

    // 생성자를 선언만 하고 정의하지 않음
    Person(string n, int a);
};

int main() {
    Person p("Alice", 25); // 선언된 생성자의 정의가 없으므로 컴파일 에러 발생
    cout << "Name: " << p.name << ", Age: " << p.age << endl;
    return 0;
}

 

헤더파일에 class 정의하기

 

헤더파일에 새항목을 추가하여 student_h라는 이름으로 생성해보겠습니다 그 후 아래와 같은 내용추가

#ifndef STUDENT_H_
#define STUDENT_H_
class Student
{
public:
    //값이 주어지지 않을경우 기본값을 할당하는 생성자
    Student(int math = 32, int eng = 17, int kor = 52)
    {
        this->math = math;
        this->eng = eng;
        this->kor = kor;
    }
    double getAvg();
    int getMaxScore();

    //동작 정의(이를 멤버함수라고 합니다)
    void setMathScore(int math)
    {
       this->math = math;
    }
    void setEngScore(int eng)
    {
        this->eng = eng;
    }
    void setKorScore(int math)
    {
      this->math = math;
    }

    int  getMathScore() { return math; }
    int  getEngScore() { return eng; }
    int  getKorScore() { return kor; }

private:
    //데이터 정의(이를 멤버변수라고 합니다.)
    int kor;
    int eng;
    int math;
};
#endif

class를 헤더 파일에 정의할 때 가장 중요한 것은 class가 중복 선언되지 않게 하는 것 입니다. 내가 만든 헤더 파일을 여러 파일에서 사용 하다 보면 class가 여러번 정의 될 수 있습니다. 이를 방지 하기 위해서 #ifndef 구문을 활용 합니다. 코드를 보고 의미를 한번 알아보겠습니다.

#ifndef STUDENT_H_ 의 의미는 STUDENT_H_가 정의 되어 있지 않은 경우에만 아래 코드를 수행하라는 의미 입니다.

 

 2️⃣

#define STUDENT_H_는 STUDENT_H_를 정의합니다. #ifndef일 때만 #define이 수행되므로 단 한번만 수행 될 수 있습니다.

 

3️⃣

#ifndef가 끝났다는 것을 알려주기 위해 #endif를 작성 합니다.

4️⃣

최종적으로 Student Class는 중복 정의 될수 없게 됩니다

 

Student class를 헤더파일에 정의(Student.cpp)

#include "Student.h"
#include <algorithm> // max 함수

using namespace std;

double Student::getAvg()
{
    return (kor + eng + math) / 3.0;
}

int Student::getMaxScore()
{
    return max(max(kor, eng), math);
}

이렇게 하면 메인 함수에서 깔끔하게 사용이 가능합니다.

 

메인함수

#include <iostream>
#include "Student.h"

using namespace std;

int main()
{
    Student s;
    Student s2(1);
    Student s3(1,2);
    Student s4(32,52,74);

    //평균 최대점수 출력
    cout << s.getAvg() << endl;
    cout << s.getMaxScore() << endl;

    return 0;
}