관리자 글쓰기
C++ 클래스와 객체
2022. 5. 7. 14:16 - pingu-s

클래스와 객체의 기본

 

(1) 클래스

 

프로그램의 작성이 복잡하게 됨에 따라, 코드를 한정된 기간에 효율 좋게 작성하기 위한 기능이 중요하게 되어 왔다. 이 새로운 기능의 하나가 클래스(class)라는 개념이다. 클래스의 기능을 이용하면 복잡한 코드를 효율성 있게 작성할 수 있다.

클래스란 객체(object)를 정의하는 틀로서 클래스에 데이터 멤버멤버 함수를 선언한다. 클래스와 객체의 관계는 붕어빵 틀과 붕어빵의 관계와 비슷하며, 붕어빵 틀은 클래스에, 붕어빵은 객체에 비유된다.

객체는 클래스라는 틀에서 찍어 내어 데이터 멤버와 멤버 함수 코드를 실제 가지고 C++ 프로그램이 실행되는 동안에 실존하는 실체 혹은 인스턴스(instance)이다.

 

클래스를 취급할 때는 현실 세계에 존재하는 [단일] 등의 개념에 중점을 둔다. 예를 들면, [집]이라는 단일에 중점을 두고, 코드를 작성해 보는 것으로 한다. 집은 "부산시 남구 대연3동 1000-4번지"라는 주소와 64라는 집의 평수, "051-629-0001"이라는 전화번호를 저장할 수 있다. 이때, [집]에 관한 데이터로서 다음과 같은 것을 생각할 수 있다.

 

  • 주소
  • 평수
  • 전화번호

 

[집의 주소는 ○○이다], [집의 평수는 ○○평이다]라는 [집]의 일반에 관한 것을 집에 대한 클래스로 도입하는 것이다. 이들 데이터는 집의 [성질·상태]와 같은 것이라고 생각할 수도 있다.

또한 이외에도 집에는 다음과 같은 [기능]이 있을 것이다.

 

  • 집의 주소를 결정한다.
  • 집의 평수를 결정한다.
  • 집의 전화번호를 신청한다.
  • 집의 주소와, 평수, 전화번호를 표시한다.

 

 

 

이들의 [기능]은 집의 주소와 평수, 전화번호 등을 변경하는 것이라고 한다.

클래스란 이와 같은 단일의 성질·상태와 그것에 관련되는 기능을 종합하면서 코드를 작성해가기 위해 사용하는 개념이다.

 

 

 

클래스를 종합하려면 대략 다음과 같은 코드를 기술한다. 이것이 클래스의 기본이다.

//집 클래스
class 집 {
	주소;
	평수;
	전화번호;
    //↑ 집의 성질·상태를 종합한다.
	주소를 결정한다...;
	평수를 결정한다...;
	전화번호를 신청한다...;
	주소와 평수, 전화번호를 표시한다...;
    //↑ 집의 기능을 종합한다.
};

블록의 내에 집의 [성질·상태][기능]을 종합하여, 여기에 [집]이라는 이름을 붙여 두었다.

 

(2) 클래스의 선언

 

사용자 클래스의 작성법은 구조체 파트에서 학습한 구조체형과 거의 같다. C++의 클래스란 우리들이 작성 가능한 사용자 정의형이 하나로 되어 있다.

클래스에 단일의 성질과 기능을 종합하는 것을 클래스를 정의한다고 한다. 클래스는 다음과 같이 선언한다.

 

[구문 : 클래스의 선언]

class 클래스명 {
	접근 지정자:
	변수의 선언; //변수 등(데이터 멤버)을 기술한다.
	...
	함수의 선언; //함수(멤버 함수)를 기술한다.
	...
};
//마지막 세미콜론에 주의

 

구조체의 경우는 struct 키워드를 사용하지만, 클래스의 경우는 class 키워드를 사용한다.

클래스 내에는 변수와 함수를 묶어서 선언한다. 이 변수와 함수는 구조체와 똑같이 멤버(member)라고 부른다. 특히 클래스의 경우는 변수데이터 멤버(data member), 함수멤버 함수(member function)라고 부른다. (구조체는 데이터 멤버만 포함)

또 멤버 함수에 관해서는 주의가 필요하다. 앞선 구문에서는 멤버 함수의 선언만을 수행하고 있다. 즉, 멤버 함수의 실제 처리에 관해서는 정의하지 않았다. 그래서 멤버 함수의 본체에 관해서는 클래스의 선언 바깥에 정의하는 것으로 한다.

 

[구문 : 멤버 함수의 정의]

반환값의 형 클래스명::멤버 함수명(인수 리스트)
{
	...
}

 

[::}는 영역 해결 연산자(scope resolution operator)라고 한다. ::연산자를 사용해서 멤버가 어떤 클래스의 멤버 함수인가를 지정하는 것이다.

 

(3) 클래스를 선언하는 코드

 

그러면 실제로 클래스를 선언해 보도록 한다. 다음의 코드는 집의 주소와 평수, 전화번호를 관리하고 출력하는 기능을 가지는 [House(집)] 클래스를 선언하는 것이다.

 

[간단한 클래스의 선언]

//House 클래스의 선언
class House {
public:
	const char* address;
	int space;
	const char* telephone;
	void show(); //멤버 함수
}; //★세미콜론 주의

//House 클래스 멤버 함수의 정의
void House::show()
{
	cout << "집의 주소는 " << address << "입니다.\n";
}
//클래스 선언 바깥에 함수 본체를 정의

이 House 클래스는 다음과 같은 데이터 멤버와 멤버 함수를 가지고 있다.

 

데이터 멤버 설명
address 주소를 저장하는 변수
space 평수를 저장하는 변수
telephone 전화번호를 저장하는 변수
멤버 함수 설명
show() 주소와 평수, 전화번호를 출력하는 함수

 

멤버 함수의 정의는 클래스의 선언의 바깥에 기술되어 있다. [House::]라는 지정을 붙임으로써 통상의 함수뿐만 아니고 House 클래스의 멤버 함수인 것을 나타낸다.

이와 같이 클래스는

데이터 멤버.........단일의 성질·상태
멤버 함수.........단일의 기능

을 종합한 것이다.

 

(4) 클래스의 이용

 

선언한 클래스는 새로운 형의 하나로 된다. 즉, 클래스형의 변수를 선언할 수 있는 것이다. 클래스형의 변수는 다음과 같이 선언한다.

 

[구문 : 객체의 생성]

클래스명 변수명; //클래스의 값을 저장할 변수를 선언한다.

 

클래스는 새로운 형이므로 통상의 변수를 선언하는 방법과 똑같다. 그러면 House 클래스의 변수를 선언하는 코드를 살펴보도록 한다.

 

House my_house; //클래스의 값을 저장하는 변수 my_house를 선언한다.

이것은 [House 클래스의 값]을 기억하는 변수 my_house의 선언이다. 이 클래스형의 변수는 객체(object), 또는 인스턴스(instance)라고 부른다. 여기서는 클래스형의 값을 저장하는 변수를 객체라고 부른다.

 

(5) 멤버에 접근

 

객체를 이용하려면 객체의 각 멤버에 접근해서 값을 저장해야 한다. 이것을 위해서는 구조체와 같이 도트 연산자(.)를 사용한다.

 

my_house.address = "부산시 남구 대연3동"; //주소를 지정한다.
my_house.space = 64; //평수를 64로 한다.
my_house.telephone = "051-629-0001"; //전화번호를 지정한다.

 

또한 멤버 함수의 호출을 수행할 경우에도 도트 연산자를 사용한다.

 

my_house.show(); //멤버 함수를 호출해서 주소, 평수, 전화번호를 출력한다.

 

예제 12-1) House의 클래스를 선언하고, 집(House)의 주소와 평수, 전화번호를 멤버로 지정한다. 그리고 집의 주소와 평수, 전화번호를 출력하는 코드를 작성해 보도록 한다.

#include <iostream>
using namespace std;

class House{ //House 클래스의 선언을 수행한다.
public:
	const char* address;
	int space;
	const char* telephone;
	void show();
};

void House::show() //House 클래스의 멤버 함수를 정의한다.
{
	cout << "집의 주소는 " << address << "입니다.\n";
	cout << "집의 평수는 " << space << "평입니다.\n";
	cout << "집의 전화번호는 " << telephone << "입니다.\n";
}

int main() //main() 함수에서 House 클래스로부터 객체를 선언하였다.
{
	House my_house;

	my_house.address = "부산시 남구 대연3동";
	my_house.space = 64;
	my_house.telephone = "051-629-0001";

	my_house.show();

	return 0;
}
//실행 결과로부터 알 수 있듯이 my_house 데이터 멤버에 값을 대입하고 출력할 수 있다.

 

(6) 객체 생성

 

객체란 우리 주변에 있는 모든 것, 즉 카메라, 자동차, 사람, 의자, 책 등 현실 세계의 주체가 되는 대상을 말한다.

객체를 위해 메모리를 할당하는 것(여기서는 my_house을 선언하는 것)을 객체를 생성한다고 하고, 역으로 객체의 이용을 끝내고 메모리가 해제되는 것을 객체를 소멸시킨다고 한다.

예제 12-1에서 생성한 객체 my_house는 main() 함수 내에서 선언된 지역 변수이다. 따라서 main() 함수가 개시할 때 객체가 생성되고, main() 함수가 종료했을 때 소멸된다.

또한 객체는 동적으로 생성할 수도 있다. new 연산자를 사용해서 객체를 위해 메모리를 할당하고, delete 연산자를 사용해서 메모리를 해제하는 것이다.

 

House* p_my_house; //House 클래스로의 포인터를 준비한다.
p_my_house = new House; //객체를 동적으로 생성해서 포인터에 주소를 대입한다.

//화살표 연산자를 사용해서 멤버에 접근한다.
p_my_house->address = "부산시 남구 대연3동";
p_my_house->space = 64;
p_my_house->telephone = "051-629-0001";

delete p_my_house; //객체를 소멸시킨다.

 

House 클래스로의 포인터 p_my_house를 준비하고, 동적으로 할당한 메모리의 주소를 저장하고 있다. 포인터로부터 멤버에 접근하려면 구조체와 같이 화살표 연산자가 사용된다.

 

(7) 2개 이상의 객체 생성

 

예제 12-1에서는 객체를 1개 생성하였지만, 객체는 여러 개를 생성할 수도 있다. 예를 들면, 2개의 집을 생성하려면 다음과 같이 변수 my_house 이외에 friend_house를 하나 더 선언하면 된다.

 

House my_house; //my_house의 객체를 생성한다.

//my_house의 집 주소와 평수, 전화번호이다.
my_house.address = "부산시 남구 대연3동";
my_house.space = 64;
my_house.telephone = "051-629-0001";

House friend_house; //friend_house의 객체를 생성한다.

//friend_house의 집 주소와 평수, 전화번호이다.
friend_house.address = "서울시 중구 세종대로";
friend_house.space = 45;
friend_house.telephone = "02-517-1002";

 

그러면 2개의 [집]은 각각 독자적인 주소와 평수, 전화번호를 가지고 있는 것으로 된다. 또한 my_house, friend_house는 변수명이므로 식별자 내에서 별개의 적당한 이름을 붙여도 상관없다.

객체를 여러 개 생성하면 더욱 복잡한 코드를 작성할 수 있다.

 

(8) 클래스를 이용하는 순서의 종합

 

앞에서 살펴본 것처럼 클래스를 이용하는 코드를 작성하려면 통상 다음의 2개의 순서를 따르게 된다는 것을 알 수 있다.

 

① 클래스를 정의한다.

② 클래스로부터 객체를 생성한다.

 

①의 [클래스를 정의한다]라는 작업은 [집에 관한 일반적인 사양](클래스)을 설계하는 작업이다. 한편, ②의 [객체를 생성한다]는 작업은 그 사양(클래스)을 기본으로 하고, [개개의 집](객체)을 생성하고, 데이터를 기억하거나 조작하기도 하는 작업을 말한다.

여기서는 ①과 ②를 계속해서 같은 파일에 기술하였다. 그러나 이 2개의 코드를 2개의 파일로 분할하고 개개의 사람이 기술할 수도 있다.

 

 

출처: 박흥복서정희. 2015. C++ 프로그래밍 (초보자를 위한). 문운당

'개발 > C++' 카테고리의 다른 글

C++ 클래스와 객체3  (0) 2022.05.12
C++ 클래스와 객체2  (0) 2022.05.11
C++ 열거형, 구조체, 공용체2  (0) 2022.05.04
C++ 열거형, 구조체, 공용체  (0) 2022.05.04
C++의 고급 기능2  (0) 2022.04.11