[C++] 클래스
클래스
클래스(Class)는 여러 데이터들을 묶어서 새로운 자료형을 만들어 내는 사용자 정의 자료형입니다.
클래스는 구조체와 거의 모든 부분에서 같고, 몇 가지 차이점이 있지만 중요한 차이점은 기본 접근 제어자가 다릅니다.
구조체는 기본 접근 제어자가 public
이지만 클래스는 기본 접근 제어자가 private
입니다.
클래스 안에 변수와 함수가 포함될 수 있고 각각 멤버 변수와 멤버 함수라고 부릅니다.
멤버 변수는 클래스가 가지는 데이터의 정의를 의미하고, 멤버 함수는 데이터를 다루는 방법을 정의합니다.
클래스의 메모리 배치는 멤버의 순서와 데이터 타입에 따라 달리지며, 메모리 패딩이 추가되기도 합니다.
클래스 정의
class Dog
{
public:
// 멤버 변수
std::string Name;
int Age;
// 멤버 함수
void Bark()
{
std::cout << Name << ": Bark!" << std::endl;
}
};
위와 같은 방법으로 클래스를 정의할 수 있습니다.
주의할 점으로 클래스를 정의 할 때 끝에 세미콜론(;)을 잊지 않아야합니다.
일반적으로 멤버 변수는 private
접근 제어자를 사용해 캡슐화합니다.
이는 객체 지향 프로그래밍 원칙을 따르기 위함인데, 객체 내부의 데이터와 이를 처리하는 메서드를 외부로부터 숨겨, 데이터를 보호하고, 안전하게 유지하기 위함입니다.
멤버 변수를 private
접근 제어자를 사용해 캡슐화한 예제는 다음과 같습니다.
class Dog
{
private:
// 멤버 변수
std::string Name;
int Age;
public:
// 멤버 함수
void Bark()
{
std::cout << Name << ": Bark!" << std::endl;
}
};
이처럼 멤버 변수를 캡슐화 한다면 외부에서 접근 할 수 없으므로 생성자를 사용하거나 초기화 리스트를 사용해 초기화할 수 있습니다.
혹은 멤버 변수에 기본값을 줘 초기화 할 수 있습니다.
일반적으로 멤버 함수는 클래스의 내부에서 선언만 가지고 있고, 클래스 외부에서 정의합니다.
선언과 정의를 분리할 때 클래스의 정의와 멤버 함수의 선언은 ~.h
파일에서 하고, 멤버 함수의 정의는 ~.cpp
파일에서 합니다.
파일을 분리하고, 선언과 정의를 분리할 때 예시는 다음과 같습니다.
Dog.h
class Dog
{
public:
// 멤버 변수
std::string Name;
int Age;
// 멤버 함수
void Bark();
};
Dog.cpp
void Dog::Bark()
{
std::cout << Name << ": Bark!" << std::endl;
}
이처럼 선언과 정의를 나누는 대표적인 이유는 다음과 같습니다.
- 코드의 가독성 향상
- 함수의 정의가 분리되며 클래스의 코드가 짧아지고, 복잡하지 않아져 가독성이 향상됩니다.
- 컴파일 시간 최적화
- C++는 헤더 파일을 포함하는 방식으로 코드를 컴파일하는데, 헤더의 파일에서 코드를 줄이고, 중복해서 컴파일 하는 일이 없어 컴파일 시간을 줄일 수 있습니다.
사용법
클래스 정의에서 만든 클래스를 사용해보겠습니다.
int main()
{
Dog MyDog; // 객체 생성
MyDog.Name = "리트리버"; // 객체의 멤버 변수 접근
MyDog.Age = 4; // 객체의 멤버 변수 접근
MyDog.Bark(); // 객체의 멤버 함수 접근
}
객체의 멤버 변수 및 멤버 함수가 public
일 경우 위와 같이 접근 할 수 있습니다.
댓글남기기