9.6) 클래스의 정의와 구현 분리
클래스를 배웠다면 지금까지 작성했던 코드를 클래스를 정의하는 헤더파일(.h 확장자 파일)과 클래스를 실제로 구현하는 구현 파일(.cpp 확장자 파일) 두개로 나누어 작성할 수 있습니다.
이렇게 사용하는 첫번째 이유는 유지보수가 쉽고 전체적인 프로그램 관리가 편리하기 때문입니다. '.cpp 파일'로만 프로그램을 구성하면, 새로운 cpp파일(d)에서 이전 cpp파일(a)에 존재하는 함수를 사용하기 위해 매번 cpp파일(d) 안에 새로 선언을 해주어야 해야 합니다. 이렇게 되면 cpp파일을 여러 개 사용하는 경우에 버그가 생겨도 수정하기 까다롭겠죠? 또 재사용시 전체 파일을 뒤져가며 코드를 작성해야 합니다. 더 상세한 설명을 듣고 싶다면 아래 블로그를 참고해주세요.
컴파일과정 정리 / cpp와 h를 나누는 이유?
c언어등은 고급언어로 프로그래머가 작성하기는 쉽지만 cpu가 그대로 이해할 수 없다. 일련의 컴파일 과정을 거쳐서 cpu가 이해할 수 있는기계어로 번역이 되어야 한다. 그 과정을 컴파일 과정이
namoeye.tistory.com
두번째 이유는 스프트웨어 공급업체의 지적재산권을 보호할 수 있다는 것입니다. 헤더 파일을 비공개한 상태로 프로그램을 배포할 수 있다는 장점이 있습니다.
.cpp 파일에 Circle.h 파일을 include 했기 때문에 실행될 때, 코드-> (컴파일) -> 오브젝트 파일 -> (링킹) -> 실행 파일 -> (로드) -> 메모리 적재 및 수행 과정을 거칠 수 있습니다.
//Circle.h
class Circle
{
public:
double radius;
Circle();
Circle(double newRadius);
double getArea();
};
//circle.cpp
#include <iostream>
#include "Circle.h"
using namespace std;
Circle::Circle() {
radius = 1;
}
Circle::Circle(double newRadius) {
radius = newRadius;
}
double Circle::getArea() {
return radius * radius * 3.14159;
}
int main() {
Circle circle1;
Circle circle2(5.0);
cout << "The area of the circle of radius " << circle1.radius
<< " is " << circle1.getArea() << endl;
cout << "The area of the circle of radius " << circle2.radius
<< " is " << circle2.getArea() << endl;
circle2.radius = 100;
cout << "The area of the circle of radius "
<< circle2.radius << " is " << circle2.getArea() << endl;
return 0;
}
체크 포인트)
9.10) 클래스의 정의와 구현을 어떻게 분리하는가?
: .h 확장자 파일과 .cpp확장자 파일로 분리할 수 있습니다.
9.11) 다음 코드의 출력은 무엇인가? (Circle.h와 circle.cpp에 정의된 Circle클래스를 사용한다.)
//a
int main()
{
Circle c1();
Circle c2(6);
c1=c2;
cout << c1.getArea() << endl;
return 0;
}
식에 클래스 형식이 있어야 한다는 오류가 뜹니다. default 생성자는 괄호가 있으면 안되기 때문에 Circle c1;로 바꾸어 실행하면 아래와 같은 결과가 나옵니다.
//b
#include <iostream>
#include "Circle.h"
using namespace std;
Circle::Circle() {
radius = 1;
}
Circle::Circle(double newRadius) {
radius = newRadius;
}
double Circle::getArea() {
return radius * radius * 3.14159;
}
int main()
{
cout << Circle(8).getArea() << endl;
return 0;
}
9.7) 다중 포함 방지
헤더(b) 안에 'circle클래스가 들어 있는 헤더(a)'가 포함되어 헤더(b)를 헤더(c)가 include하게 되면 여러 번 정의되었다고 하는 컴파일 오류가 표시된다. 이것을 다중 포함이라고 하는데 이것이 일어나는 이유를 알기 위해서는 전처리기에 대해 알아야 합니다.
전처리기 중 #include 지시자는 '#include 헤더' 위치에 지정한 파일의 내용을 붙여넣는 과정을 해줍니다. #define 지시자는 'define 매크로이름 매크로몸체' 형태를 하고 있습니다. define 지시자 이후로 매크로이름이 나올때마다 매크로 이름을 매크로 몸체로 치환합니다. 그대로 치환하면서 나오는 숫자 연산 과정이 독특하기 때문에 아래의 블로그를 보시는 것을 추천드립니다.
C언어 프로그래밍 - 전처리(선행처리), #include, #define 지시자
코드를 작성한 후 컴파일 버튼을 누르면 코드에 따른 프로그램이 실행된다. 이렇듯 컴파일러는 사용자가 작...
blog.naver.com
이 책에서는 다중포함 오류를 방지하기 위해서 Circle.h를 다음과 같이 작성하였습니다.
#ifndef CIRCLE_H //만일 정의되어 있지 않으면 define으로 클래스이름_H해서 클래스 정의
#define CIRCLE_H
class Circle
{
public:
double radius;
Circle();
Circle(double newRadius);
double getArea();
};
#endif
9.12) 다중포함 오류가 발생하는 이유는 무엇인가? 헤더파일이 여러 번 포함되는 것을 방지하는 방법은 무엇인가?
: 헤더파일이 여러 번 포함되어 발생한다. 방지하기 위해 ifndef 지시자, endif 지시자 안에 define 지시자를 넣어 클래스를 정의한다
9.13) #define 지시사는 어떤 경우에 사용하는가?
: 상수나 문장에 대해 매크로명을 정의해주는 작업을 해준다. 매크로이름을 매크로몸체로 치환해준다.
'c, c++ > c++로 시작하는 객체지향 프로그래밍' 카테고리의 다른 글
11.1~11.5 (1) | 2024.04.04 |
---|---|
10.3~10.10 (2) | 2024.03.28 |
9.8~9.10)클래스에서 함수와 변수 (0) | 2024.02.02 |
확인할 수 없는 외부 참조 오류 (0) | 2024.01.27 |
9.1~9.5) 클래스와 객체 생성 (0) | 2024.01.21 |