방송통신대학교 생활기/Cpp

C++ 구조체, 클래스 차이 정리

함나현 2022. 9. 14. 13:47

원래 고등학교 다닐때 C 언어를 조금 했었다. 포인터 조금하고 AVR128로 하는 하드웨어 제어였으니까, PWM 제어 같은 것들을 배웠기 때문에 구조체에 대해서는 잘 모른다. 그동안 C++를 배워야지 생각은 했었는데 너무 내용이 방대해서 혼자하기 어렵다는 생각을 했었다. 특히 러스트가 흥미로워보여 러스트를 조금 해보았는데 C++에 있는 내용을 모르니 이해하기가 어려웠다. 다행히 이번에 1학년 2학기 신입생으로 입학하게 되면서 전공으로 C++를 배우게 되어 그 내용을 정리하고자 포스팅을 해본다.

 

해당 코드는 비주얼 스튜디오 2022 컴파일러로 실행하였습니다.

//Circles_struct.cpp

#include <iostream>
#include<cmath>
using namespace std;

const double PI = 3.141593;

struct C2dType
{
	//2차원 좌표 구조체
	double x, y;
};

struct CircleType
{
	//원구조체
	C2dType center; //중심 좌표
	double radius; //반경
};

double circleArea(CircleType c)
{
	return c.radius * c.radius * PI;
}

bool chkOverlap(CircleType c1, CircleType c2)
{
	double dx = c1.center.x - c2.center.x;
	double dy = c1.center.y - c2.center.y;
	double dCntr = sqrt(dx * dx + dy * dy);
	return dCntr < c1.radius + c2.radius;
}

void dispCircle(CircleType c)
{
	cout << " 중심 : (" << c.center.x << ", " << c.center.y << ")";
	cout << " 반경 : " << c.radius << endl;
}

int main()
{
	CircleType c1 = { {0, 0}, 10 }; // 중심이 (0, 0), 반경 10으로 초기화
	CircleType c2 = { {30,10}, 5 }; // 중심이 (30, 10), 반경 5로 초기화

	cout << "원1" << endl;
	dispCircle(c1);
	cout << " 원의 면적 : " << circleArea(c1) << endl;
	cout << "원2" << endl;
	dispCircle(c2);
	cout << " 원의 면적 : " << circleArea(c2) << endl << endl;

	// 두 원의 중첩 여부 출력
	if (chkOverlap(c1, c2))
		cout << "두 원은 중첩됩니다." << endl;
	else
		cout << "두 원은 중첩되지 않습니다." << endl;
	return 0;
}
//Circles_class.cpp

#include <iostream>
#include<cmath>
using namespace std;

const double PI = 3.141593;

struct C2dType
{
	//2차원 좌표 구조체
	double x, y;
};


class CircleClass
{
	//원 클래스
	C2dType center; //중심 좌표
	double radius; //반경
public:
	// 중심 (cx, cy), 반경 r 로 원을 초기화
	void init(double cx, double cy, double r)
	{
		center.x = cx;
		center.y = cy;
		radius = r;
	}
	//원의 면적 계산
	double area() const
	{
		return radius * radius * PI;
	}
	bool chkOverlap(const CircleClass& c) const
	{
		double dx = center.x - c.center.x;
		double dy = center.y - c.center.y;
		double dCntr = sqrt(dx * dx + dy * dy);
		return dCntr < radius + c.radius;
	}
	//원 객체의 정보 디스플레이
	void display() const
	{
		cout << " 중심 : (" << center.x << ", " << center.y << ")";
		cout << " 반경 : " << radius << endl;
	}

};






int main()
{
	CircleClass c1, c2;
	c1.init(0, 0, 10); // 중심이 (0, 0), 반경 10으로 초기화
	c2.init(30,10, 5); // 중심이 (30, 10), 반경 5로 초기화

	cout << "원1" << endl;
	c1.display();
	cout << " 원의 면적 : " << c1.area() << endl;
	cout << "원2" << endl;
	c2.display();
	cout << " 원의 면적 : " << c2.area() << endl << endl;

	// 두 원의 중첩 여부 출력
	if (c1.chkOverlap(c2))
		cout << "두 원은 중첩됩니다." << endl;
	else
		cout << "두 원은 중첩되지 않습니다." << endl;
	return 0;
}

해당 코드는 방송통신대학교 컴퓨터 과학과 C++ 프로그래밍 교재에 예제로 있는 프로그래밍으로 원 중심의 좌표와 반지름을 이용해 두 원의 면적과 중첩되는지를 확인하는 코드이다.

using namespace std; 같은 경우 실무에서는 사용하지 않는 것이 좋다고 들었으나, 실습용 간단한 프로그램이라 상관 없을 것 같아서 예제에 있는 프로그램을 그대로 따라쳤다.

원주율은 3.1415926(생략) 이므로 반올림하여 3.141593 으로 const 선언했다.

원의 면적을 구하는 식은  반지름 * 반지름 * 원주율로 간단한 식이므로 크게 이해하는데 어려움이 없었는데 중첩된 원을 구하는 식은 조금 이해하기 어려웠다.

그래서 그림을 그려보니 피타고라스 정리의 응용인 것 같다.

원이 중첩되어 있다는 것은 두 원의 면적 중 일부가 겹친다는 뜻이므로 두 원의 중심 사이의 거리가 두 원의 반지름의 합보다 작을 수 밖에 없다. 그래서 두 원의 중심을 연결하는 선분이 가장 긴 변인 직각삼각형을 그리고, 그 선분의 길이를 구한 다음, 두 원의 반지름의 합과 비교하면 된다.

 

현재 프로그램은 C++로 짜여져 있으나 실질적으로는 C언어에서의 구조체와 C++에서의 클래스를 비교하는 것이 맞다는 의견을 보았다. 호환성을 위해(보통 C/C++ 컴파일러라고 하는 것처럼) C++에서 구조체를 지원하는 것이지, C++ 에서 구조체는 클래스와 크게 다를 점이 없고, 다른 점이라고 한다면 구조체에서는 기본적으로 public 속성으로 클래스에서는 기본적으로 private 속성으로 만들어지는 것이었다.

 

구조체와 클래스 모두 "." 을 이용해 해당 맴버를 호출한다.

하지만 구조체의 경우 새로운 데이터 형식으로 변수들만 선언할 수 있는 반면,

클래스의 경우 함수 같은 것들도 선언할 수 있고, public 밑에 두지 않으면 기본적으로 다른 함수나 클래스에서 사용하지 못한다.

 

아직 구조체 포인터나 클래스 상속이나 이런 것들은 잘 모르지만 일단은 가장 기초가 되는 클래스와 구조체의 차이점을 짧게 나마 정리하였다. 앞으로는 조금 정리해야겠다라고 느낀 것들이 있으면 정리해서 여기에 올릴까 한다. 조금 건너건너로 듣기로는 구조체와 포인터를 사용해서 거의 객체지향처럼 쓰는 경우도 있다고 하던데 혹시라도 나중에 공부해서 정리할 수 있게 된다면 정리하고 싶다.

'방송통신대학교 생활기 > Cpp' 카테고리의 다른 글

비주얼 스튜디오 C4996 에러  (0) 2022.12.07