[C++] 구조체

cheon2308
|2023. 11. 29. 17:15
728x90

황기태 저자의 명품 C++ Programming 개정판을 읽고 학습한 내용을 정리한 포스트입니다!

https://search.shopping.naver.com/book/catalog/32436115747

 

C++ Programming : 네이버 도서

네이버 도서 상세정보를 제공합니다.

search.shopping.naver.com

 

구조체

선언
  • 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