• 8.1.1 객체지향 프로그래밍이 아닌 코드의 경우
  • 8.1.2 객체지향 프로그래밍
  • 8.1.3 인스턴스(instance)

8.1.1 객체지향 프로그래밍이 아닌 코드의 경우

 

객체지향 프로그래밍이 아닌 기존의 C/C++ 코드를 보고 객체지향 프로그래밍으로 넘어가 보자. 친구에 대한 다양한 정보(이름, 주소, 나이, 키, 몸무게)를 저장하고 출력하고자 한다. 이럴 경우 가장 가볍게 생각할 수 있는 것이 구조체이다. 단순히 친구 한 명이라면 main 함수에 각 정보를 담을 메모리를 할당하고 출력하면 되겠지만 친구가 여러 명이 생길 수 있을 것이라 생각하자.

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


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

};

void print(const Friend& fr)
{
	cout << fr.name << " " << fr.address << " "
		<< fr.age << " " << fr.height << " " << fr.weight << endl;
}

int main()
{
	Friend jj{ "Jack Jack", "Uptown", 2, 30, 10 };

	print(jj);

	return 0;
}

이처럼 구조체를 하나 만들어서 초기화하고 출력 함수를 구현할 수 있겠다.

 

여기까지만 해도 나름 깔끔하게 잘 만들었지만 print 함수가 너무 지저분해 보인다. 이를 줄이고 싶어서 구조체 안에 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 };

	jj.print();

	return 0;
}

이제 print 함수의 매개변수도 사라지고 출력 부분에서 구조체 내부의 데이터에 접근하기 위하여 불필요한 코드도 사라졌다. 이 정도면 나름 잘 정리한 것 같은데...?


8.1.2 객체지향 프로그래밍

 

이제 C++에서 말하는 객체지향 프로그래밍의 기본적인 구조를 한번 살펴보자. 데이터와 기능이 묶여 있는 것을 객체라고 말한다. 이런 객체(object)를 프로그래밍으로 구현한 것이 class이다.

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

class Friend
{
public:
	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 };

	jj.print();

	return 0;
}

이전 코드 블럭과의 차이점은 두 가지다. struct 키워드 대신 class 키워드를 썼다는 점, class 시작 부분에 public:이라는 키워드가 붙었다는 점이다.

 

많은 사람들이 처음 클래스를 접하게 되면 구조체로도 비슷하게 구현이 가능한데 굳이 클래스로 구현해야 하는 것인가라는 의문점을 가지게 된다. 클래스의 경우 public이라는 access specifier라는 것 덕분에 많은 추가적인 이점을 가질 수가 있다. 구조체는 기본적으로 public이지만 클래스의 경우 private이나 protected로 설정이 가능하다. 이 부분은 다음 포스팅에서 다루도록 하겠다.

 

일반적으로 프로그래밍을 하면 구조체는 데이터만 담고 클래스에는 데이터와 기능을 함께 담는다.


8.1.3 인스턴스(instance)

 

객체지향 프로그래밍에 대해 다루다 보면 인스턴스와 클래스의 개념이 혼동될 수 있다. 객체는 데이터와 기능을 담아두어서 추상화시킨 구조일 뿐 물리적으로 메모리를 지니고 있는 존재는 아니다. 반면 인스턴스는 물리적 메모리 주소를 할당받은 것이고 구조체가 지닌 데이터나 기능을 사용할 수 있는 존재이다.

int main()
{
	Friend jj{ "Jack Jack", "Uptown", 2, 30, 10 };

	jj.print();

	return 0;
}

이 코드에서 jj가 인스턴스이다. 이처럼 메모리를 가지기 시작하는 것을 instanciation이라고 부른다.

+ Recent posts