중첩 클래스와 내부 클래스
Coddy C++ 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨 — 104개 중 38번째.
중첩 클래스(nested class)는 다른 클래스 내부에 정의된 클래스입니다. 이 기법은 관련된 타입들을 함께 그룹화하여 코드를 정리하는 데 도움이 되며, 구현 세부 사항을 숨김으로써 캡슐화를 강화할 수 있습니다.
class LinkedList {
public:
class Node { // 중첩 클래스
int data;
Node* next;
public:
Node(int d) : data(d), next(nullptr) {}
friend class LinkedList;
};
private:
Node* head;
public:
LinkedList() : head(nullptr) {}
};중첩 클래스인 Node는 LinkedList와 밀접하게 결합되어 있습니다. 이는 해당 컨텍스트 내에서만 의미가 있습니다. 이를 중첩함으로써 이러한 관계를 나타내고 "Node"와 같은 일반적인 이름으로 전역 네임스페이스를 오염시키는 것을 방지합니다.
중첩 클래스는 여러분이 배운 것과 동일한 접근 규칙을 따릅니다. private 섹션에 선언된 중첩 클래스는 외부 클래스 내에서만 접근할 수 있습니다.
public으로 선언되면 외부 코드에서 범위 연산자를 사용하여 이를 사용할 수 있습니다:
LinkedList::Node node(42); // Node가 public인 경우에만한 가지 중요한 세부 사항: 중첩 클래스는 외부 클래스의 private 멤버에 자동으로 접근할 수 없습니다. 이들은 단지 네임스페이스를 공유하는 별개의 클래스일 뿐입니다.
중첩 클래스에 접근이 필요한 경우, 위의 예제에서 보여준 것처럼 이를 friend로 선언해야 합니다.
챌린지
쉬움프로젝트 내에서 작업이 구성되는 간단한 작업 관리 시스템을 구축해 보겠습니다. 이는 중첩 클래스(nested classes)를 사용하기에 완벽한 시나리오입니다. Task는 Project라는 컨텍스트 내에서만 의미가 있으므로, 코드를 체계적으로 유지하고 전역 네임스페이스를 오염시키지 않도록 내부에 중첩시킬 것입니다.
코드를 구성하기 위해 두 개의 파일을 생성합니다:
Project.h: 중첩된Task클래스를 포함하는Project클래스를 정의합니다.중첩된
Task클래스는 외부에서 접근할 수 있도록Project의 public 섹션에 선언되어야 합니다. 이 클래스는 작업 이름(string)과 완료 상태(bool)를 저장해야 합니다. 이름을 매개변수로 받고 작업을 기본적으로 미완료 상태로 설정하는 생성자를 만드세요. 작업을 완료로 표시하는complete(), 상태를 확인하는isComplete(), 이름을 가져오는getName()메서드를 포함하세요.Project클래스 자체는 프로젝트 이름(string)과Task포인터 컬렉션을 저장해야 합니다. 프로젝트 이름을 받는 생성자, 새 작업을 생성하여 프로젝트에 추가하는addTask(const std::string& taskName)메서드, 이름으로 작업을 찾아 완료하는completeTask(const std::string& taskName)메서드, 그리고 프로젝트 이름과 각 작업의 상태를 보여주는displayStatus()메서드를 제공하세요.Task가Project내부에 중첩되어 있으므로,Project클래스는 작업들과 직접적으로 상호작용할 수 있습니다. 소멸자에서 동적으로 할당된 작업들을 정리하는 것을 잊지 마세요.main.cpp: 입력으로부터 프로젝트 이름과 두 개의 작업 이름(총 세 줄)을 읽어 모든 것을 하나로 합칩니다. 주어진 이름으로Project를 생성하고, 두 작업을 모두 추가한 다음 초기 상태를 표시합니다. 첫 번째 작업을 완료하고 상태를 다시 표시하여 변경 사항을 보여줍니다.displayStatus()의 출력 형식은 다음과 같아야 합니다:Project: <project_name> - <task_name>: [incomplete] - <task_name>: [complete]각 작업의 상태에 따라
[complete]또는[incomplete]를 사용하세요.
이 챌린지는 중첩 클래스가 관련 유형을 구성하는 데 어떻게 도움이 되는지 보여줍니다. Task 클래스는 Project와 밀접하게 결합되어 있으며 단독으로는 의미가 없습니다. 이를 중첩함으로써 코드 구조에서 이러한 관계를 명확하게 나타낼 수 있습니다.
치트 시트
중첩 클래스(nested class)는 다른 클래스 내부에 정의된 클래스입니다. 이는 관련된 타입들을 함께 그룹화하여 코드를 정리하는 데 도움을 주며 캡슐화를 향상시킵니다.
class LinkedList {
public:
class Node { // 중첩 클래스
int data;
Node* next;
public:
Node(int d) : data(d), next(nullptr) {}
friend class LinkedList;
};
private:
Node* head;
public:
LinkedList() : head(nullptr) {}
};중첩 클래스는 표준 접근 규칙을 따릅니다. private 섹션에 있는 중첩 클래스는 외부 클래스 내에서만 접근할 수 있습니다. public으로 선언되면, 외부 코드에서 범위 지정 연산자를 사용하여 이를 사용할 수 있습니다:
LinkedList::Node node(42); // Node가 public인 경우에만 가능중첩 클래스는 외부 클래스의 private 멤버에 자동으로 접근할 수 없습니다. 접근이 필요한 경우, friend로 선언하십시오:
friend class LinkedList;직접 해보기
#include <iostream>
#include <string>
#include "Project.h"
using namespace std;
int main() {
// 입력 읽기
string projectName;
string task1Name;
string task2Name;
getline(cin, projectName);
getline(cin, task1Name);
getline(cin, task2Name);
// TODO: 주어진 이름으로 Project 생성하기
// TODO: 프로젝트에 두 작업 모두 추가하기
// TODO: 초기 상태 표시하기
// TODO: 첫 번째 작업 완료하기
// TODO: 변경 사항을 보여주기 위해 상태를 다시 표시하기
return 0;
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.