티스토리 뷰

🟩 오늘의 목표

  • 추상 클래스와 상속을 활용하여 확장 가능한 프로그램을 설계한다.
  • STL 컨테이너(vector, map)와 알고리즘(sort)을 실무에 적용한다.
  • 인터페이스(MovieProcessor)를 통해 기능 단위로 코드를 분리하는 방법을 익힌다.

 

🟧 1. 객체지향 설계와 추상 클래스


🟦 추상 클래스 MovieProcessor

  • 역할: 영화 데이터를 처리하는 공통 인터페이스를 정의한다.
  • 특징: process(vector<Movie>&) 함수를 순수 가상 함수로 선언하여, 이를 상속받는 클래스들이 각자 정렬이나 필터링 등 구체적인 로직을 구현하도록 강제한다.

🟦 다형성 활용 (processMovies)

  • 장점: MovieManager는 구체적으로 어떤 처리(정렬 혹은 필터링)가 일어나는지 알 필요가 없다. 단지 MovieProcessor 타입의 객체를 인자로 받아 process()를 호출함으로써 개방 폐쇄 원칙(OCP)을 준수한다.

 

🟧 2. STL 컨테이너 및 알고리즘 활용


🟦 효율적인 데이터 저장과 검색

  • vector: 영화 정보를 순차적으로 저장하고 목록을 출력할 때 사용한다.
  • map: 영화 제목을 Key, 평점을 Value로 저장하여 특정 영화를 제목으로 검색할 때 $O(\log N)$의 빠른 속도로 찾아낸다.

🟦 정렬 알고리즘 (std::sort)

  • 사용자 정의 정렬: std::sort는 기본적으로 오름차순으로 동작하지만, compareMovies 함수를 만들어 세 번째 인자로 전달함으로써 평점 기준 내림차순 정렬을 구현한다.

 

🟧 3. 프로그램 구현 코드 및 주석 해설


#include <iostream>
#include <vector>
#include <map>
#include <algorithm>
#include <string>

using namespace std;

// 영화 정보를 담는 구조체
struct Movie {
    string title;
    double rating;
};

// 추상 클래스: 영화 데이터 처리를 위한 인터페이스 역할
class MovieProcessor {
public:
    // 순수 가상 함수: 상속받는 클래스에서 반드시 구현해야 함
    virtual void process(vector<Movie>& movies) = 0;
    virtual ~MovieProcessor() {} // 가상 소멸자
};

// 영화 관리 클래스
class MovieManager {
private:
    vector<Movie> movies;       // 전체 목록 저장용
    map<string, double> movieMap; // 빠른 제목 검색용

public:
    MovieManager() {
        // 초기 데이터 설정
        movies = {
            {"Inception", 9.0},
            {"Interstellar", 8.6},
            {"The Dark Knight", 9.1},
            {"Memento", 8.4}
        };

        // 검색을 위해 맵에 데이터 복사
        for (const auto& movie : movies) {
            movieMap[movie.title] = movie.rating;
        }
    }

    // 기본 목록 출력
    void printMovies() {
        cout << "영화 목록:\n";
        for (const auto& movie : movies) {
            cout << "제목: " << movie.title << ", 평점: " << movie.rating << "\n";
        }
    }

    // 맵을 활용한 효율적인 영화 검색
    void findMovie(const string& title) {
        auto it = movieMap.find(title);
        if (it != movieMap.end()) {
            cout << "영화 제목: " << it->first << ", 평점: " << it->second << "\n";
        } else {
            cout << "해당 영화는 목록에 없습니다.\n";
        }
    }

    // 외부에서 정의된 프로세서(정렬, 필터 등)를 실행하는 함수
    void processMovies(MovieProcessor& processor) {
        processor.process(movies);
    }
};

// 정렬 기준 정의: 평점 내림차순
bool compareMovies(const Movie& a, const Movie& b) {
    return a.rating > b.rating;
}

// 영화 평점 기준 정렬 클래스
class RatingSorter : public MovieProcessor {
public:
    void process(vector<Movie>& movies) override {
        // STL sort 함수 사용 (내림차순)
        sort(movies.begin(), movies.end(), compareMovies);

        cout << "평점 기준 정렬된 영화 목록:\n";
        for (const auto& movie : movies) {
            cout << "제목: " << movie.title << ", 평점: " << movie.rating << "\n";
        }
    }
};

// 평점 필터링 클래스
class RatingFilter : public MovieProcessor {
private:
    double minRating; // 기준 평점
public:
    explicit RatingFilter(double minRating) : minRating(minRating) {}

    void process(vector<Movie>& movies) override {
        cout << "평점 " << minRating << " 이상인 영화 목록:\n";
        for (const auto& movie : movies) {
            if (movie.rating >= minRating) {
                cout << "제목: " << movie.title << ", 평점: " << movie.rating << "\n";
            }
        }
    }
};

 

🟧 4. 코드 세부 해설


🟦 RatingSorter 클래스 구현

  • MovieProcessor를 상속받아 process 함수를 재정의한다. 내부에서 std::sort와 compareMovies를 호출하여 벡터 내부 데이터를 직접 정렬하고 결과를 출력한다.

🟦 RatingFilter 클래스 구현

  • 생성자로 특정 평점(minRating)을 입력받아 멤버 변수에 저장한다. process 함수 호출 시 반복문을 통해 해당 평점 이상인 데이터만 선별하여 출력한다.

🟦 MovieManager의 검색 로직

  • movieMap.find(title)을 사용하여 데이터의 존재 여부를 확인한다. 반복자(it)가 end()를 가리키지 않으면 데이터를 찾은 것으로 간주하여 정보를 출력한다.

 

🟫 오늘 느낀 점

  • 추상 클래스를 인터페이스처럼 활용하여 요구사항이 늘어나도 기존 코드를 수정하지 않고 기능을 확장하는 객체지향 설계의 실무적인 적용법을 배웠다.

'내일배움캠프 Unreal_7기 > 본캠프' 카테고리의 다른 글

TIL - 21일차  (0) 2025.12.29
TIL - 20일차  (0) 2025.12.26
TIL - 18일차  (0) 2025.12.23
TIL - 17일차  (0) 2025.12.22
TIL - 16일차  (0) 2025.12.19