Menu
Coddy logo textTech

중첩 클래스와 내부 클래스

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) {}
};

중첩 클래스인 NodeLinkedList와 밀접하게 결합되어 있습니다. 이는 해당 컨텍스트 내에서만 의미가 있습니다. 이를 중첩함으로써 이러한 관계를 나타내고 "Node"와 같은 일반적인 이름으로 전역 네임스페이스를 오염시키는 것을 방지합니다.

중첩 클래스는 여러분이 배운 것과 동일한 접근 규칙을 따릅니다. private 섹션에 선언된 중첩 클래스는 외부 클래스 내에서만 접근할 수 있습니다.

public으로 선언되면 외부 코드에서 범위 연산자를 사용하여 이를 사용할 수 있습니다:

LinkedList::Node node(42);    // Node가 public인 경우에만

한 가지 중요한 세부 사항: 중첩 클래스는 외부 클래스의 private 멤버에 자동으로 접근할 수 없습니다. 이들은 단지 네임스페이스를 공유하는 별개의 클래스일 뿐입니다.

중첩 클래스에 접근이 필요한 경우, 위의 예제에서 보여준 것처럼 이를 friend로 선언해야 합니다.

challenge icon

챌린지

쉬움

프로젝트 내에서 작업이 구성되는 간단한 작업 관리 시스템을 구축해 보겠습니다. 이는 중첩 클래스(nested classes)를 사용하기에 완벽한 시나리오입니다. TaskProject라는 컨텍스트 내에서만 의미가 있으므로, 코드를 체계적으로 유지하고 전역 네임스페이스를 오염시키지 않도록 내부에 중첩시킬 것입니다.

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

  • Project.h: 중첩된 Task 클래스를 포함하는 Project 클래스를 정의합니다.

    중첩된 Task 클래스는 외부에서 접근할 수 있도록 Projectpublic 섹션에 선언되어야 합니다. 이 클래스는 작업 이름(string)과 완료 상태(bool)를 저장해야 합니다. 이름을 매개변수로 받고 작업을 기본적으로 미완료 상태로 설정하는 생성자를 만드세요. 작업을 완료로 표시하는 complete(), 상태를 확인하는 isComplete(), 이름을 가져오는 getName() 메서드를 포함하세요.

    Project 클래스 자체는 프로젝트 이름(string)과 Task 포인터 컬렉션을 저장해야 합니다. 프로젝트 이름을 받는 생성자, 새 작업을 생성하여 프로젝트에 추가하는 addTask(const std::string& taskName) 메서드, 이름으로 작업을 찾아 완료하는 completeTask(const std::string& taskName) 메서드, 그리고 프로젝트 이름과 각 작업의 상태를 보여주는 displayStatus() 메서드를 제공하세요.

    TaskProject 내부에 중첩되어 있으므로, 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;
}
quiz icon실력 점검

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

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