본문 바로가기

C++

[C++] 클래스와 메소드

클래스란?

 

클래스란 객체 지향 프로그래밍에서, 데이터와 그 조작 절차인 메소드를 정리한 객체의 추형을 정의한 것이다.

 

 

메소드란?

 

메소드(Method)는 어떤 작동을 구현하고 요청 서비스를 수행할 수 있도록 만들어진 단일 요구 메시지.

 

 

객체지향(Object-Oriented)사람(사용자)관점에서 접근하는 프로그래밍 개발 방법이다.

 

 

클래스의 기본 형태는 다음과 같다.

 

class 클래스이름
{
접근제어지시자:
    멤버변수선언;
    멤버함수선언및정의;
};

 

클래스에는 생성자라는 것이 있다. 생성자는 클래스이름과 똑같고 객체 선언시 자동 호출된다는 점을 꼭 기억해야한다. 자동 호출된다는 점에서 멤버변수 초기화 하기에 좋다.

 

 

초기화하는데는 다양한 방법이 있다. 다음은 생성자 초기화 목록을 이용한 초기화 방법이다.

 

class myPhone
{
public:	//접근 제어 지시자
	//생성자
	myPhone()
		: volume(5), light(10)	//초기화 목록을 이용하여 초기화
	{}

	//멤버 변수 선언
	int volume;
	int light;
}

 

초기화 목록을 이용하려면 ':'을 이용해야 하고 함수 원형 부분과 블록 사이에 위치한다. 참고로 멤버 변수가 참조자 형식이면 반드시 초기화 목록을 이용해 초기화해야한다.

 

 

C++11 부터는 선언과 동시에 멤버 변수를 초기화할 수 있다.

 

class myPhone
{
public:	//접근 제어 지시자
	//생성자
	myPhone(){}

	//멤버 변수 선언 및 초기화
	int volume = 5;
	int light = 10;
}

 


클래스에 대해 자세히 보기전에 절차지향 C와 객체지향 C++에 대해 간략하게 비교해보자.

절차지향적인 C 스타일 형태

 

#include <iostream>
using namespace std;

typedef struct myPhone
{
	int volume;
	int light;

} myPhone;

int main()
{
	myPhone phone = { 5, 10 };	//볼륨5, 밝기10
	phone.light++;	//밝기 올림
	printf("볼륨은 %d이고 밝기는 %d입니다.\n", phone.volume, phone.light);

	return 0;
}

 

객체지향적인 C++ 스타일 형태

 

class myPhone
{
public:
	int volume;
	int light;

	void volumeUp(void)
	{
		++volume;
	}
	void lightUp(void)
	{
		++light;
	}
	void Print(void)
	{
		printf("볼륨은 %d이고 밝기는 %d입니다.\n", volume, light);
	}

};

int main()
{
	myPhone phone = { 5, 10 };	//볼륨5, 밝기10
	phone.lightUp();
	phone.Print();

	return 0;
}

 

결과값:

볼륨은 5이고 밝기는 11입니다.

 

main() 만 놓고 비교해봤을때 C 스타일의 경우 사용자가 구조체 멤버변수나 구성에 대해서 알고 있어야 한다. 또한, 구조체 멤버변수에 변경이 발생하면 사용자의 사용법또한 바뀌어야 한다.

 

C++ 스타일은 클래스에서 Print기능을 만들어 사용자는 함수호출만으로 사용할 수 있다.

 

조금 더 C++ 객체지향 스타일로 바꿔보면 다음과 같다.

 

#include <iostream>
using namespace std;

class myPhone
{
public:	//접근 제어 지시자
	//생성자
	myPhone()
	{
		volume = 5;
		light = 10;
	}

	//멤버 변수 선언
	int volume;
	int light;

	//멤버 함수 선언 및 정의
	void volumeUp(void)
	{
		++volume;
	}
	void lightUp(void)
	{
		++light;
	}
	void Print(void)
	{
		printf("볼륨은 %d이고 밝기는 %d입니다.\n", volume, light);
	}

};

int main()
{
	myPhone phone;	//생성자 호출로 자동 초기화
	phone.lightUp();
	phone.Print();

	return 0;
}

 

생성자를 이용하여 초기화하였다.

 

volumUp, lightUp, Print 함수가 메소드에 해당한다. 볼륨을 올리고, 밝기를 올리고, 상태를 출력하는 작동을 구현하는 부분이다.

 

 

상수형 메소드란?

 

상수형 메소드는 멤버 변수에 읽기는 가능하지만 쓰기는 불가능한 메서드를 말한다.

 

상수형 메소드는 함수 원형 뒤에 형한정어인 const 예약어만 붙이면 된다.

 

#include <iostream>
using namespace std;

class myClass
{
public:
	myClass() {}
	
	int getData() const	//상수형 메서드(쓰기 금지)
	{
		//setData(100)	에러
		return num;
	}

	void setData(int param)
	{
		num = param;
	}

private:
	int num = 0;

};

int main()
{
	myClass a;
	cout << a.getData() << endl;
	a.setData(10);
	cout << a.getData() << endl;

	return 0;
}

 

결과값:

0
10

 

getData함수안에 setData를 호출하면 에러가 발생한다. getData함수는 상수형 메서드로 읽기 접근은 가능하나 쓰기 접근은 불가능한데 setData함수는 쓰기 접근 함수이기 때문이다.

 

상수형 메소드는 멤버 변수의 값을 쓸 수 없고, 상수형 메소드가 아닌 멤버는 호출할 수 없다.

 

예제와 같은 간단한 코드의 경우 상수형 메소드는 불필요해 보일 수 있다. 그러나 코드가 복잡해지거나 시간이 지난후 코드를 수정해야 할 경우 상수형 메소드처럼 안전장치의 개념은 개발자에게 도움을 줄 수 있다.

'C++' 카테고리의 다른 글

[C++] 참조자(Reference)  (0) 2019.12.16
[C++] this 포인터  (0) 2019.12.15
[C++] 네임스페이스(Namespace)  (0) 2019.12.14
[C++] 오버로딩(Overloading)과 템플릿(Template)  (0) 2019.12.13
[C++] 디폴트 매개변수  (0) 2019.12.13