오늘은 C++의 Class 개념에 대해 학습했다.
객체지향 프로그래밍에서 가장 기본이 되는 개념이라 정리를 해본다.
1. 객체 없이 성적 관리 프로그램 만들기
먼저 class 없이 성적 관리 프로그램을 만들어 볼 수 있다.
예를 들어 학생의 국어, 영어, 수학 점수를 가지고 평균과 최대 점수를 구하는 프로그램이다.
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;
}
int getMax(int kor, int eng, int math)
{
return maxNum( maxNum(kor, eng), math);
}
이 방식은 동작 자체는 문제없이 수행된다.
하지만 문제가 있다.
문제점
1️⃣ 과목이 늘어나면 함수 인자가 계속 증가한다
예를 들어 과목이 3개에서 5개로 늘어나면 모든 함수의 인자를 수정해야 한다.
2️⃣ 데이터가 외부에 그대로 노출된다
학생 데이터와 로직이 분리되지 않아 유지보수가 어렵다.
즉, 코드의 재사용성이 낮아지고 유지보수가 어려워진다.
이 문제를 해결하기 위해 객체지향 프로그래밍을 사용한다.
2. class의 정의
class는 데이터와 동작을 하나로 묶는 구조이다.
학생을 예로 들면 다음과 같이 표현할 수 있다.
class Student
{
double getAvg();
int getMaxNum();
int kor;
int eng;
int math;
};
class는 크게 두 가지로 구성된다.
1️⃣ 멤버 함수 (Member Function)
객체가 수행할 수 있는 동작
예
- 평균 계산
- 최고 점수 계산
2️⃣ 멤버 변수 (Member Variable)
객체가 가지고 있는 데이터
예
- 국어 점수
- 영어 점수
- 수학 점수
즉 class는
데이터 + 기능을 하나로 묶는 구조
라고 볼 수 있다.
3. class 내부 구현
멤버 함수는 두 가지 방식으로 구현할 수 있다.
1️⃣ 클래스 내부에서 구현
class Student
{
public:
double getAvg()
{
return (kor + eng + math) / 3.0;
}
int getMax()
{
return max(max(kor, eng), math);
}
private:
int kor;
int eng;
int math;
};
2️⃣ 클래스 외부에서 구현
class Student
{
public:
double getAvg();
int getMaxNum();
private:
int kor;
int eng;
int math;
};
double Student::getAvg()
{
return (kor + eng + math) / 3.0;
}
int Student::getMaxNum()
{
return max(max(kor, eng), math);
}
Student:: 는
Student 클래스의 멤버 함수라는 의미이다.
4. 접근 제어자 (Access Specifier)
class에서는 접근 제어자를 통해 멤버 접근을 제한할 수 있다.
대표적인 접근 제어자
- public
- private
- protected
예시
class Student
{
public:
double getAvg();
int getMaxScore();
private:
int kor;
int eng;
int math;
};
public
외부에서 접근 가능
Student s;
s.getAvg();
private
클래스 내부에서만 접근 가능
외부에서 접근하면 컴파일 에러가 발생한다.
s.kor = 100; // 에러
C++에서 class는 기본 접근 제한이 private이다.
5. getter와 setter
private 변수는 외부에서 직접 접근할 수 없다.
이때 사용하는 방법이 getter와 setter이다.
setter
값을 설정할 때 사용
void setMathScore(int math)
{
this->math = math;
}
getter
값을 가져올 때 사용
int getMathScore()
{
return math;
}
사용 예시
Student s;
s.setEngScore(32);
s.setKorScore(52);
s.setMathScore(74);
cout << s.getAvg() << endl;
cout << s.getMaxScore() << endl;
이 방식의 장점은 데이터를 안전하게 관리할 수 있다는 것이다.
6. 생성자 (Constructor)
생성자는 객체가 생성될 때 자동으로 호출되는 함수이다.
특징
- 반환형이 없다
- 클래스 이름과 동일하다
기본 생성자
class Person
{
public:
string name;
int age;
Person()
{
name = "Unknown";
age = 0;
}
};
객체 생성 시 자동으로 호출된다.
Person p;
매개변수가 있는 생성자
Person(string n, int a)
{
name = n;
age = a;
}
사용
Person p("Alice", 25);
기본값이 있는 생성자
Person(string n = "DefaultName", int a = 18)
{
name = n;
age = a;
}
사용
Person p1;
Person p2("Bob", 30);
7. Student 클래스에 생성자 적용
class Student
{
public:
Student(int math, int eng, int kor)
{
this->math = math;
this->eng = eng;
this->kor = kor;
}
double getAvg();
int getMaxScore();
private:
int kor;
int eng;
int math;
};
객체 생성 시 바로 점수를 초기화할 수 있다.
Student s(32, 52, 74);
8. class 파일 분리 (header / source)
실제 프로젝트에서는 클래스를 파일로 분리해서 사용한다.
Student.h
#ifndef STUDENT_H_
#define STUDENT_H_
class Student
{
public:
Student(int math = 32, int eng = 17, int kor = 52);
double getAvg();
int getMaxScore();
private:
int kor;
int eng;
int math;
};
#endif
Student.cpp
#include "Student.h"
#include <algorithm>
double Student::getAvg()
{
return (kor + eng + math) / 3.0;
}
int Student::getMaxScore()
{
return max(max(kor, eng), math);
}
main.cpp
#include <iostream>
#include "Student.h"
int main()
{
Student s(32,52,74);
cout << s.getAvg() << endl;
cout << s.getMaxScore() << endl;
}
이렇게 나누는 이유는
- 코드 가독성 증가
- 유지보수 용이
- 재사용성 증가
때문이다.
'C++' 카테고리의 다른 글
| 기본 생성자와 오버로딩 (0) | 2026.03.12 |
|---|---|
| 생성자와 소멸자 (0) | 2026.03.12 |
| C++로 전직 시스템과 전투 시스템 구현해보기 (0) | 2026.03.10 |
| 포인터 (0) | 2026.03.05 |
| C++로 인터페이스 상태창 구현해보기 (0) | 2026.03.04 |