struct vs class

Jaemyeong Lee·2024년 12월 6일

게임 서버1

목록 보기
45/220

이 Step에서 다루는 것

  • structclass진짜 차이 2가지
    • 기본 멤버 접근 지정자: structpublic, classprivate
    • 기본 상속 접근 지정자: structpublic 상속, classprivate 상속
  • 실전에서 어떤 기준으로 나누어 쓰면 좋은지(“권장”의 의미)
  • 접근 오류가 났을 때 점검 순서

학습 목표

  • “둘은 거의 같은데, 왜 접근 에러가 나지?”의 원인을 기본값 규칙으로 설명할 수 있다.
  • public: 한 줄로 해결되는 상황과, 상속 선언을 고쳐야 하는 상황을 구분할 수 있다.

차이 1) 기본 멤버 접근 지정자

  • struct의 멤버는 기본이 public
  • class의 멤버는 기본이 private
struct Knight1 {
    int hp; // public (기본)
};

class Knight2 {
    int hp; // private (기본)
};

정리:

  • struct/class가 기능적으로 “다른 언어 요소”가 아니라, 기본값이 다를 뿐입니다.
  • 원하면 struct에서도 private:를 쓸 수 있고, class에서도 public:을 쓸 수 있습니다.

차이 2) 기본 상속 접근 지정자 (진짜 자주 터짐)

상속을 아무 것도 안 붙이고 쓰면 기본값이 다릅니다.

  • struct Derived : Base → 기본이 public 상속
  • class Derived : Base → 기본이 private 상속
class Base {
public:
    void Foo() {}
};

struct SDerived : Base { // public 상속 (기본)
};

class CDerived : Base {  // private 상속 (기본)
};

이 차이 때문에:

  • CDerived d; d.Foo(); 가 “접근할 수 없습니다”로 막힐 수 있습니다.
  • 해결은 보통 class CDerived : public Base 처럼 상속 지정자를 명시하는 것입니다.

실전 권장 사용법(관례)

관례(많이 쓰는 스타일)는 이렇습니다.

  • struct: “데이터 묶음(값 타입)” 중심
    • 예: 좌표, 스탯, 설정 값 같이 public으로 열어두는 게 자연스러운 것
  • class: “규칙(불변식) + 행동(함수)” 중심
    • 예: HP 범위 유지, 상태 전이, 캡슐화가 중요한 것

중요:

  • 이건 “규칙”이 아니라 협업을 위한 관례입니다.
    핵심은 public/protected/private를 통해 의도를 드러내는 설계를 하는 것입니다.

접근 오류가 났을 때 점검 체크리스트

  • 멤버가 안 보인다 → 클래스/구조체 내부에 public:이 있는지 확인
  • 상속한 멤버가 안 보인다 → : public Base로 상속을 명시했는지 확인

예:

class Knight2 {
public:
    int hp = 0;
};

int main()
{
    Knight2 k2;
    k2.hp = 10; // OK
}

체크 질문 (스스로 답해보기)

  • structclass의 차이 2가지는 무엇인가?
  • “상속했는데 부모 public 함수가 자식에서 private처럼 보이는” 상황은 언제 생기는가?
  • 접근 오류가 났을 때, public: 문제인지 public 상속 문제인지 어떻게 구분할까?

profile
李家네_공부방

0개의 댓글