본문 바로가기
IT/C++(CPP)

CPP 초급 강좌 24. 객체지향 프로그램밍 객체화, 접근 지정자 맛보기

by 신림83 2020. 11. 3.
반응형

CPP 초급 강좌 24. 객체지향 프로그램밍 객체화, 접근 지정자 맛보기

c++을 공부하시면서 객체, 객체지향 이런 용어를 참 많이 접하실 겁니다. C 스타일 코드를 C++ 객체지향 쪽 코드로 수정해 가보며 알아보아요.

특정 기간을 일로만 산출하는 코드

 특정 기간에 대한 정보를 관리하려고 한다고 해보아요

아래 코드를 봅시다.

#include <iostream>
using namespace std;

int periodYear = 0;
int periodMonth = 0;
int periodDay = 0;

int GetOnlyDay(int year, int month, int day)
{
	return 	year * 365 + month * 30 + day;
}

int main()
{
	int periodYear = 1;
	int periodMonth = 1;
	int periodDay = 1;

	int onlyDay = GetOnlyDay(periodYear, periodMonth, periodDay);

	cout << onlyDay << endl;
}

년 월 일에 대한 정보를 보관합니다.

 

int periodYear = 0;
int periodMonth = 0;
int periodDay = 0;

 

해당 정보를 main에서 값을 넣고, GetOnlyDay를 이용해 일로만 환산하는 코드를 만들어 보았어요.

 

적당히 이해가 가실꺼라 생각합니다.

 

추가 요청, 기간 데이터을 추가?

그런데 하나의 기간을 더 관리할 필요성이 생겼습니다. 그래서 기간 관련 데이터를 추가로 선언하기로 해요.

int periodYear0 = 0;
int periodMonth0 = 0;
int periodDay0 = 0;

int periodYear1 = 0;
int periodMonth1 = 0;
int periodDay1 = 0;

int GetOnlyDay(int year, int month, int day)
{
	return 	year * 365 + month * 30 + day;
}

int main()
{
	int periodYear0 = 1;
	int periodMonth0 = 1;
	int periodDay0 = 1;

	int periodYear1 = 2;
	int periodMonth1 = 2;
	int periodDay1 = 2;

	int onlyDay0 = GetOnlyDay(periodYear0, periodMonth0, periodDay0);
	int onlyDay1 = GetOnlyDay(periodYear1, periodMonth1, periodDay1);

	cout << "0 = "  << onlyDay0 << endl;
	cout << "1 = " << onlyDay1 << endl;
}

변수를 3개더 추가하고 이름을 수정하여 처리해보았습니다. 추가 요청사항으로 3번째, 4번째 그리고 추가 요청이 쭉 있다면 이렇게 계속 처리하면 될까요?

 

객체화

흠... 기간이란 데이터들을 구조체화 해보겠습니다.

//int periodYear0 = 0;
//int periodMonth0 = 0;
//int periodDay0 = 0;

//int periodYear1 = 0;
//int periodMonth1 = 0;
//int periodDay1 = 0;

struct Period
{
	int year = 0;
	int month = 0;
	int day = 0;
};

int GetOnlyDay(int year, int month, int day)
{
	return 	year * 365 + month * 30 + day;
}

int main()
{
	/*int periodYear0 = 1;
	int periodMonth0 = 1;
	int periodDay0 = 1;

	int periodYear1 = 2;
	int periodMonth1 = 2;
	int periodDay1 = 2;*/

	Period p0 = { 1,1,1 };
	Period p1 = { 2,2,2 };

	int onlyDay0 = GetOnlyDay(p0.year, p0.month, p0.day);
	int onlyDay1 = GetOnlyDay(p1.year, p1.month, p1.day);

	cout << "0 = "  << onlyDay0 << endl;
	cout << "1 = " << onlyDay1 << endl;
}

 기존 선언된 기간의 변수를 지우고(주석 처리하고, struct Period 를 만들었습니다. 이후 main에서 구조체 p0, p1을 각각 정의하며 초기화하여 줍니다. 요런 하나의 추상적인 계념(여기서는 기간)을 하나의 구조체, 혹은 이후 나올 클래스를 만드는 것부터가 객체화를 시작이라고 보시면 됩니다.

 

 이렇게 처리하는 것이 추가 요청에 좀 더 잘 대응할 수 있을 거 같지 않나요?

 

주석을 빼고 보신다면 코드가 많이 간결해지심을 느끼실 수 있을 거예요!

 

내부함수 만들기

c++ 에서는 구조체가 내부에 함수를 가질 수 있습니다. GetOnlyDay를 struct Period 가 가지는 형태로 코드를 수정해 봅시다.

//int GetOnlyDay(int year, int month, int day)
//{
//	return 	year * 365 + month * 30 + day;
//}

struct Period
{
	int year = 0;
	int month = 0;
	int day = 0;

	int GetOnlyDay()
	{
		return 	year * 365 + month * 30 + day; 
	}
};

int main()
{
	Period p0 = { 1,1,1 };
	Period p1 = { 2,2,2 };

	//int onlyDay0 = GetOnlyDay(p0.year, p0.month, p0.day);
	//int onlyDay1 = GetOnlyDay(p1.year, p1.month, p1.day);

	cout << "0 = " << p0.GetOnlyDay() << endl;
	cout << "1 = " << p1.GetOnlyDay() << endl;
}

외부에 존재하던 GetOnlyDay 함수를 period 내부 함수로 옮겼습니다. 내부 함수로 사용하는 경우 해당 객체의 데이터에 편하게 접근이 가능합니다.

 

기존 GetOnlyDay 함수를 호출하는 코드를 지우고 cout으로 출력하는 부분에서 직접 객체의 내부함수를 호출하도록 하였습니다.

 

접근지정자를 통한 정보은닉

기존 return  year * 365 + month * 30 + day;  코드에서 숫자 레터릭인 365와 30 또한 내부변수로 빼줘보겠습니다.

struct Period
{
	int year = 0;
	int month = 0;
	int day = 0;

	int dayOneYear = 365;
	int dayOneMonth = 30;

	int GetOnlyDay()
	{
		return 	year * dayOneYear + month * dayOneMonth + day;
	}
};

이런 식으로 설정할 수 있을 거예요. 년 원 일 같은 경우는 기간 데이터를  설정하기 위해, 외부에서 접근 필요성이 있는데, dayOneYear, dayOneMonth 같은 경우는 사실 한번 설정해 두면 외부에서 접근할 이유가 없겠죠.(사실 상수화로 대응할 수 있지만) 관련하여 이번에는 접근 지정자를 통한 정보은닉을 해봅시다.

struct Period
{
private:
	int year = 0;
	int month = 0;
	int day = 0;

	int dayOneYear = 365;
	int dayOneMonth = 30;

public:
	int GetOnlyDay()
	{
		return 	year * dayOneYear + month * dayOneMonth + day;
	}
};

int main()
{
	Period p0 = { 1,1,1 }; //a
	Period p1 = { 2,2,2 }; //b

	cout << "0 = " << p0.GetOnlyDay() << endl;
	cout << "1 = " << p1.GetOnlyDay() << endl;
}

private: 영역과 public: 영역으로 객체를 나눴습니다.

private 영역의

int year = 0;
int month = 0;
int day = 0;

int dayOneYear = 365;
int dayOneMonth = 30;

 

은 이제 main 에서 접근할 수 없고, 내부에서(내부 함수)만 사용 가능한 영역이 되었습니다.

 

반대로 public: 영역은 외부에서 접근이 가능하죠

 

그래서 a, b 코드는 현재 오류입니다.

접근자가 막혀있어 접근이 안됨

year, month, day는 따로 설정할 수 있는 함수를 재공해 봅시다.

struct Period
{
private:
	int year = 0;
	int month = 0;
	int day = 0;

	int dayOneYear = 365;
	int dayOneMonth = 30;

public:
	void init(int year, int month, int day)
	{
		this->year = year;
		this->month = month;
		this->day = day;
	}

	int GetOnlyDay()
	{
		return 	year * dayOneYear + month * dayOneMonth + day;
	}
};

int main()
{
	Period p0; 
	Period p1; 

	p0.init(1, 1, 1);
	p1.init(2, 2, 2);

	cout << "0 = " << p0.GetOnlyDay() << endl;
	cout << "1 = " << p1.GetOnlyDay() << endl;
}

이럼 이제 정상 동작되는 코드입니다. 

 

오 요런 느낌이구나 정도로 봐주시면 좋을 거 같습니다.

감사합니다.

 

배우자..ㅠㅠ

봐주셔서 감사드립니다.

반응형

댓글