728x90
황기태 저자의 명품 C++ Programming 개정판을 읽고 학습한 내용을 정리한 포스트입니다!
https://search.shopping.naver.com/book/catalog/32436115747
구조체
선언
- C언어와의 호환성을 위해 구조체(struct) 지원
- C++ 구조체는 표준 C 구조체에 기능 확장 => 클래스와 동일한 구조와 기능
- struct 키워드로 선언, 멤버 변수와 함수 가지고 접근 지정도 해야 함
struct structName {
// 디폴트 접근 지정은 public. public 속성의 멤버 변수나 멤버 함수 선언
private:
// private 속성의 멤버 변수나 멤버 함수 선언
public:
// public 속성의 멤버 변수나 멤버 함수 선언
protected:
// protected 속성의 멤버 변수나 멤버 함수 선언
};
객체 생성
- 클래스 객체 선언 방식과 같이 구조체 타입 뒤에 객체 이름을 지정
structName stObj;
struct structName stObj; // c++에서 컴파일 오류. struct 키워드 사용불가
구조체와 클래스의 차이점
- 기능적으로는 동이랗다
- 멤버 변수, 생성자, 소멸자를 비롯한 멤버 함수를 가질 수 있으며, 다른 구조체나 클래스에게 상속 가능하고 다른 구조체나 클래스를 상속받을 수도 있다.
- 또한, 멤버들은 접근 지정자로 지정되며 멤버 활용 방법 또한 클래스와 완전히 동일
- 한 가지 차이점
- 클래스의 디폴트 접근 지정이 private
- 구조체는 public => C언어와의 호환성을 위해, 모든 멤버들이 공개적인 c 구조체를 c++에서 수용하기 위함
구조체보다는 클래스를 사용하자.
- 어떤 것을 사용하든 정답은 없다.
- 멤버 변수만 있는 자료 구조의 경우 구조체를 사용하기도 한다.
- 다만, c언어적 사고의 탈피를 위해 구조체의 사용을 피하는 것이 좋아보인다.
바람직한 C++ 프로그램 작성법
헤더 파일과 cpp 파일 분리
- 클래스마다 선언부는 헤더 파일에, 구현부는 cpp 파일에 분리하여 작성
- main() 등 함수나 전역 변수는 한 개 이상의 cpp 파일에 나누어 작성
클래스마다 클래스의 선언부와 구현부를 헤더 파일과 cpp 소스 파일로 분리하면 전체 프로그램을 관리하기 쉽고 클래스를 재사용하기 쉽다. => 클래스를 활용하는 코드들은 선언부가 들어 있는 헤더 파일만 include 하여 사용하면 된다.
- 만약 헤더 파일에 클래스의 구현부가 들어 있다면, 헤더 파일을 include 하는 여러 소스 파일에 구현부가 중복하여 들어가게 되므로, 링크 시 오류가 발생한다.
- c++ 컴파일러는 circle.cpp와 main.cpp를 컴파일하여 Circle.obj와 main.obj를 각각 생성하고, 이들을 링크하여 main.exe 실행 파일을 만든다.
헤더 파일을 중복 include 할 때 생기는 문제점 해결
- 한 가지 주의할 점은 클래스가 선언된 헤더 파일을 여러 번 include 하면, 중복 선언으로 인해 컴파일 오류가 발생
- 예를 들어, a.h 헤더 파일에서 b.h 헤더 파일을 내부적 include 하였는데, cpp 파일에서 a.h와 b.h 둘다 include 하면 결국 cpp 파일에는 b.h가 두 번 include 된다.
그럼 헤더 파일을 중복 include 해도 컴파일 오류가 발생하지 않도록 해보자.
- Circle.h헤더 파일에 조건 컴파일 문을 삽입하면 된다.
#ifndef CIRCLE_H
#define CIRCLE_H
class Circle {
private:
int radius;
public:
Circle();
Circle(int r);
double getArea();
};
#endif
- main.cpp에서 2번째 동일한 헤더 파일이 실행된다면 #ifndef에 의해 false를 return하여 #endif 문 밖으로 빠져나오게 됨.
728x90
'Programming Language > C++' 카테고리의 다른 글
[C++] 객체 포인터와 객체 배열 (0) | 2023.11.30 |
---|---|
[C++] 포인터 (1) | 2023.11.30 |
[C++] priority queue with Cpp (0) | 2023.11.29 |
[C++] 접근 지정자와 인라인 함수 (0) | 2023.11.29 |
[C++] 소멸자 (2) | 2023.11.29 |