C++ Practice

Study C++ Developer RoadMap (4)

Srff5123 2025. 2. 19. 21:15
728x90

1. 코드베이스 구조화(Structurig Codebase)

코드베이스를 구조화하는 것은 유지 관리가 더 쉽고 효율적이며 이해하기 쉽게 만들기 위해 코드를 구성하고

모듈화하는 것을 다루는 소프트웨어 개발의 필수적인 부분이다.

잘 구조화된 코드베이스는 협업을 강화하고, 새로운 기능 추가를 간소화하며, 디버깅 속도를 높입니다.

C++ 에는 코드베이스를 효과적으로 구성하는 데 도움이 되는 다양한 기술이 있다.

 

1. 네임스페이스(Namespaces)

네임스페이스는 함수, 클래스 및 변수와 같이 사용자가 만드는 다양한 식별자에 대해 명명된 범위를 제공하여

코드를 구성하는 C++의 도구 중 하나이다.

이름 충돌을 피하고 코드를 보다 모듈화하는 데 도움이 된다.

 

2. Include Guards

프로젝트에 헤더 파일이 여러 번 포함되는 것을 방지하기 위한 도구이다.

헤더 파일이 여러 위치에 포함되어 있더라도 조건부로 헤더파일을 한 번만 포함하는 전처리기 지시문으로 구성된다.

 

3. 헤더 및 소스 파일

구현과 선언을 헤더.h 파일과 소스.cpp 파일로 분리하는 것은 C++에서 코드베이스를 구성하는 데 있어

중요한 부분이다. 헤더 파일에는 일반적으로 클래스 및 함수 선언이 포함되고 소스 파일에는 해당 정의가 포함된다.

 

cpp 소스 파일

 

.h 헤더 파일

 

4. 코드 서식 지정

일관된 코드 서식 및 들여쓰기는 코드베이스를 구성하는 데 중요한 역할을 하여 사용자와 다른 개발자 모두가 더 쉽게 읽고

이해할 수 있도록 한다.

Google C++ 스타일 가이드 와 같은 스타일 가이드를 사용하면 프로젝트 전체에서 일관된 서식을 유지할 수 있다.

 

2. C++의 구조체(Structures) 및 클래스(Class)

 

구조체 및 클래스는 C++의 사용자 정의 데이터 유형으로, 단일 이름으로 서로 다른 데이터 유형의 변수를 그룹화할 수 있다.

특정 속성과 동작을 가진 객체를 만들어 복잡한 데이터를 더 쉽게 관리하고 구성할 수 있다.

구조체와 클래스의 주요 차이점은 기본 액세스 지정자이다.

구조체의 멤버는 기본적으로 public인 반면 클래스의 멤버는 private이다.

 

1. 구조체

구조체는 키워드를 사용하여 정의되며, 그 뒤에 구조체의 이름과 구조체의 멤버(변수, 또는 함수)를 둘러싸는 중괄호 집합으로 이루어진다.

멤버는 서로 다른 데이터 유형일 수 있으며, 구조체 형식의 객체를 만들려면 구조체 이름 뒤에 객체 이름을 사용한며,

구조체의 멤버는 dot 연산자를 사용하여 액세스 할 수 있다.

 

2. 클래스

클래스 또한 구조체와 똑같이 키워드를 사용해 정의하며, 클래스 이름과 클래스의 멤버를 둘러싸는 중괄호 집합으로 이루어지며, 클래스 멤버도 서로 다른 데이터 유형일 수 있다.

클래스 이름 뒤에 객체 이름을 사용하여 클래스의 객체를 만들 수 있다.

 

클래스의 데이터 멤버는 기본적으로 비공개이므로 클래스 외부에서 도트연산자를 사용하여 직접 액세스할 수 없다.

대신 public member 함수를 사용하여 값을 설정하거나 가져온다.

 

3. 0,5,3 법칙(Rule of Zero, Five, Three)

C++에서 0, 5, 3의 법칙

Rule of Zero, Three and Five는 구조체 및 클래스와 관련된 최신 C++에서 객체 리소스를 관리하기 위한 일련의 지침이다

이러한 규칙은 생성자, 소멸자 및 적절한 리소스 관리에 필요한 기타 특수 멤버 함수의 기본 동작을 처리한다.

 

1. 제로의 법칙(Rule of Zero)

클래스 또는 구조체가 리소스를 명시적으로 관리하지 않는 경우 특수 멤버 함수(소멸자, 복사 생성자, 복사 할당 연산자, 이동 생성자 및 이동 할당 연산자)를 정의해서는 안 된다고 명시한다.

컴파일러는 이러한 함수를 자동으로 생성하며, 동작은 메모리 및 파일 핸들과 같은 리소스를 관리하는 데 적합하다.

 

이 예제에서 MyResource는 리소스를 관리하지 않는 간단한 구조체로

특별한 멤버 함수를 정의하지 않는다. 컴파일러는 자동으로 생성하고 동작이 정확하다.

 

2. 3의 법칙(Rule of Three)

리소스를 관리하는 클래스 또는 구조체가 다음 세 가지 특수 멤버 함수를 정의한다.

소멸자, 복사 생성자, 복사 할당 연산자

이러한 기능은 메모리 해제 또는 깊은 복사(Deep Copy)를 올바르게 처리하는 것으로

적절한 리소스 관리에 필요하다.

 

이 예제에서 MyResource는 리소스(정수 배열)를 관리하는 클래스이므로 소멸자, 복사 생성자 및 복사 할당 연산자를 

정의한다.

 

3. 5의 법칙(Rule of Five)

3의 법칙을 확장하여 두 개의 추가 특수 멤버 함수를 포함한다.

생성자 이동, 이동 할당 연산자

 

최신 C++은 모든 데이터를 복사할 필요 없이 소유권을 전송하여 리소스를 보다 효율적으로 처리할 수 있는 이동 의미 체계를 도입했다.

 

이 예제에서 MyResource는 리소스(정수배열)를 관리하는 클래스로

적절한 리소스 관리 및 이동 의미 체계를 위해5개의 특수 멤버 함수를 모두 정의한다. 

 

4. 다중 상속

클래스가 둘 이상의 부모 클래스에서 특성(데이터 멤버, 및 멤버 함수)을 상속할 수 있는 C++의 기능이다.

이 개념은 단일 상속(클래스가 단일 기본 클래스에서 상속되는 경우)과 비슷하지만 다중 상속에서는

클래스에 여러 기본 클래스가 있을 수 있다.

 

클래스가 여러 기본 클래스를 상속하면 해당 속성과 동작이 혼합되며 필요에 따라 재정의하거나 확장할 수 있다.

 

1.구문(Syntax)

다중 상속을 가진 클래스를 선언하는 구문

 

둘다 멤버를 상속하며

상속된 멤버의 접근성을 결정한다.

2. 예시

 

어떤 경우에는 다중 상속으로 인해 "다이아몬드 상속 문제"와 같은 합병증이 발생할 수 있다.

여러 상속을 현명하게 사용하고 잘 구조화된 모듈식 클래스를 유지 관리해 방지해야 한다.

 

5. 다이아몬드 상속(Diamond Inheitance)

다이아몬드 상속은 클래스가 두 개 이상의 클래스에서 파생되고, 이 클래스는 다시 공통 기본 클래스에서 파생되는

다중 상속의 특정 시나리오이다.

이는 공통 기본 클래스를 복제함으로써 발생하는 모호성을 생성하며, 이는 중복 멤버를 호출하는 동안 모호한 동작으로 이어진다.

 

이러한 모호성을 해결하기 위해 가상 상속을 사용할 수 있다. 가상 기본 클래스는 C++에서 키워드를 사용하여

여러 클래스가 공유하는 클래스이다.

이렇게 하면 기본 클래스의 복사본이 최종 파생 클래스에서 하나만 상속되므로 다이아몬스 상속 문제가 해결된다.

virtual

 

예시

 

위의 코드에서는 가상 상속을 사용하여 클래스에서 파생된다.

객체를 생성하고 클래스에서 함수를 호출할 때 모호함이 없으며 코드는 문제없이 잘 실행이 된다.

 

참고 자료 : C++ Developer Roadmap

 

C++ Developer Roadmap

Community driven, articles, resources, guides, interview questions, quizzes for C++ development. Learn to become a modern C++ developer by following the steps, skills, resources and guides listed in this roadmap.

roadmap.sh

정리 내용 : Structuring Codebase) -> Structures and classes -> Rule of Zero, Five, Three ->

Multiple Inheritance -> Diamond Inheritance 까지 

728x90