자료구조 정복하기 with C++ (0)Class 익숙해지기(Rectangle 클래스)
자료구조 정복하기 with C++ (0)Class 익숙해지기(Rectangle 클래스)
직접 코딩하면서 자료구조 공부하기
개요
자료구조와 알고리즘은 프로그램을 구성하는 가장 핵심적인 요소입니다. 프로그램 개발을 집을 짓는 것에 비유한다면 흙이나 모래, 시멘트, 목재와 같은 자재들이 바로 ‘자료구조’에 해당되고, 이러한 자재들을 이용해서 집을 짓는 것이 ‘알고리즘’에 해당됩니다. 자료구조는 가장 기본적이고 중요한 부분이기 때문에 복습하는 겸해서 직접 여러가지 자료구조를 코딩하면서 공부하기로 했습니다.
첫걸음
본격적으로 자료구조를 구현해보기 전에 구현 언어인 C++에 익숙해져야 합니다. C++은 기존의 C언어에 여러 가지 기능을 추가하여 만든 프로그래밍 언어입니다. C++은 C언어에서 절차 지향적 언어의 특징을 가져왔을 뿐만 아니라, 클래스를 사용하는 객체 지향적 언어인 동시에 템플릿으로 대변되는 일반화 프로그래밍 방식의 언어이기도 합니다.
C++은 객체 지향적 언어이기 때문에 class가 존재하는데 JAVA가 아닌 C++에서의 클래스에 익숙해지기위해 직사각형을 그리는 Rectangle 클래스를 구현합니다.
Rectangle Class 기능
Rectangle 클래스의 기능은
- 직사각형 만들기
- 높이, 너비, x, y, val(사각형 비교값 변수) 반환
- 사각형 정보 입력
- 넓이 계산
- 덧셈(합집합), 뺄셈(교집합) 계산 -> operator를 이용하여 기존의 연산자 재정의
- 출력 입니다.
Rectanle.h
Rectanle 헤더파일
#pragma once
#include <iostream>
using namespace std;
class Rectangle
{
private:
int x;
int y;
int height;
int width;
int val = 1; //교집합, 동일 검사시 사용할 변수
//int* array;
public:
Rectangle();
~Rectangle();
Rectangle operator+(Rectangle& r);
Rectangle operator/(Rectangle& r);
Rectangle operator==(Rectangle& r);
int getWidth();
int getHeight();
int getX();
int getY();
int getVal();
void read();
void print();
void getArea();
};
Rectangle.cpp
Rectangle 소스코드
#include "Rectangle.h"
Rectangle::Rectangle()
{
width = 0;
height = 0;
//array = new int[10]; //malloc(sizeof(int)*10)
}
Rectangle::~Rectangle()
{
//객체 사라질때
//delete[] array; //free(array)
}
//사각형 덧셈 함수
Rectangle Rectangle::operator+(Rectangle& r)
{
Rectangle rect;
(x < r.x) ? (rect.x = x) : (rect.x = r.x);
(y < r.y) ? (rect.y = y) : (rect.y = r.y);
(x + width > r.x + r.width) ? (rect.width = x + width - rect.x) : (rect.width = r.x + r.width - rect.x);
(y + height > r.y + r.height) ? (rect.height = y + height - rect.y) : (rect.height = r.y + r.height - rect.y);
return rect;
}
//사각형 교집합 함수
Rectangle Rectangle::operator/(Rectangle& r)
{
Rectangle rect;
int tmpX, tmpY;
tmpX = (x + width) - (r.x + r.width);
(tmpX >= 0) ? (tmpX = tmpX) : (tmpX = -tmpX);
(x < r.x) ? (rect.x = (x + width) - (r.width - tmpX)) : (rect.x = (r.x + r.width) - (width - tmpX));
(x < r.x) ? (rect.width = r.width - tmpX) : (rect.width = width - tmpX);
tmpY = (y + height) - (r.y + r.height);
(tmpY >= 0) ? (tmpY = tmpY) : (tmpY = -tmpY);
(y < r.y) ? (rect.y = (y + height) - (r.height - tmpY)) : (rect.y = (r.y + r.height) - (height - tmpY));
(y < r.y) ? (rect.height = r.height - tmpY) : (rect.height = height - tmpY);
if (rect.width <= 0 || rect.height <= 0) //교집합이 존재하지 않으면 rect.val에 0 반환
{
rect.val = 0;
}
return rect;
}
//사각형 동일 검사 함수
Rectangle Rectangle::operator==(Rectangle& r)
{
Rectangle rect;
if (x == r.x && y == r.y && width == r.width && height == r.height) //동일한 사각형이라면 rect.val에 2 반환
{
rect.val = 2;
}
else { //동일하지 않은 사각형이라면 rect.val에 3 반환
rect.val = 3;
}
return rect;
}
//사각형 정보 입력 함수
void Rectangle::read()
{
cout << "input x: ";
cin >> x;
cout << "input y: ";
cin >> y;
cout << "input width: ";
cin >> width;
cout << "input height: ";
cin >> height;
}
//사각형 정보 출력 함수
void Rectangle::print()
{
(val == 0) ? (cout << "\n교집합이 없습니다." << endl) :
(val == 2) ? (cout << "\n동일한 사각형입니다." << endl) :
(val == 3) ? (cout << "\n동일하지 않은 사각형입니다." << endl) :
(cout << "\nx: " << x << "\ny: " << y << "\nwidth: " << width << "\nheight: " << height << endl);
}
//사각형 넓이 계산 함수
void Rectangle::getArea()
{
(val == 0) ? (cout << "\n교집합이 없습니다." << endl) :
(val == 2) ? (cout << "\n동일한 사각형입니다." << endl) :
(val == 3) ? (cout << "\n동일하지 않은 사각형입니다." << endl) :
(cout << "area: " << width * height << endl);
}
//각 private 변수를 참조하기 위한 함수
int Rectangle::getX()
{
return x;
}
int Rectangle::getY()
{
return y;
}
int Rectangle::getWidth()
{
return width;
}
int Rectangle::getHeight()
{
return height;
}
int Rectangle::getVal()
{
return val;
}
결과
main.cpp
#include <iostream>
#include "Rectangle.h"
using namespace std;
//<<연산자 이용 함수
ostream& operator<<(ostream& os, Rectangle& r)
{
(r.getVal() == 0) ? (os << "\n교집합이 없습니다." << endl) :
(r.getVal() == 2) ? (os << "\n동일한 사각형입니다." << endl) :
(r.getVal() == 3) ? (os << "\n동일하지 않은 사각형입니다." << endl) :
(os << "\nx: " << r.getX() << "\ny: " << r.getY() << "\nwidth: " << r.getWidth() << "\nhegit: " << r.getHeight() << endl);
return os;
}
int main()
{
Rectangle firstRect;
Rectangle secondRect;
Rectangle sumRect;
Rectangle intRect;
Rectangle eqRect;
//1번 사각형, 2번 사각형 입력받기
firstRect.read();
secondRect.read();
//덧셈 연산 실행 및 정보 출력
sumRect = firstRect + secondRect;
cout << sumRect; //사각형 정보 출력 연산자
sumRect.print(); //사각형 정보 출력 함수
sumRect.getArea(); //사각형 넓이 출력 함수
//교집합 연산 실행 및 정보 출력
intRect = firstRect / secondRect;
cout << intRect;
intRect.print();
intRect.getArea();
//동일 검사 함수 실행 및 정보 출력
eqRect = firstRect == secondRect;
cout << eqRect;
eqRect.print();
eqRect.getArea();
return 0;
}
이것으로 Rectangle 클래스의 작성을 마칩니다.