Yejom's Dev Log
[C++ 입문] 7. structure, class 본문
- 구조체 (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을 사용하는 유형
- 클래스 다이어그램 (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 클래스에서 사용할 수 있게 됨.
- 생성자 및 소멸자
- overriding
: 부모 클래스 메서드를 자식 클래스에서 재정의 (메소드명과 매개변수가 모두 같을 때)
// 이렇게도 사용 가능
자식 클래스.부모 클래스::메소드(매개변수);
- overloading
: 한 클래스에서 메소드 이름은 같지만 파라미터 개수나 자료형 다름.
- 추상 클래스 ??
: 추상 메소드를 한 개 이상 가지고 있는 클래스
- 추상 클래스로는 인스턴스를 생성할 수 없다.
- 추상 클래스를 상속 받은 자식 클래스는 추상 메소드를 모두 구현해야 한다.
- 만약 구현하지 않는다면, 자식 클래스 또한 추상 클래스가 된다
virtual void example() {} // 가상 함수: 오버라이딩 권장
virtual void example() = 0; // 순수 가상 함수: 오버라이딩 강제
'Smart Factory Bootcamp' 카테고리의 다른 글
[C++] Visual Studio 외부 라이브러리 추가 (0) | 2024.06.28 |
---|---|
[C++] thread (0) | 2024.06.27 |
[C++ 입문] 6. file separation, namespace (0) | 2024.05.09 |
[C++ 입문] 5. list, string (0) | 2024.04.30 |
[C++ 입문] 4. vector, execution time (0) | 2024.04.26 |