[42seoul] CPP Module 00 - Phonebook 만들어보기

tpwhzla·2023년 8월 24일

42Seoul

목록 보기
7/16

CPP Module 00 / CPP와 친해지기

CPP 과제를 먼저 수행한 사람들이 해준 조언에 따르면, CPP의 형태 자체가 main함수를 간단하게 만든다고 한다.

class PhoneBook
{
    private:
    Contact contacts[MAX_CONTACTS];
    int currentContact;
    
    public:
    PhoneBook();
    ~PhoneBook();

    void StartPhoneBook();
    void AddContact();
    void SearchContact();
};

#endif

main 함수에서는 PhoneBook class를 선언한 후 StartPhoneBook 함수를 호출하면 프로그램이 완벽하게 작동하도록 설계를 하였다.

#include "Contact.hpp"
#include "Phonebook.hpp"

int main(void)
{
    PhoneBook a;
    a.StartPhoneBook();

    return 0;
}
void    PhoneBook::StartPhoneBook()
{
    std::string cmd;

    std::cout << "Enter command: ";
    while(42)
    {
        if(!std::getline(std::cin, cmd))
            break ;
        if (cmd.empty())
        {
            std::cout << "Enter command: ";
            continue;
        }
        else if (cmd == "ADD")
            AddContact();
        else if (cmd == "SEARCH")
            SearchContact();
        else if (cmd == "EXIT")
           break ;
        else
            std::cout << "Wrong command" << std::endl;
    
        std::cout << "Enter command: ";
    }
}

cpp부터는 형식에 크게 얽매일 필요는 없고, 정확하게 서브젝트가 요구하는 바만 따르면 된다.

PhoneBook이 시작되면 ADD, SEARCH, EXIT 세 명령어 중 한 명령어를 받게되고, 이 세 명령어가 아닐 때는 잘못된 커맨드를 출력했다는 표준출력을 남긴다.

if (!std::getline(std::cin, cmd)) 는 미니쉘에서 readline을 루프 안에서 받아오는 과정에서,
EOF(Ctrl + D)를 받았을 때 line을 free 해주는 것과 비슷한 로직이다.

EOF를 받을 경우 std::getline 함수는 실패하게 되고, std::cin.fail()이 TRUE 상태가 되게 된다.
따라서, EOF를 받는 경우(getline 실패의 경우) while loop 바깥을 빠져나가게 하여야 함수가 제대로 작동한다.


#include <iostream>

class Contact
{
    private:
    std::string firstName;
    std::string lastName;
    std::string nickname;
    std::string phoneNumber;
    std::string darkestSecret;

    public:
    Contact();
    ~Contact();

    void    SetFirstName(std::string firstName);
    void    SetLastName(std::string lastName);
    void    SetNickname(std::string nickname);
    void    SetPhoneNumber(std::string phoneNumber);
    void    SetDarkestSecret(std::string darkestSecret);
    std::string    GetFirstName();
    std::string    GetLastName();
    std::string    GetNickname();
    std::string    GetPhoneNumber();
    std::string    GetDarkestSecret();
};

#endif

Contact 클래스는 이렇게 선언한다.
여기서 CPP 02에 나오는 Getter, Setter 개념이 나오는데, CPP의 캡슐화 원칙에 따른다.

캡슐화(Encapsulation)

클래스의 내부 데이터를 직접 노출하지 않고, 메서드를 통해 접근하게 하여 클래스의 내부 구현을 외부로부터 숨길 수 있다. 이를 통해 객체의 상태를 제어하고 유효성 검사를 수행할 수 있다.

유연성

나중에 클래스의 내부 구현이 변경되더라도, getter와 setter의 인터페이스를 유지함으로써 외부 코드의 수정 없이 내부 구현을 변경할 수 있다.

추가 로직의 구현

예를 들어, 속성 값이 변경될 때마다 로깅을 수행하거나, 특정 조건을 검사하려면 setter 내에 해당 로직을 추가할 수 있다.

profile
DevOps / Infrastructure / Cloud Native / Platform Engineering

0개의 댓글