Class
클래스는 일반적으롤 멤버 함수(동작)과 멤버 변수(데이터)로 구성된다.
Class Student
{
int kor;
int eng;
int math;
int getMax()
{
return max(max(kor, eng), math);
}
};
클래스든 구조체든 선언하고 ;를 붙여줘야한다.
클래스 함수 선언 후 따로 구현하기
class Student
{
double getAvg();
int kor;
int eng;
int math;
};
double Student::getAvg()
{
return (kor + eng + math) / 3.0;
}
- 클래스 밖에서 함수 정의 시 함수명 앞에 Student:: 를 붙여줘야한다.
- 클래스는 전체가 한번에 컴파일되기 때문에 변수 선언을 위에서 하든 아래에서 하든 별 상관이 없다.
접근제어
- public
- 외부에서 멤버 접근 가능
- 일반적인 멤버 함수는 public
- private
- 접근 지정자를 설정하지 않았을 경우, 디폴트로 설정된다.
- private 멤버는 클래스 외부에서 직접 접근할 경우 컴파일 에러가 발생한다.
- 일반적인 멤버 변수는 private
- protected
코드 예시
객체 생성
자바에서는 Student라는 클래스 객체를 생성하려면 Student s = new Student(); 이런 식으로 해야했지만 C++에서는 다르다.
- Student s;
- 이것만 쓰면 객체 생성 완료.
- C++에서는 Student s;라고만 해도 객체가 바로 생성되기 때문에 변수 안에 데이터가 직접 들어있고, 바로 접근 가능하다.
- JAVA에서는 Student s라는 것은 객체가 아니고 객체의 주소다. 그래서 new Student()로 따로 객체를 메모리에 생성하여 참조 변수에 주소를 저장하고 나서 할당이 된다. 그래서 자바에서는 인자로 Student s를 전달해서 수정하면 원본 객체가 수정되고, C++에서는 복사본만 전달이 된다. 또한, 자바에서는 Student s1 = new Student(); Student s2= s1라고 할 경우에 복사가 된 것이 아니고 서로 같은 객체를 가리키는 것이 된다.
- 그러나 역시 컴파일은 위에서 아래로 되므로 아무데나 메소드 적어도 되는 자바와 달리, C++에서는 사용 전에 적어도 선언은 해주어야한다.
Getter, Setter
int getKorScore() {
return kor;
}
void setKorScore() {
this->kor = kor;
}
- set하려면 this->(변수명) 해주면 된다.
- C++에서의 this는 Student* 타입 포인터이기 때문에 포인터 멤버 접근 연산자인 ->를 사용한다. ((*Student).이랑 같음)
생성자
- 생성자는 객체를 생성할 때마다 한 번씩 자동으로 호출되는 특별한 멤버 함수
- 필요한 멤버 변수를 초기화하거나 객체가 동작할 준비를 하기 위해 사용
- 반환형을 명시하지 않고, class 이름과 동일한 이름을 가진 함수로 정의
- 당연히 public으로 선언해야한다.
- 기본인자는 Student(string n = "DefaultName", int a = 18) 이라고 하면 기본 매개변수가 있는 생성자가 되며, 매개변수가 안 들어올 경우 기본값으로 설정된다. 기본값이 있으면 인스턴스 생성 시 매개변수를 안 넣어도 기본 생성자가 작동한다.
- 기본값이 없는 경우 매개변수를 일부만 설정할 수는 없다(int a, int b를 받을 때 a만 넣을 수 없음). 기본값이 있으면 일부만 설정하고 나머지는 기본값이 된다.
class Student
{
public:
Student() {
kor = 0;
eng = 0;
math = 0;
}
// 동작 정의
int getMaxScore() {
return max(max(kor, eng), math);
}
double getAvg()
{
return (kor + eng + math) / 3.0;
}
int getKorScore() {
return kor;
}
void setKorScore(int kor) {
this->kor = kor;
}
void setEngScore(int eng) {
this->kor = eng;
}
void setMathScore(int math) {
this->math = math;
}
private:
int kor;
int eng;
int math;
};
int main()
{
Student s;
s.setKorScore(10);
s.setEngScore(18);
s.setMathScore(15);
cout << s.getMaxScore() << endl;
return 0;
}
코드 나누기
보통 클래스의 선언부(헤더)와 구현부(소스 파일)을 분리한 뒤, 필요한 곳에서 헤더를 include하여 제공하는 방식을 사용한다.
class Student
{
public:
Student();
int memfunc();
private:
int x, y z;
}
Student::Student()
{
//구현
}
int Student:: memfunc()
{
//구현
}
- class를 헤더 파일에 정의할 때 중복 선언을 하지 않도록 주의해야한다.
- #ifndef라는 구문을 활용하여 중복 선언을 방지할 수 있다.
- 헤더파일 폴더에 만든 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();
private:
//데이터 정의
int kor;
int eng;
int math;
};
#endif
- 소스폴더의 Student.cpp 파일. 멤버 함수를 구현했다.
- #include "Student.h"와 함수 구현할 때 Student::를 빠뜨리면 안 된다.
#include "Student.h"
#include <iostream>
using namespace std;
double Student::getAvg()
{
return (kor + eng + math) / 3.0;
}
int Student::getMaxScore()
{
return max(max(kor, eng), math);
}
- 이제 main 함수에서는 이렇게 구현할 수 있다.
#include <iostream>
#include "Student.h"// 사용자 정의 헤더
using namespace std;
int main()
{
Student s;
s.setKorScore(10);
s.setEngScore(18);
s.setMathScore(15);
cout << s.getMaxScore() << endl;
return 0;
}

'코딩 학습 > C와 C++' 카테고리의 다른 글
| C++ 기초 - 자원 관리 (0) | 2026.03.10 |
|---|---|
| C++ 기초 - Vector, Map (0) | 2026.03.09 |
| C++ 기초 - 포인터와 레퍼런스 (0) | 2026.03.05 |
| C++ 기초 - Visual Studio 실행, 변수, 입출력 (0) | 2026.03.04 |
| C - 배열 (0) | 2026.03.04 |