Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

Yejom's Dev Log

[C++ 입문] 7. structure, class 본문

Smart Factory Bootcamp

[C++ 입문] 7. structure, class

Yejom 2024. 5. 14. 19:46
  • 구조체 (structure)

- 프로그래밍을 하다 보면 변수 하나로 표현하기 힘든 것이 있음.
- ex) 학생을 표현 하려한다면 이름, 나이, 학교, 학년, 학번, 전공  다양한 특징에 대한 변수가 필요함.

struct Position {
	int x = 0;
	int y = 0;
};

int main() {
	Position p;
	p.x = 3;
	p.y = 5;
	p = { 3, 5 };
}

  • 클래스 (class)
  • UML (Unified Modeling Language) : 모델을 만드는 표준언어
  • UML을 사용하는 유형
1. 다른 사람들과의 의사소통 또는 설계 논의
2. 전체 시스템의 구조 및 클래스의 의존성 파악
3. 유지보수를 위한 설계의 back-end 문서
 
  • 클래스 다이어그램 (Class Diagram)
 
class diagram
: 클래스 내부의 정적인 내용이나 클래스 사이의 관계를 표기하는 다이어그램
- 시스템의 일부 또는 전체의 구조를 나타낼 수 있음.
- 클래스 다이어그램은 의존 관계를 명확히 보게 해줌.
 

장) 코드 재사용, 유지보수가 용이 / 개념적으로 구성할 수 있음.

단) 처리속도가 느림. -> 사람이 인지할 정도의 수준은 아님. / 설계가 복잡함.

  • 헤더 파일에 클래스 정의 작성.
  • cpp 파일에 클래스 선언부 작성.
  • 파일 이름은 클래스 이름과 일치시키는 풍속(?)이 있음.

https://coding-factory.tistory.com/697

 

[C++] 클래스(Class) 사용법 & 예제 총정리

클래스(Class)란? 클래스(class)는 객체 지향 프로그래밍(OOP)에서 특정 객체를 생성하기 위해 변수와 메서드를 정의하는 일종의 틀이며 내부적으로 객체를 정의하기 위한 상태 값을 의미하는 멤버

coding-factory.tistory.com

 

  • 접근 제어자
public 어디서든 접근이 가능 (외부에서도 모두 접근 가능)
private 클래스 내부에 정의된 함수에서만 접근 허용 (중요한 정보를 감출때 사용)
protected 기본적으로는 private이지만 상속관계에 놓여있을 때, 유도 클래스에서는 접근 허용

 

  • 실습 (객체 지향)
  • prac4_customizing_game_character.cpp
#include "Character.h"
#include "myFunc.h"

#include <iostream>
#include <string>
#include <vector>
#include <fstream>

using namespace std;
using namespace findData;

/* 기능 추가 */ // ~현재진행
// 예외 처리 (아이템 사용/구매/판매) ~ㅇㅋ
// 필드 추가 (체력, 돈) ~ㅇㅋ
// 메소드 추가 (아이템 구매/판매, 공격, 전멸, 자결) 아이템까지만 ~ㅇㅋ
// 기능 추가 (객체 선택, 레벨 업하면 체력 증가, 돈 많거나 스탯 쌓으면 레벨 업, 체력 0 되면 소멸) ~체력 ㄴㄴ


int main() {

	int idx;
	int manipulating; // 캐릭터를 어떻게 조작할지 받는 case 변수
	int damagedIDX;
	string c_name; // 사용자가 사용하고자 하는 캐릭터 이름 
	string status; // Login 화면에서 벗어나지 않았으면 ON, OFF 시 게임 종료
	vector<Character> players; // 사용자가 지금껏 등록한 계정(인스턴스)을 담아두는 벡터
	

	while (1) {
		status = "ON";

		std::cout << "[HOST] 사용할 캐릭터의 이름을 입력하시오. (0 입력 시 종료) : ";
		std::cin >> c_name;

		if (c_name == "0")
		{
			break;
		}

		else {
			// players 명단의 몇 번 인덱스에 c_name이 있는지 확인(회원가입 되어있는지 확인 후 접속)
			idx = getIndex(c_name, players);

			if (idx != -1) {

				// 계정이 존재함, 로그인한 계정의 정보 출력해주기
				players[idx].prtInfo();
			}
			else { // 계정이 없기 때문에 인스턴스를 새로 만듬.(변수 이름 NA)
				Character NA(c_name);

				cout << "계정 생성!" << endl;

				// 값 비교를 하기 위해 벡터에 인스턴스 추가.
				players.push_back(NA);

				// 벡터의 마지막에 넣었기 때문에.
				// switch 문에서 접근하기 위해 인덱스 기록
				idx = players.size() - 1;
			}
		}

		// 사용자가 게임 종료를 원하기(0 입력) 전까지 동작을 입력받기
		while (status == "ON") {

			cout << endl << "[HOST] 어떤 동작을 실행하시겠습니까? (0 종료): ";
			/*<< "1) 이름 변경" << endl
			<< "2) level up" << endl
			<< "3) item 파밍!" << endl
			<< "4) item 사용" << endl
			<< "5) 이름, level, item 출력" << endl
			<< "0) 게임 종료" << endl*/

			cin >> manipulating;

			switch (manipulating) {

			case 1:

				// players 명단에 이름이 있는지 확인하고 인덱스 받아오기
				idx = getIndex(c_name, players);

				cout << "새 이름을 입력해주세요 : ";

				cin >> c_name;

				players[idx].setName(c_name);

				// 이름 변경하는 함수 호출
				players[idx].setName(c_name);

				// 이름 반환해주는 함수 호출해서 변경된 이름 확인
				cout << endl << "이름이 변경되었습니다." << endl << "new name : " << players[idx].getName() << endl << endl;

				break;

			case 2:

				players[idx].accelLevel();

				break;

			case 3:

				players[idx].pickupItem();

				cout << "현재 아이템 개수 : " <<	players[idx].getItemNum() << endl << endl;

				break;

			case 4:

				// 예외 처리(아이템이 없으면 사용하지 못함)
				if (players[idx].getItemNum() > 0) {

					players[idx].useItem();

					cout << "현재 아이템 개수 : " << players[idx].getItemNum() << endl << endl;;

				}
				else {
					cout << "사용할 아이템이 없습니다!" << endl << endl;
				}

				break;
				
			case 5:

				players[idx].buyItem();

				cout << "현재 아이템 개수 : " << players[idx].getItemNum() << endl
					<< "현재 보유한 돈 : " << players[idx].getMoney() << endl << endl;

				break;

			case 6:

				players[idx].sellItem();

				cout  << "현재 아이템 개수 : " << players[idx].getItemNum() << endl
					<< "현재 보유한 돈 : " << players[idx].getMoney() << endl << endl;

				break;

			case 7:
				cout << "공격할 캐릭터의 이름을 입력해주세요. : ";
				cin >> c_name;

				damagedIDX = getIndex(c_name, players);

				players[idx].attack(damagedIDX,players);
				
				cout << "[NOTICE] " << players[damagedIDX].getName() << "이(가) 공격받았습니다 !!! HP 50 감소 !!!" << endl;

				break;

			case 8:

				players[idx].eliminateAll(idx, players);

				break;

			case 9:

				players[idx].selfDestructed(idx, players);

				break;

			case 10:

				players[idx].prtInfo();

				break;

			case 11:

				// players 명단 출력
				cout << "[현재 접속 중인 플레이어]" << endl;

				for (Character player : players) {

					cout << player.getName() << " " << endl;
				}
				cout << endl << endl;
				break;

			case 0:
				 
				cout << "게임을 종료합니다." << endl;

				status = "OFF";

				break;

			default:

				cout << "잘못된 입력입니다. 다시 입력해주세요." << endl;

				break;
			}
		}
	}
}

 

- main문 (링크 확인)

https://github.com/YejeongKang/240513/tree/main/240513

 

240513/240513 at main · YejeongKang/240513

Contribute to YejeongKang/240513 development by creating an account on GitHub.

github.com


  • 클래스 상속
  • 상속 문법
class Person { 
}
class Student : public Person { 
// 여기서 Person 클래스를 Student 클래스가 상속 받음
}

 

- Person 클래스에 있는 멤버(변수, 메소드)를 Student 클래스에서 사용할 수 있게 됨.

  • 생성자 및 소멸자

2-5-6-3 순서대로 생성자 및 소멸자 실행

 

  • overriding

: 부모 클래스 메서드를 자식 클래스에서 재정의 (메소드명과 매개변수가 모두 같을 때)

// 이렇게도 사용 가능
자식 클래스.부모 클래스::메소드(매개변수);
  • overloading

: 한 클래스에서 메소드 이름은 같지만 파라미터 개수나 자료형 다름.

 

  • 추상 클래스 ??

: 추상 메소드를 한 개 이상 가지고 있는 클래스
- 추상 클래스로는 인스턴스를 생성할 수 없다.
- 추상 클래스를 상속 받은 자식 클래스는 추상 메소드를 모두 구현해야 한다.
- 만약 구현하지 않는다면, 자식 클래스 또한 추상 클래스가 된다

virtual void example() {} // 가상 함수: 오버라이딩 권장

virtual void example() = 0; // 순수 가상 함수: 오버라이딩 강제