C++에서 클래스와 구조체 사용 시점
기본 접근 지정자:
- 구조체: 기본적으로 모든 멤버가
public
으로 접근 가능합니다. 즉, 외부 코드에서 쉽게 변경될 수 있습니다. - 클래스: 기본적으로 모든 멤버가
private
으로 접근 제한됩니다. 외부 코드에서 직접 액세스를 제한하고 데이터 은닉을 통해 코드 보안을 강화합니다.
사용 목적:
- 구조체: 단순히 데이터 집합을 정의하는 데 적합합니다. 예를 들어, 사용자 정보, 좌표 값 등을 표현하는 데 유용합니다.
- 클래스: 객체 지향 프로그래밍(OOP)의 핵심 요소인 객체를 설계하고 구현하는 데 사용됩니다. 멤버 함수, 상속, 다형성 등을 통해 복잡한 동작을 가진 객체를 만들 수 있습니다.
기타 차이점:
- 생성자: 클래스는 기본적으로 생성자를 가지고 있지만 구조체는 없을 수 있습니다.
- 상속: 클래스는 다른 클래스로부터 상속받을 수 있지만 구조체는 일반적으로 상속되지 않습니다.
- 템플릿: 클래스는 템플릿화될 수 있지만 구조체는 템플릿화되지 않습니다.
따라서 다음과 같은 경우 클래스를 사용하는 것이 좋습니다:
- 데이터를 은닉하고 보호해야 하는 경우
- 객체 간 상호 작용을 정의해야 하는 경우
- 상속과 다형성을 사용해야 하는 경우
- 템플릿을 사용해야 하는 경우
- 단순히 데이터 집합을 정의해야 하는 경우
- 데이터 멤버에 대한 직접적인 액세스가 필요한 경우
- 코드 간의 간결성을 유지해야 하는 경우
요약:
- 클래스는 데이터 은닉, 객체 설계, 상속, 다형성 등을 제공하는 강력한 OOP 기능을 제공합니다.
- 구조체는 단순한 데이터 집합을 정의하고 멤버에 대한 직접 액세스가 필요한 경우에 적합합니다.
C++ 클래스 vs 구조체 예제 코드
#include <iostream>
// 점을 나타내는 구조체
struct Point {
int x;
int y;
};
// 원을 나타내는 클래스
class Circle {
private:
Point center; // 원의 중심점
double radius; // 원의 반지름
public:
// 생성자
Circle(Point c, double r) {
center = c;
radius = r;
}
// 원의 면적 계산
double getArea() const {
return 3.14159 * radius * radius;
}
// 원 정보 출력
void printInfo() const {
std::cout << "중심 좌표: (" << center.x << ", " << center.y << ")" << std::endl;
std::cout << "반지름: " << radius << std::endl;
std::cout << "면적: " << getArea() << std::endl;
}
};
int main() {
// Point 구조체 사용
Point p1 = {10, 20};
std::cout << "점 p1: (" << p1.x << ", " << p1.y << ")" << std::endl;
// Circle 클래스 사용
Circle c1(p1, 5);
c1.printInfo();
return 0;
}
설명:
Point
구조체는x
와y
좌표를 저장하는 두 개의 멤버 변수를 가집니다. 멤버 변수에 대한 접근 제한자가 없으므로 외부 코드에서 쉽게 변경될 수 있습니다.Circle
클래스는center
(중심점)와radius
(반지름) 멤버 변수를 가지고 있습니다. 멤버 변수는private
으로 선언되어 데이터 은닉을 제공합니다. 또한getArea()
및printInfo()
와 같은 멤버 함수를 통해 원의 면적을 계산하고 정보를 출력할 수 있습니다.
C++에서 클래스 대신 구조체를 사용하는 대체 방법
열거형(Enumeration):
- 특정 값들의 집합을 정의하는 데 유용합니다.
- 상수 목록과 유사하지만, 좀 더 명확하고 관리하기 쉽습니다.
- 예를 들어, 요일을 나타내는 열거형을 다음과 같이 정의할 수 있습니다:
enum Day {
SUNDAY,
MONDAY,
TUESDAY,
WEDNESDAY,
THURSDAY,
FRIDAY,
SATURDAY
};
유니온(Union):
- 서로 다른 데이터 형식의 값을 하나의 변수에 저장하는 데 사용됩니다.
- 공간 활용도를 높일 수 있지만, 메모리 관리가 복잡하고 오류 발생 가능성이 높아 주의해서 사용해야 합니다.
- 예를 들어,
int
,char
,double
값 중 하나를 저장할 수 있는 유니온을 다음과 같이 정의할 수 있습니다:
union Data {
int intValue;
char charValue;
double doubleValue;
};
별칭(Alias):
- 기존의 데이터 형식에 새로운 이름을 부여하는 데 사용됩니다.
- 코드 가독성을 향상시키고 코드를 좀 더 명확하게 만들 수 있습니다.
- 예를 들어,
std::string
을MyString
이라는 별칭으로 정의할 수 있습니다:
typedef std::string MyString;
주의 사항:
- 위의 대체 방법들은 클래스의 모든 기능을 제공하지 못합니다.
- 특히, 데이터 은닉, 객체 기능 구현, 상속 및 다형성과 같은 기능은 제공하지 않습니다.
- 따라서 상황을 잘 판단하여 적절한 방법을 선택해야 합니다.
- 단순히 데이터 집합을 정의하는 경우에는 구조체 대신 열거형, 유니온, 별칭과 같은 대체 방법을 고려할 수 있습니다.
- 하지만 이러한 대체 방법들은 클래스의 모든 기능을 제공하지 못하므로 주의해서 사용해야 합니다.
c++ oop class