
게임 프로젝트는 한번 완성된 프로젝트는 계속해서 사용되는 경우가 많다
그래서 처음 코드를 잘 구현하는 것이 좋다
위를 보면 요구사항, 디자인 및 설계, 구현 단계, 테스트 단계, 유지보수 단계 이렇게 순서로 있다
Time Required for Fixing Issues Across Development Stages 란 이 단계를 하는데 걸리는 시간을 뜻한다
즉 유지보수 단계에서 가장 많은 시간이 필요로 하는 것이다
그래서 우리는 최대한 요구사항과 디자인 설계 단계에서 정확하고 잘 코드를 짜야 한다.
= C++ 의 객체지향 프로그램
객체 없이 성적 관리 프로그램 만들기

#include <iostream>
#include <string>
using namespace std;
//3 과목의 평균을 구하는 함수_이해완료
double getAvg(int kor, int eng, int math)
{
return (kor + eng + math ) / 3.0f;
}
//두 개 수를 받아서 큰수 반환
int maxNum(int num1, int num2)
{
if(num1 >= num2) return num1;
else return num2;
}
//3과목중 가장 높은 점수를 반환하는 함수
int getMax(int kor, int eng, int math)
{
return maxNum( maxNum(kor, eng), math);
}
int main()
{
int kor[3];
int eng[3];
int math[3];
//점수 입력
for(int i = 0 ; i < 3; i++)
{
cin >> kor[i] >> eng[i] >> math[i];
}
//각 학생의 평균 점수와 과목 최대 점수를 출력
for(int i = 0 ; i < 3; i++)
{
cout << getAvg(kor[i], eng[i], math[i]) << endl;
cout << getMax(kor, eng, math) << endl;
}
return 0;
}
maxNum을 두번 사용하는 이유 : maxNum은 두번밖에 사용하지 못하는 함수이기에
국어랑 영어 중에 큰거 하나 반환한뒤 수학이랑 비교해서 가장 높은 점수의 과목을 찾는것
위 코드의 문제점
- 과목의 종류가 늘어나면 getAvg 의 인자가 늘어나게 됨
- 원래 kor [i] , eng [i] , math [i] 이렇게 세개였는데 여기서 하나 더 늘어나게 되면 다른 것들이 다 바뀜
== 재사용성이 떨어짐
kor, eng, math 라는 변수가 사용자에게 노출됨으로서 버그의 위험이 있다.
class의 정의
class를 한마디로 정의하면 '자동차'와 같다.
우리는 페달을 밟아야 자동차가 나아가고 브레이크를 밟아야 자동차가 멈춘다는 것은 알고있지만
그 브레이크가 어느 브랜드 것인지, 그 페달이 어느 브랜드 것인지는 알지 못해도 운전을 할 수 있다. (사용자)
하지만 (제작자) 는 그 브레이크가 어디 것인지, 그 페달이 어디것인지 암으로써 같은 자동차를 만들수 있다
== class는 동작을 공개하고 세부 데이터는 공개하지 않는다 , 즉 변화에 유연하게 대처한다
class로 학생 클래스 만들기

클래스 안에 내부 구현
#include <iostream>
using namespace std;
// 클래스 함수 정의해주고 clas 그 안에 내부구현
class Student
{
//동작 정의(이를 멤버함수라고 합니다)
double getAvg() {
return (kor + eng + math) / 3.0f;
};
int getMaxNum() {
return max(max(kor, eng), math);
};
//데이터 정의(이를 멤버변수라고 합니다.)
int kor[3];
int eng[3];
int math[3];
};
클래스 안에 외부 구현
#include <iostream>
using namespace std;
//class 외부에 구현
class Student
{
//동작 정의(이를 멤버함수라고 합니다)
double getAvg();
int getMaxNum();
//데이터 정의(이를 멤버변수라고 합니다.)
int kor;
int eng;
int math;
};
double Student::getAvg()
{
return (kor + eng + math) / 3.0;
}
int Student::getMaxNum()
{
return max({ kor, eng, math });
}
class는 기본적으로 내부에 있는 데이터를 공개하지 않는 것이 원칙이다,
즉, class는 외부에 구현하는 것을 우선시 한다.
또한 class는 접근을 하지 못하는 것을 원칙으로 함
getter와 setter
#include <iostream>
#include <algorithm> //max 함수 사용
#include <string>
using namespace std;
//public과 private로 접근제어
class Student
{
public:
double getAvg();
int getMaxScore();
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.getAvg();
return 0;
}
이 코드를 보면 국어점수, 영어점수, 수학점수가 private로 접근을 제어 당하고 있다. 하지만 우리는 이 변수들 (국영수 점수) 를 제어할 필요가 있다. 그 이유는 이 변수들이 있어야 평균과 최대점수를 구할때 이 점수들이 있어야 하기 때문이다.
하지만 이 점수들이 필요하다 해서 private로 되어있던 변수들을 public으로 바꿀 수 없다.
이 때에 우리는 getter와 setter 함수를 사용한다.
#include <iostream>
#include <algorithm> //max 함수 사용
#include <string>
using namespace std;
class Student
{
public:
//동작 정의(이를 멤버함수라고 합니다)
double getAvg();
int getMaxScore();
//setter 함수들
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;
}
코드를 보며 해석하면은 getter 함수들은 get 붙고 앞에 멤버 변수들을 반환한다.
이는 getMathScore의 값이 변하더라도 private에 있는 멤버변수들 math, eng, kor의 값들은 변하지 않는다는 것을 뜻한다.
getter와 setter는 클래스에서 멤버 변수에 대한 **읽기(get)**와 **쓰기(set)**를 제공하는 멤버 함수다. 데이터를 직접 수정하지 않고, 함수로 접근함으로써 **캡슐화(encapsulation)**를 유지하고 안전하게 데이터를 다룰 수 있다
setter함수에서 this는 이 클래스 내부에 있는것들을 말한다.

생성자
생성자는 객체가 생성될 때 한번 호출 됩니다.
보통 필요한 멤버 변수를 초기화 하거나 객체가 동작할 준비를 하기 위해 사용합니다.
생성자는 반환형이 없고, class이름과 같은 함수 형태입니다.
#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;
}
회고
class 에서부터 갑자기 난이도가 업그레이드 된 것 같다.
이해가 되긴 되었는데 클래쓰 개념 아직 낯설고 조금 어려움 ,,
'언리얼 엔진 부트캠프 > TIL' 카테고리의 다른 글
| [DAY 11] 자원 관리 (1) | 2024.12.31 |
|---|---|
| [DAY10] 객체 지향 프로그래밍 (1) | 2024.12.30 |
| [DAY8] 판단을 해주는 조건문 (0) | 2024.12.27 |
| [DAY7] GIT 특강 + 반복 작업을 줄여주는 함수 (0) | 2024.12.27 |
| [DAY6] c++ 시작 (0) | 2024.12.27 |