C++에서 클래스와 구조체 사용 시점

2024-07-27

기본 접근 지정자:

  • 구조체: 기본적으로 모든 멤버가 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 구조체는 xy 좌표를 저장하는 두 개의 멤버 변수를 가집니다. 멤버 변수에 대한 접근 제한자가 없으므로 외부 코드에서 쉽게 변경될 수 있습니다.
  • 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::stringMyString이라는 별칭으로 정의할 수 있습니다:
typedef std::string MyString;

주의 사항:

  • 위의 대체 방법들은 클래스의 모든 기능을 제공하지 못합니다.
  • 특히, 데이터 은닉, 객체 기능 구현, 상속 및 다형성과 같은 기능은 제공하지 않습니다.
  • 따라서 상황을 잘 판단하여 적절한 방법을 선택해야 합니다.
  • 단순히 데이터 집합을 정의하는 경우에는 구조체 대신 열거형, 유니온, 별칭과 같은 대체 방법을 고려할 수 있습니다.
  • 하지만 이러한 대체 방법들은 클래스의 모든 기능을 제공하지 못하므로 주의해서 사용해야 합니다.

c++ oop class



프로그래밍에서 "상속보다는 구성을 선호하는가?" : 언어 비관점적 관점에서 객체 지향 프로그래밍(OOP) 및 상속 개념 분석

"상속보다는 구성을 선호하는가?"는 객체 지향 프로그래밍(OOP)에서 중요한 질문입니다. 이 질문은 클래스 간의 관계를 설계할 때 상속과 구성 중 어떤 방식을 우선적으로 선택해야 하는지를 고민하는 문제입니다. 두 가지 방식 모두 장단점이 있으며 상황에 따라 적절한 선택이 달라질 수 있습니다...



c++ oop class

C/C++ 프로그래밍에서 #include <filename>과 #include "filename"의 차이점

1. #include <filename>각 컴파일러마다 정의된 표준 헤더 파일을 포함하는 데 사용됩니다.<filename> 안에 작성된 파일 이름은 컴파일러가 미리 정의된 경로 목록에서 검색됩니다. 이 목록은 일반적으로 운영 체제 및 컴파일러에 따라 다릅니다


C++에서의 일반 캐스트, 정적 캐스트, 동적 캐스트 비교: 포인터 캐스팅 심층 분석

일반 캐스트는 C++에서 가장 강력한 캐스팅 유형으로, 다양한 형식 변환을 수행할 수 있습니다. 하지만 다른 캐스팅 유형에 비해 안전성이 낮고 오류 가능성이 높다는 단점이 있습니다. 일반 캐스트는 다음과 같은 용도로 사용됩니다


C++/C에서 비트 조작: 특정 비트 설정, 해제, 토글하기

C++와 C 프로그래밍에서 비트 조작은 저수준 시스템 프로그래밍이나 효율적인 알고리즘 구현에 필수적인 기술입니다. 특히, 특정 비트를 설정, 해제, 또는 토글하는 작업은 하드웨어 제어, 데이터 압축, 암호화 등 다양한 분야에서 활용됩니다


.NET에서 구조체(struct)와 클래스(class)의 차이점

1. 값 형식 vs 참조 형식:구조체: 값 형식으로, 변수에는 값 자체가 저장됩니다. 즉, 구조체 변수를 복사하면 새로운 값의 복사본이 만들어집니다.클래스: 참조 형식으로, 변수에는 객체의 메모리 위치를 참조하는 값이 저장됩니다


제어 역전(Inversion of Control)이란 무엇일까요?

전통적인 프로그래밍 방식에서는 프로그램 코드가 직접 라이브러리나 프레임워크의 기능을 호출하여 사용합니다. 이 방식은 코드의 의존성이 높아지고 유지 관리가 어려워지는 단점이 있습니다.제어 역전에서는 프로그램 코드가 직접 기능을 호출하는 대신