본문 바로가기
2CHAECHAE 학교생활/객체지향프로그래밍(C++)

[ 객체지향프로그래밍(C++) 6주차 ② ]

by 2CHAE._.EUN 2022. 4. 11.

[ 6주차 - 2 ]

 

클래스

 

1. 클래스( class )

- 객체( object )의 형식을 명시하는 새로운 자료형을 정의한다.

- 데이터와 그 데이터 상에 동작할 코드를 포함

- 데이터와 코드를 연결

- 객체를 만드는 방법을 명시하는 계획들의 집합

- 구성요소

   ⓐ 멤버 변수 : 클래스 내에 선언된 변수

   ⓑ 멤버 함수 : 클래스 내에서 선언된 함수

- 키워드 class를 사용함으로써 생성

 

2. 객체 : 클래스의 인스턴스( instance )

 

클래스의 변수를 선언할 때 그 클래스의 객체가 생성된다. 객체는 물리적인 메모리를 가지고 있다. 

( 클래스 정의는 메모리 공간을 가지고 있지 않다. )

 

▶클래스는 자료형이고, 그 클래스의 변수 부분을 클래스의 객체 또는 인스턴스라 부른다. 

 

#include <iostream>
using namespace std;

class queue {
private: // private 멤버 
	int q[100]; 
	int sloc, rloc;
public: // public 멤버
	void init();
	void qput(int i);
	int qget();
};

int main() {
	// queue 형의 두 객체 Q1과 Q2를 생성
	queue Q1, Q2;
	//Q1의 sloc 값을 출력
	cout << Q1.qget();
    
    return 0;
}

 

private 멤버 : queue 클래스의 다른 멤버들에 의해서만 접근될 수 있다.

→ 프로그램의 다른 부분에 의해서는 접근될 수 없음 ( 캡슐화가 수행되는 한가지 방법 )

 

public 멤버 : 프로그램의 다른 부분에서도 접근이 가능 ( main함수에서 실행 가능 )

→ 공용 함수를 통해 클래스의 전용 원소들을 접근할 수 있음.

 

* 클래스는 추상 자료형이다. 

* main 함수에서 queue 클래스에 접근할 때는 외부 접근이다. 

* 클래스를 선언하는 부분을 head File 이라한다.

 

 

클래스 멤버 함수 구현

 

클래스의 멤버인 함수를 구현할 때, 함수 이름과 클래스의 이름을 함께 써서 컴파일러에게 함수의 소속을 알려줘야한다.

 

1. 범위 지정 연산자( :: ) : 함수의 소속 클래스를 명시

2. 멤버 함수 호출 시 사용 ( . ) 

 

int main() {
	// queue 형의 두 객체 Q1과 Q2를 생성
	queue Q1, Q2;
	
	// 멤버 함수 호출 시 사용
	Q1.init();

}

void queue::qput(int i) {
	if (sloc == 99) {
		cout << "Queue is full\n";
		return;
	}
	sloc++;
	q[sloc] = i;
}

 

* cpp 프로그램은 멤버 함수의 선언 부분인 head 파일과 cpp 실행 구현 부분을 따로 구분해서 저장한다.

  JAVA에서는 멤버 함수를 따로 구분하지 않고 클래스 안에서 같이 작성한다. 

 

메인함수에서 클래스의 객체를 생성하고 그 클래스의 멤버나 함수에 접근하는 것을 외부 접근이라 한다.

private 멤버들은 외부 접근들이 허용되지 않는다.

 

#include <iostream>
using namespace std;

class queue {
private: // private 멤버 
	int q[100]; 
	int sloc, rloc;
public: // public 멤버
	void init();
	void qput(int i);
	int qget();
};

void queue::qput(int i) {
	if (sloc == 99) {
		cout << "Queue is full\n";
		return;
	}
	sloc++;
	q[sloc] = i;
}

void queue::init() {
	rloc = sloc = -1;
}

int queue::qget() {
	if (rloc == sloc) {
		cout << "Queue underflow\n";
		return 0;
	}
	rloc++;
	return q[rloc];
}

int main() {
	// queue 형의 두 객체 a와 b를 생성
	queue a, b;
	
	a.init(); 
	b.init();
	a.qput(10);
	b.qput(19);
	a.qput(20);
	b.qput(1);

	cout << "queue a : ";
	cout << a.qget() << " ";
	cout << a.qget() << "\n";

	cout << "queue b : ";
	cout << b.qget() << " ";
	cout << b.qget() << "\n";

	return 0;

}

 

 

클래스 멤버에 대한 접근

 

#include <iostream>
using namespace std;

class myclass {
private:
	int a; // 전용데이터
public:
	int b; // 공용 데이터
	void setab(int i); // 공용 함수
	int geta();
	void reset();
};

void myclass::setab(int i) {
	a = i; //a를 직접 참조
	b = i * i; // b를 직접 참조
}

int myclass::geta() {
	return a;
}

void myclass::reset() {
	setab(0); // 다른 멤버 함수를 호출하는 것도 가능
}

int main() {

	myclass ob;
	ob.setab(5);
	cout << "ob after setab(5) : "<< ob.geta() << " ";
	cout << ob.b << "\n";

	ob.b = 20; // b가 공용이므로 b를 접근할 수 있음
	cout << "ob after ob.b=20 : " << ob.geta() << " ";
	cout << ob.b << "\n";

	ob.reset();
	cout << "ob after ob.reset() : " << ob.geta() << " ";
	cout << ob.b << "\n";

	return 0;
}

//▶ ob after setab(5) : 5 25
//   ob after ob.b=20 : 5 20
//   ob after ob.reset() : 0 0

 

 

실습문제

 

멤버 변수와 멤버함수를 갖는 box 클래스를 작성하기

 

#include <iostream>
using namespace std;

class box {
private:
	double x, y, z; // 가로, 세로, 높이
	double volume; // 부피
public:
	void setbox(double a, double b, double c); // x=a; y=b; z=c; 실행
	void calcvolume(); // 부피 계산
	int vol(); // 부피 반환
};

int main() {

	box mybox;

	double a, b, c;

	cin >> a >> b >> c;

	mybox.setbox(a, b, c);
	mybox.calcvolume();

	cout << "부피 : " << mybox.vol();

}

void box::setbox(double a, double b, double c) {
	x = a;
	y = b;
	z = c;
}

void box::calcvolume() {
	volume = x * y * z;
}

int box::vol() {
	return volume;
}