Menu
Coddy logo textTech

Struct와 Class

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

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

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

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

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

이는 inheritance에도 적용됩니다. struct는 기본적으로 public 상속을 하는 반면, class는 private 상속을 합니다:

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

이러한 기본값을 넘어서는 기술적 차이는 없습니다. 하지만 관례가 중요합니다.

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

challenge icon

챌린지

쉬움

C++ 관례에 따라 structclass 중 언제 무엇을 사용해야 하는지 보여 주는 간단한 구성 시스템을 만들어 보겠습니다. 공개적으로 접근할 수 있도록 설계된 단순한 데이터를 위해 struct를 만들고, 캡슐화와 제어된 접근이 필요한 데이터를 위해 class를 만듭니다.

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

  • Config.h: 서로 다른 종류의 구성 데이터를 나타내는 struct와 class를 모두 정의합니다.

    먼저 Dimensions라는 struct를 만듭니다. 이는 너비와 높이(int 모두)를 저장하는 간단한 데이터 컨테이너입니다. struct는 기본적으로 public 멤버를 가지므로 getter 없이 직접 접근할 수 있어야 합니다. 너비와 높이의 곱을 반환하는 area() 메서드도 포함합니다.

    그런 다음 적절한 캡슐화를 사용하여 애플리케이션 설정을 관리하는 AppConfig라는 class를 만듭니다. 애플리케이션 이름(string)과 창 크기를 위한 Dimensions 객체를 저장해야 합니다. class 멤버는 기본적으로 private이므로 public 인터페이스에 접근할 수 있도록 명시적으로 지정해야 합니다. 다음을 제공합니다:

    • 애플리케이션 이름, 너비, 높이를 받는 생성자
    • 이름을 반환하는 getter getAppName()
    • Dimensions를 반환하는 getter getWindowSize()
    • 다음을 출력하는 displayConfig() 메서드: "App: <name>, Window: <width>x<height>, Area: <area>"
  • main.cpp: struct와 class 사용 방식의 차이를 보여 줍니다. 입력에서 애플리케이션 이름, 너비, 높이를 읽습니다(각각 별도의 세 줄). 그런 다음:
    • 너비와 높이 값으로 Dimensions struct를 직접 생성하고, 멤버에 직접 접근하여 다음을 출력합니다: "Direct struct access: <width> x <height>"
    • 세 값을 모두 사용하여 AppConfig 객체를 생성합니다.
    • 전체 구성을 표시하기 위해 displayConfig()를 호출합니다.
    • getter를 사용하여 창 크기를 가져오고 다음을 출력합니다: "Via getter - Area: <area>"

이 과제는 다음 관례를 강조합니다. 좌표나 크기처럼 단순하고 투명한 데이터를 가지고 있을 때는 struct를 사용하고, 접근을 제어하며 데이터에 동작을 추가하려 할 때는 class를 사용합니다.

std::stoi()를 사용하여 너비와 높이 입력을 문자열에서 정수로 변환합니다. 헤더 파일의 헤더 가드도 잊지 마세요.

직접 해보기

#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 구조체 생성
    // Access its members directly to print: "Direct struct access: <width> x <height>"
    
    // TODO: appName, width, height로 AppConfig 객체 생성
    
    // TODO: AppConfig 객체에서 displayConfig() 호출
    
    // TODO: Use getWindowSize() getter to get dimensions and print: "Via getter - Area: <area>"
    
    return 0;
}
quiz icon실력 점검

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

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

직접 연습해 보세요: 온라인 C++ 컴파일러