클래스만 써도 되는거아냐? 구조체 왜씀?

연어는결국강으로·2024년 11월 25일
0

CPP 정복기

목록 보기
3/3

1. 구조체는 자바에서 필드들만 모아 놓은거고 클래스는 생성자나 함수들을 모아 놓은건가?

C++에서의 구조체(struct)클래스(class)는 자바와 비슷한 개념을 공유하지만, 몇 가지 중요한 차이점이 있습니다. C++에서 구조체와 클래스는 기능적으로 거의 동일하며, 주된 차이는 기본 접근 제어(public vs private)에 있습니다. 이를 이해하기 위해 자바와 비교하면서 설명하겠습니다.


1. C++의 구조체와 클래스의 차이

1.1. 공통점

  • 데이터(필드)와 함수(메서드)를 모두 포함할 수 있습니다.
    • C++에서 구조체는 자바에서 필드만 포함할 수 있는 단순한 데이터 구조와는 다릅니다.
    • 구조체도 생성자, 소멸자, 멤버 함수, 상속 등을 사용할 수 있습니다.
  • 기능적으로 거의 동일합니다.
    • 구조체와 클래스 모두 객체지향 프로그래밍의 기본 요소를 제공합니다.

1.2. 차이점: 기본 접근 제어

  • 구조체(struct):

    • 기본 접근 제어가 public입니다.
    • 즉, 구조체 멤버는 별도로 명시하지 않으면 외부에서 접근 가능합니다.
  • 클래스(class):

    • 기본 접근 제어가 private입니다.
    • 즉, 클래스 멤버는 별도로 명시하지 않으면 외부에서 접근 불가능합니다.

예제

#include <iostream>

// 구조체
struct MyStruct {
    int x;              // 기본 접근 제어: public
    void print() {      // 멤버 함수
        std::cout << "x = " << x << std::endl;
    }
};

// 클래스
class MyClass {
    int x;              // 기본 접근 제어: private

public:                 // 접근 제어자를 명시해야 외부 접근 가능
    void setX(int val) {
        x = val;
    }
    void print() {
        std::cout << "x = " << x << std::endl;
    }
};

int main() {
    // 구조체 사용
    MyStruct s;
    s.x = 10;  // 기본적으로 public
    s.print();

    // 클래스 사용
    MyClass c;
    // c.x = 10;  // 오류: x는 private
    c.setX(10);  // public 메서드를 통해 설정
    c.print();

    return 0;
}

출력:

x = 10
x = 10

2. 구조체와 클래스의 용도

2.1. 구조체(struct)

  • 일반적으로 단순 데이터 구조를 정의할 때 사용합니다.
  • 예: 좌표, 색상, 크기 등의 데이터만 포함된 구조체.

예제: 단순 데이터 구조

struct Point {
    int x;
    int y;
};
  • 위와 같은 구조체는 데이터를 그룹화할 때 유용합니다.

2.2. 클래스(class)

  • 주로 객체지향 프로그래밍에서 사용하며, 데이터와 동작(메서드)을 함께 정의합니다.
  • 예: 캡슐화된 데이터와 이를 다루는 메서드를 포함하는 경우.

예제: 객체 지향적 설계

class Rectangle {
private:
    int width;
    int height;

public:
    Rectangle(int w, int h) : width(w), height(h) {}  // 생성자
    int getArea() {
        return width * height;
    }
};

3. 자바와의 비교

자바에는 struct가 없으므로, C++의 구조체와 클래스를 다음과 같이 비교할 수 있습니다.

3.1. 구조체(struct)와 자바

  • C++ 구조체는 단순히 필드만 포함하는 자바 클래스와 유사합니다.
  • 하지만 C++ 구조체는 함수와 생성자도 포함할 수 있다는 점에서 자바 클래스와 기능적으로 더 비슷합니다.

3.2. 클래스(class)와 자바

  • C++ 클래스는 자바 클래스와 매우 비슷합니다.
  • 하지만 C++에서는:
    • 멤버의 기본 접근 제어가 private입니다.
    • 생성자, 소멸자를 명시적으로 관리해야 합니다.
    • 메모리 관리와 접근 제어를 더 세밀하게 제어할 수 있습니다.

4. 구조체와 클래스의 구분은 스타일의 차이

C++에서는 구조체와 클래스를 기능적으로 동일하게 사용할 수 있으므로, 이를 구분하는 것은 코딩 스타일명명 규칙에 더 가깝습니다.

  • 구조체: 주로 데이터 구조처럼 사용.
  • 클래스: 객체 지향적으로 캡슐화된 데이터와 동작을 정의.

5. 요약

  1. C++의 구조체와 클래스는 기본적으로 동일한 기능을 제공합니다.
  2. 구조체는 기본 접근 제어가 public이고, 클래스는 기본 접근 제어가 private입니다.
  3. 자바의 필드만 포함된 클래스는 C++의 구조체와 비슷하지만, C++ 구조체는 멤버 함수와 생성자도 포함할 수 있어 자바 클래스와 기능적으로 유사합니다.
  4. 클래스는 주로 객체 지향적인 설계에, 구조체는 단순 데이터 구조에 사용됩니다.

구조체와 클래스의 차이를 이해한 후, 설계 목적에 따라 적합한 방식을 선택하면 됩니다. 😊



2. 아니 그럼 구조체를 왜써? 자바에서 필드 대부분 private로 쓴다 아냐? 그냥 클래스로 만들고 필요하면 접근제어자 바꾸면되잔아!!!

맞아요! 말씀하신 대로 자바에서 주로 필드를 private로 선언하고, 필요한 경우 메서드를 통해 접근하는 방식은 C++의 클래스를 사용하는 패턴과 비슷합니다. 그래서 C++에서도 모든 것을 클래스로 만들어도 문제는 없습니다. 그러나 구조체(struct)가 여전히 존재하고 사용되는 이유는 역사적, 실용적, 철학적 이유에서 기인합니다. 이를 하나씩 살펴보겠습니다.


1. 역사적 이유

  • C 언어에서의 구조체:
    • C 언어에서는 객체지향 개념이 없었고, 구조체는 단순히 데이터를 묶는 용도로 사용되었습니다.
    • C++은 C 언어에서 발전한 언어로, 구조체를 유지하면서도 객체지향 개념(클래스)을 추가했습니다.
    • 따라서 C++에서 구조체는 하위 호환성을 위해 남아 있는 부분도 있습니다.

2. 구조체를 사용하는 이유

C++에서 구조체와 클래스는 거의 동일한 기능을 제공하지만, 특정 상황에서는 구조체를 사용하는 것이 더 적합할 수 있습니다.

2.1. 단순 데이터 구조

  • 구조체는 데이터를 묶기 위한 간단한 용도로 사용됩니다.
  • 예: 좌표, 색상, 크기 등 데이터를 표현할 때 클래스보다 간결하게 사용할 수 있습니다.
struct Point {
    int x;
    int y;
};
  • 위의 예제를 클래스로 바꾸면 이렇게 작성해야 합니다:
class Point {
public:
    int x;
    int y;
};

구조체는 기본 접근 제어가 public이므로 코드가 간결해지고, 불필요한 접근 제어자 설정을 피할 수 있습니다. 데이터 중심의 설계에서는 구조체가 더 자연스럽습니다.


2.2. POD (Plain Old Data) 객체

  • 구조체는 POD 객체로 사용되며, 메모리 정렬 및 직렬화와 같은 작업에서 유용합니다.
  • POD 객체는 다음과 같은 특징이 있습니다:
    • 단순한 데이터 타입의 집합.
    • 복사와 이동이 빠름.
    • 메모리 레이아웃이 C 언어와 동일하므로 바이너리 데이터와 호환 가능.

예제: 네트워크 프로토콜 데이터 처리

struct PacketHeader {
    uint32_t packetId;
    uint16_t packetLength;
    uint8_t packetType;
};
  • 이런 구조는 메모리 크기와 정렬이 명확하므로 네트워크 데이터나 파일 처리에 적합합니다.

2.3. 의미적 차별화

  • 구조체는 "단순히 데이터를 묶는 용도"로 사용되고,
  • 클래스는 "데이터와 동작(메서드)을 캡슐화하는 용도"로 사용됩니다.
  • 이로 인해 의도(intent)를 코드에 명확히 표현할 수 있습니다.

예제: 직관적인 설계

struct Color {
    int r, g, b;  // 단순 데이터
};

class ColorManipulator {
public:
    void darken(Color& color);
    void lighten(Color& color);
};
  • 구조체 Color는 단순 데이터로 사용하고, 클래스 ColorManipulator는 데이터 조작 로직을 포함합니다.
  • 이를 통해 데이터와 로직을 명확히 구분할 수 있습니다.

2.4. 기능적 최소화

  • 구조체는 불필요한 캡슐화를 피할 수 있습니다.
  • 데이터 중심 설계에서는 구조체가 과도한 복잡성을 줄이는 데 유리합니다.

3. 구조체와 클래스의 철학적 차이

3.1. 클래스의 철학

  • 데이터와 동작을 함께 묶어 캡슐화하고, 객체 지향적 설계를 추구합니다.
  • 필드를 기본적으로 private으로 설정하여 데이터를 보호하고, 메서드를 통해 접근을 제어합니다.

3.2. 구조체의 철학

  • 데이터를 직접적으로 표현하는 데 초점을 맞춥니다.
  • 데이터 중심 설계에서 사용되며, 간결함과 명확성을 추구합니다.

4. 모든 것을 클래스로 만들지 않는 이유

4.1. 불필요한 복잡성

  • 단순히 데이터를 묶는 용도로만 사용하는 경우, 구조체가 더 간단하고 명료합니다.
  • 구조체를 사용하면 코드의 의도를 쉽게 파악할 수 있습니다.

4.2. 성능 문제

  • 클래스는 기본적으로 메서드와 접근 제어자를 포함하므로, 구조체보다 약간 더 많은 메모리를 사용할 수 있습니다.
  • 단순 데이터를 다룰 때는 구조체가 더 효율적입니다.

4.3. 코드 스타일과 가독성

  • 단순 데이터를 구조체로 표현하면 코드가 더 읽기 쉬워지고 유지보수성이 높아집니다.
  • 예를 들어, 복잡한 객체보다는 간단한 데이터 표현이 필요한 경우 구조체가 적합합니다.

5. 구조체를 사용하는 예시

  • 데이터 중심 설계:
    • 좌표(Point), 색상(Color), 크기(Size) 등 단순 데이터를 다룰 때.
  • POD 객체:
    • 네트워크 패킷, 파일 데이터 처리, 바이너리 데이터와 호환성을 유지할 때.
  • 라이브러리 설계:
    • 템플릿 라이브러리나 API에서 단순 데이터 구조를 전달할 때.

6. 결론

구조체는 단순 데이터 중심 설계에서 유용하며, 클래스와 구분된 철학적 역할을 수행합니다. 모든 것을 클래스로 만들어도 문제는 없지만, 구조체를 사용하는 이유는 다음과 같습니다:
1. 단순 데이터를 표현하는 데 구조체가 더 직관적이고 간단하다.
2. POD 객체와 같이 데이터 정렬, 직렬화, 네트워크 프로토콜 처리에 적합하다.
3. 데이터와 로직을 명확히 구분하여 설계를 단순화할 수 있다.
4. C++에서 하위 호환성과 가벼운 메모리 관리의 이점이 있다.

즉, 구조체는 단순함과 효율성을 위해 여전히 유용하며, 클래스와 함께 적절히 사용하면 더 좋은 코드를 작성할 수 있습니다. 😊

0개의 댓글