언어/C++

[C++] 객체지향설계의 이해(실습)

이태홍 2022. 10. 25. 15:46

🤔 객체지향설계의 이해 실습

이전에 포스팅한 내용을 바탕으로 실습을 진행해보겠습니다.

 

 

 

 

이론을 이해하고 실습을 하는 것을 추천하기 때문에 아래의 포스팅을 먼저 읽은 후에 실습을 진행하시는 것을 추천합니다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

🔎 컴파일 에러 해결 1

 

📃 문제 

 

 

 

 

✏️ 해결

더보기

 

해설 : short 데이터 형은 32768을 나타낼 수 없기 때문에 int형으로 바꾸어 주어야 한다.

 

#include <iostream>

class LetDebug {
public:
	void printNum() {
		short s1 = 32767;
		short s2 = 1;
		int s3 = s1 + s2;

		std::cout << s3 << std::endl;

		std::cout << s1 << std::endl;
	}
};

int main() {
	LetDebug* Id = new LetDebug;
	Id->printNum();
	return 0;
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

🔎 Storage Duration

 

 

📃 문제

 

 

 

 

✏️ 해결

더보기

 

해석 : public을 선언하지 않으면 private으로 자동 선언된다.

 

main() 함수에서 Setvalue클래스의 변수에 직접 접근할 수 없기 때문에 컴파일 에러가 난다.

 

public을 선언해야 한다.

 

#include<iostream>

class SetValue
{
public:
	int x, y;
};

int main()
{
	SetValue obj; // 클래스이름 객체이름
	obj.x = 33;
	obj.y = 44;
    
	std::cout << "X = " << obj.x << " , Y = " << obj.y << std::endl;
    
	system("pause");
	return 0;
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

🔎 추상화 및 캡슐화

 

📃 문제

 

 

 

 

 

✏️ 해결

더보기

 

 해설 :  SetValue클래스의 지역변수 x, y가 private하게 선언되어 있으므로 해당 클래스의 메소드를 이용하여 변수에 접근하도록 한다.

 

즉, 추상화를 통해 해당 변수의 값을 변경한다.

 

#include<iostream>
class SetValue
{

	int x, y;

public:
	void setXY(int X, int Y) {
		x = X;
		y = Y;
	}


	void show() {
		std::cout << "X = " << x << " , Y = " << y << std::endl;
	}
};

int main()
{
	SetValue obj; // 클래스이름 객체이름
	
	obj.setXY(33, 44);
	obj.show();

	system("pause");
	return 0;
}

 

 

 

 

 

 

 

 

 

 

🔎 Method Overloading (C언어 vs C++)

 

📃 문제

 

 

 

 

✏️ 해결

더보기

 

해설 : C언어는 overloading을 허용하지 않지만 C++언어에서는 overloading을 허용하기 때문에 컴파일 에러가 발생하지 않는다.

 

 

 

 

C 언어

#include <stdio.h>
void print(int var)
{
	printf("Integer number: %d \n", var);
}
void print(float var)
{
	printf("Float number: %f \n", var);
}
void print(int var1, float var2)
{
	printf("Integer number: %d \n", var1);
	printf(" and float number: %f", var2);
}
int main()
{
	int a = 7;
	float b = 9;
	print(a);
	print(b);
	print(a, b);
	return 0;
}

// c에서는 에러가 난다. Overloading이 되지 않기 때문

 

 

 

 

C++

#include <stdio.h>
void print(int var)
{
	printf("Integer number: %d \n", var);
}
void print(float var)
{
	printf("Float number: %f \n", var);
}
void print(int var1, float var2)
{
	printf("Integer number: %d", var1);
	printf(" and float number: %f", var2);
}
int main()
{
	int a = 7;
	float b = 9;
	print(a);
	print(b);
	print(a, b);
	return 0;
}

// cpp에서는 에러가 나지 않는다. Overloading을 허용하기 때문

 

 

 

 

 

 

 

 

 

 

 

 

 

🔎 Stack

 

 

📃 문제

 

 

✏️ 해결

더보기

 

 해설 : stack을 구현합니당 

 

#include <iostream>
#define MAXSTACKSIZE 1000 // 스택의 최대 크기
class Stack {
	int top;
public:
	int a[MAXSTACKSIZE]; // 스택
	Stack() { top = -1; } // 스택의 꼭대기 값 초기화
	bool push(int x);
	int pop();
};
bool Stack::push(int x)
{
	if (top >= (MAXSTACKSIZE - 1)) {
		std::cout << "오류: 스택이 넘쳤습니다." << std::endl;
		return false;
	}
	else {
		// 코드 구현: 스택에 데이터 넣기
		
		a[++top] = x;

		std::cout << x << " 이 스택에 들어갔습니다." << std::endl;
		return true;
	}
}
int Stack::pop()
{
	if (top < 0) {
		std::cout << "오류: 스택이 비었습니다." << std::endl;
		return 0;
	}
	else {
		// 코드 구현 : 스택에서 데이터 빼기

		int x = a[top--];
		return x;
	}
}
int main()
{
	class Stack s;
	s.push(7);
	s.push(88);
	s.push(999);
	std::cout << s.pop() << " 을 스택에서 꺼냈습니다." << std::endl;
	std::cout << s.pop() << " 을 스택에서 꺼냈습니다." << std::endl;
	std::cout << s.pop() << " 을 스택에서 꺼냈습니다." << std::endl;
	system("pause");
	return 0;
}

 

🔎 

📃 문제

 

 

 

✏️ 해결

더보기

 

해설 :  random 함수를 호출하여 Dice 클래스의 지역변수인 value에 접근한다.

 

#include <iostream>
#include <ctime>
#include <cstdlib>
class Dice
{
	int value; // 주사위 값
public:
	void set_dice_value() // 주사위 값을 난수로 받을 수 있도록
	{
		/* 이 곳에 코드 추가 */
		value = rand() % 6 + 1;

	}
	int get_dice_value()
	{
		return value;
	}
};
int main()
{
	srand(time(NULL));
	Dice dice1;
	Dice dice2;
	dice1.set_dice_value();
	dice2.set_dice_value();
	std::cout << "두 주사위 합=" << dice1.get_dice_value() + dice2.get_dice_value() << std::endl;
	return 0;
}