IT 프로그래밍/객체지향프로그래밍

[따배시 c++ 8.1] 객체지향 프로그래밍과 클래스

기술1 2024. 5. 14. 22:19
반응형

클래스를 모를 때

#include <iostream>
#include <string>
#include <vector>
using namespace std;


void print(const string& name, const string& address, const int& age,
	const double& height, const double& weight)
{
	cout << name << " " << address << " " << age << " " << height << " "
		<< weight << endl;
}

int main()
{
	string name;
	string address;
	int age;
	double height;
	double weight;

	print(name, address, age, height, weight);

	vector<string> name_vec;
	vector<string> addr_vec;
	vector<int> age_vec;
	vector<double> height_vec;
	vector<double> weight_vec;

	print(name_vec[0], addr_vec[0], age_vec[0], height_vec[0], weight_vec[0]);


	return 0;
}

이런 식으로 해주면 너무 복잡하고 번거롭습니다. 하나하나씩 다 넣어줘야 하기 때문입니다. 

 

그렇다면 클래스 바로 전 구조체를 쓰면 어떻게 될까요?

 

구조체

#include <iostream>
#include <string>
#include <vector>
using namespace std;


void print(const string& name, const string& address, const int& age,
	const double& height, const double& weight)
{
	cout << name << " " << address << " " << age << " " << height << " "
		<< weight << endl;
}

struct Friend
{
	string name;
	string address;
	int age;
	double height;
	double weight;
};

int main()
{

	Friend jj{ "Jack Jack", "Uptown", 2, 30, 10 };


	print(jj.name, jj.address, jj.age, jj.height, jj.weight);

	vector<string> name_vec;
	vector<string> addr_vec;
	vector<int> age_vec;
	vector<double> height_vec;
	vector<double> weight_vec;

	print(name_vec[0], addr_vec[0], age_vec[0], height_vec[0], weight_vec[0]);


	return 0;
}

이렇게 해주면 구조체로 가는데요. 하지만 jj 말고 다른 친구가 생겼을 때 계속해서 추가로 만들어줘야 하기 때문에 아직도 번거로움이 있습니다. 그럼 structure을 하나로 받으면 어떻게 될까요ㅕ?

 

struct 안에 print 함수 넣기

#include <iostream>
#include <string>
#include <vector>
using namespace std;



struct Friend
{
	string name;
	string address;
	int age;
	double height;
	double weight;

	void print()
	{
		cout << name << " " << address << " " << age << " " << height << " "
			<< weight << endl;
	}
};




int main()
{

	Friend jj{ "Jack Jack", "Uptown", 2, 30, 10 };


	print(jj);

	vector<string> name_vec;
	vector<string> addr_vec;
	vector<int> age_vec;
	vector<double> height_vec;
	vector<double> weight_vec;

	print(name_vec[0], addr_vec[0], age_vec[0], height_vec[0], weight_vec[0]);


	return 0;
}

이렇게 jj.print() 만 해주면 저렇게 나오게 됩니다. 저런 식으로 데이터와 기능이 묶여있는 것을 object라고 합니다. structure에도 이런 식으로 function을 넣을 수 있는데 보다 더 많은 기능을 다룰 수 있게 만들어주는 것이 바로 class입니다.

 

저기에 있는 struct를 class로 바꿔주기만 하면 됩니다. 

 

기능을 넣을 때는 class를 쓰기 때문에 class를 써주시면 됩니다. c++에서는 구조체 structure 안에도 function 이 들어갈 수 있는데 c는 안되기 때문에 class의 기능은 중요해집니다. 

 

이것이 바로 class가 만들어지는 과정입니다. 

 

vector를 각각 만들었는데 이제 더 편하게 가능한데요. 더 쉬운 방법을 사용하시면 됩니다. structure에는 public: 이나 이런 private:가 들어가진 않습니다. 

#include <iostream>
#include <string>
#include <vector>
using namespace std;



struct Friend
{
public: //access specifier (public, private, protected)
	string m_name;
	string m_address;
	int m_age;
	double m_height;
	double m_weight;

	void print()
	{
		cout << m_name << " " << m_address << " " << m_age << " " << m_height << " "
			<< m_weight << endl;
	}
};




int main()
{

	Friend jj{ "Jack Jack", "Uptown", 2, 30, 10 }; //instanciation, instance
	
	jj.print();

	vector<Friend> my_friends;
	my_friends.resize(2);

	for (auto& ele : my_friends)
		ele.print();


	return 0;
}

이렇게 바뀐 코드를 보면 이런식으로 깔끔해진 것을 볼 수 있습니다. 객체지향으로 하기 때문에 왜 객체지향이 필요한지 알 수 있습니다. c++에서는 이렇게 클래스가 나중에 나오지만 java에서는 바로 객체지향으로 들어갑니다. 처음부터 class를 배우기 때문입니다.

 

c는 모든 언어의 기반이기 때문에 나중에 java를 하실 때도 편하게 하실 수 있을 겁니다. 

반응형