Struct와 Class
Coddy C++ 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨 — 104개 중 37번째.
C++에서 struct와 class는 거의 동일합니다. 둘 다 멤버 변수, 멤버 함수, 생성자를 가질 수 있으며 상속을 지원합니다. 유일한 차이점은 이들의 기본 접근 수준입니다.
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를 사용합니다. 이 관습을 따르면 다른 개발자들에게 코드의 의도를 더 명확하게 전달할 수 있습니다.
챌린지
쉬움C++ 관례에 따라 struct와 class를 언제 사용해야 하는지 보여주는 간단한 설정 시스템을 구축해 보겠습니다. 공개적으로 접근 가능한 단순한 데이터에는 struct를 사용하고, 캡슐화와 제어된 접근이 필요한 데이터에는 class를 사용하게 됩니다.
코드를 구성하기 위해 두 개의 파일을 생성합니다:
Config.h: 서로 다른 종류의 설정 데이터를 나타내는 구조체와 클래스를 모두 정의합니다.먼저, 너비(width)와 높이(height)(둘 다
int)를 위한 단순한 데이터 컨테이너인Dimensions라는struct를 만듭니다. 구조체는 기본적으로 멤버가 public이므로, getter 없이 직접 접근할 수 있어야 합니다. 너비와 높이의 곱을 반환하는area()메서드를 포함하세요.그런 다음, 적절한 캡슐화를 통해 애플리케이션 설정을 관리하는
AppConfig라는class를 만듭니다. 이 클래스는 앱 이름(string)과 창 크기를 위한Dimensions객체를 저장해야 합니다. 클래스 멤버는 기본적으로 private이므로, public 인터페이스를 명시적으로 만들어야 합니다. 다음을 제공하세요:- 앱 이름, 너비, 높이를 매개변수로 받는 생성자
- 이름을 반환하는 getter
getAppName() Dimensions를 반환하는 gettergetWindowSize()"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++에서 struct와 class는 거의 동일하지만, 한 가지 핵심적인 차이점이 있습니다. 바로 기본 접근 수준(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;
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.