Menu
Coddy logo textTech

Struct와 Class

Coddy C++ 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨 — 104개 중 37번째.

C++에서 structclass는 거의 동일합니다. 둘 다 멤버 변수, 멤버 함수, 생성자를 가질 수 있으며 상속을 지원합니다. 유일한 차이점은 이들의 기본 접근 수준입니다.

class에서 멤버는 기본적으로 private입니다. struct에서 멤버는 기본적으로 public입니다:

struct Point {
    int x;    // 기본적으로 public
    int y;    // 기본적으로 public
};

class Circle {
    double radius;    // 기본적으로 private
    
public:
    double getRadius() { return radius; }
};

이것은 상속에도 적용됩니다. struct는 기본적으로 공개적으로(publicly) 상속하는 반면, class는 비공개적으로(privately) 상속합니다:

struct DerivedStruct : Base {};    // public 상속
class DerivedClass : Base {};      // private 상속

이러한 기본값들 외에는 기술적인 차이가 없습니다. 하지만 관습이 중요합니다.

대부분의 C++ 프로그래머들은 (좌표나 설정과 같은) 공개 멤버를 가진 단순한 데이터 컨테이너를 위해 struct를 사용하고, 캡슐화와 동작이 중요할 때 class를 사용합니다. 이 관습을 따르면 다른 개발자들에게 코드의 의도를 더 명확하게 전달할 수 있습니다.

challenge icon

챌린지

쉬움

C++ 관례에 따라 structclass를 언제 사용해야 하는지 보여주는 간단한 설정 시스템을 구축해 보겠습니다. 공개적으로 접근 가능한 단순한 데이터에는 struct를 사용하고, 캡슐화와 제어된 접근이 필요한 데이터에는 class를 사용하게 됩니다.

코드를 구성하기 위해 두 개의 파일을 생성합니다:

  • Config.h: 서로 다른 종류의 설정 데이터를 나타내는 구조체와 클래스를 모두 정의합니다.

    먼저, 너비(width)와 높이(height)(둘 다 int)를 위한 단순한 데이터 컨테이너인 Dimensions라는 struct를 만듭니다. 구조체는 기본적으로 멤버가 public이므로, getter 없이 직접 접근할 수 있어야 합니다. 너비와 높이의 곱을 반환하는 area() 메서드를 포함하세요.

    그런 다음, 적절한 캡슐화를 통해 애플리케이션 설정을 관리하는 AppConfig라는 class를 만듭니다. 이 클래스는 앱 이름(string)과 창 크기를 위한 Dimensions 객체를 저장해야 합니다. 클래스 멤버는 기본적으로 private이므로, public 인터페이스를 명시적으로 만들어야 합니다. 다음을 제공하세요:

    • 앱 이름, 너비, 높이를 매개변수로 받는 생성자
    • 이름을 반환하는 getter getAppName()
    • Dimensions를 반환하는 getter getWindowSize()
    • "App: <name>, Window: <width>x<height>, Area: <area>"를 출력하는 displayConfig() 메서드
  • main.cpp: 구조체와 클래스 사용의 차이점을 보여줍니다. 입력(세 개의 별도 줄)에서 앱 이름, 너비, 높이를 읽은 후 다음을 수행합니다:
    • 너비와 높이 값으로 Dimensions 구조체를 직접 생성합니다. 멤버에 직접 접근하여 "Direct struct access: <width> x <height>"를 출력합니다.
    • 세 가지 값을 모두 사용하여 AppConfig 객체를 생성합니다.
    • displayConfig()를 호출하여 전체 설정을 표시합니다.
    • getter를 사용하여 창 크기를 가져와 "Via getter - Area: <area>"를 출력합니다.

이 챌린지는 다음과 같은 관례를 강조합니다: 좌표나 치수와 같이 단순하고 투명한 데이터가 있을 때는 struct를 사용하고, 데이터에 대한 접근을 제어하고 동작을 추가하고 싶을 때는 class를 사용하세요.

std::stoi()를 사용하여 문자열로 입력된 너비와 높이를 정수로 변환하세요. 헤더 파일에 헤더 가드(header guards)를 포함하는 것을 잊지 마세요.

치트 시트

C++에서 structclass는 거의 동일하지만, 한 가지 핵심적인 차이점이 있습니다. 바로 기본 접근 수준(default access level)입니다.

struct에서 멤버는 기본적으로 public입니다:

struct Point {
    int x;    // 기본적으로 public
    int y;    // 기본적으로 public
};

class에서 멤버는 기본적으로 private입니다:

class Circle {
    double radius;    // 기본적으로 private
    
public:
    double getRadius() { return radius; }
};

이는 상속에도 적용됩니다:

struct DerivedStruct : Base {};    // 기본적으로 public 상속
class DerivedClass : Base {};      // 기본적으로 private 상속

관례: 멤버가 public인 단순한 데이터 컨테이너에는 struct를 사용하고, 캡슐화와 동작이 중요한 경우에는 class를 사용합니다.

직접 해보기

#include <iostream>
#include <string>
#include "Config.h"

using namespace std;

int main() {
    // 입력 읽기
    string appName;
    string widthStr;
    string heightStr;
    
    getline(cin, appName);
    getline(cin, widthStr);
    getline(cin, heightStr);
    
    int width = stoi(widthStr);
    int height = stoi(heightStr);
    
    // TODO: width와 height를 가진 Dimensions 구조체 생성
    // 멤버에 직접 접근하여 출력: "Direct struct access: <width> x <height>"
    
    // TODO: appName, width, height를 사용하여 AppConfig 객체 생성
    
    // TODO: AppConfig 객체에서 displayConfig() 호출
    
    // TODO: getWindowSize() 게터를 사용하여 크기를 가져오고 출력: "Via getter - Area: <area>"
    
    return 0;
}
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

객체 지향 프로그래밍의 모든 레슨