• [C++] 하나의 긴 소스파일을 여러 파일로 분할하여 관리하기.

    2023. 9. 14.

    by. KAEY


    ✨ INTRO 

    저번에 파일 입출력 때도 그랬지만, 소스 파일이라는게 한 곳에 몰아서 메소드를 작성하고 하다 보면

    굉장히 길어지기 마련이었다. 나 혼자 개발했다면 해당 코드들이 길어져도 어느 정도 

    사용하고자 하는 메소드의 위치나 개발 플로우 정도는 파악하고 있어서 당장은 문제가 없다 생각이 들기도 한다.

     

     

    하지만 그 코드를 몇 달뒤, 당장 몇 주 동안 안보다가 보게 되면 기억이 가물가물하기 마련이고.

    이를 보완하서 직관적으로 클래스나 메소드를 각기 분할하여 개발자가 이해하기 쉽게 하고, 

    협업할 때 역시 효율적으로 코드를 공유하고 이해하기 위한 기술이자 관리 방법이라 볼 수 있다. 😊

     

     


    헤더 파일

    • 확장자 .h

    • 클래스, 함수 등의 선언부 코드를 모아두는 곳

     

     

    소스 파일

    • 확장자 .cpp

    • 클래스, 함수 등의 구현부 코드를 모아두는 곳

     

     

    파일 분할시 무한 참조 현상이 발생할 수 있는 문제가 생길 수 있다. 

    따라서 헤더 파일에서 pragma once를 작성해주면 좀 좋다.

    생성 시에 자동으로 추가되어 있음. 혹은 #ifndef ~ #endif 으로 묶어도 된다.

     

     

     

    #pragma once
    • 한번 읽어가면 추가적으로 읽지 않도록하는 기능
    • 빌드 시간을 줄일 수 있음

     

     

     

    #ifndef ~ #endif

    #ifndef __PERSON_H__ // __PERSON_H__가 define 되지 않았다면, 
    #define __PERSON_H__ // __PERSON_H__를 정의한다. #endif가 나오기 전까지
    class Person {
    }
    #endif

     

     


    과자 바구니

    기존에 작성했었던 과자 바구니 실습 코드를 분리해서 cpp 파일과 h (헤더 파일)로 나눠서 관리하고자 한다.

     

     

    기존 코드 참고 >

    깃 허브 링크 참조 (클릭시 새창으로 열립니다.)

     


    Snack.h 

     //Snack.h 파일입니다
    #pragma once
    #include <iostream>
    #include <string>
    
    class Snack {
    protected:
        int price;
        std::string name;
        std::string maker;
        static int count;
    
    public:
        Snack();
        virtual ~Snack();
    
        static int get_count();
        std::string get_name();
    
        virtual void show_info(); //자식에게 오버라이딩
    
    };
    
    class Candy : public Snack {
        std::string flavor;
    
    public:
        Candy(std::string flavor);
    
        void show_info();
    
    };
    
    class Chocolate : public Snack {
        std::string shape;
    
    public:
        Chocolate(std::string shape);
        void show_info() override;
    };

    위처럼 부모 클래스인 Snack 을 헤더 파일에서 생성해서 부모와 자식 클래스들의 기본적으로 가지고 있었던

    뼈대를 헤더 파일로 생성하고, cpp 파일을 생성할 때 해당 헤더 파일을 include 하여 구체화했다.

     

     

     

    Snack.cpp 

    #include "Snack.h"
    using namespace std;
    
    int Snack::count = 0;
    
    Snack::Snack() {
        count++;
    }
    
    Snack::~Snack() {
        count--;
    }
    
    int Snack::get_count() {
        return count;
    }
    
    string Snack::get_name() {
        return name;
    }
    
    void Snack::show_info() {
        cout << "(분할 테스트) 과자입니다~ " << std::endl;
    }

    위 처럼 분할하여 헤더파일을 추가하고 이를 구체화 하였다.

     

     

     

    Chocolate.cpp

    #include "Snack.h"
    
    using namespace std;
    
    Chocolate::Chocolate(string shape) {
        this->price = 200;
        this->name = "(분할 테스트) 초콜렛";
        this->maker = "(분할 테스트) 롯데";
        this->shape = shape;
    }
    
    void Chocolate::show_info() {
        cout << "(분할 테스트) " << shape << " 맛 초콜렛" << endl;
    }

    초콜렛 클래스 역시 이를 분리해서 생성한다. 

     

     

    이렇게 파일을 몇 개로 나눴을 뿐인데, 코드의 가독성이 늘었을 뿐 아니라 코드를 수정하기에도 용이해졌다.

    기존에 메인 영역에서 작성하다가 위에 확인하러 드래그를 하면서 올라가는 것도 생각보다

    많이 번거롭고 위아래를 왕복하면서 코드를 보다보면 생각보다 햇갈리는 경우도 많은데,

    지금처럼 파일을 분할해놓으면 파일 탐색기에서 즉각적으로 확인이 가능하다.

     

     

     

    즉, 옆으로 마우스 딸깍딸깍 몇 번이면 코드를 왔다 갔다 하면서 보기가 용이해졌다.

    이게 진짜 별 거 아닌데, 이번에 직접 한 번 해보니까 진짜 쾌적함이 달라진게 느껴진다.

    코드들도 간략하게 축약되서 기존처럼 어떤 값들이 예상되고 논리를 적어놔야 좀 용이했는데,즉각저으로 보이니까 좀 편한 느낌.....😊

     

     


     

    🎉해당 글의 내용은 "포스코 x 코딩온 스마트 팩토리 과정 수업" 에서의 수업 자료 및 실습 과제 등에서 일부 발췌되어 작성 되었습니다.


    댓글 (비로그인 댓글 허용하지 않습니다.)