24.01.09 TIL - [C#] 클래스, 한정자, 메서드 등 기본 개념 요약

JJwoo·2024년 1월 9일
0

C#

목록 보기
14/20

https://github.com/wjj329/TextRPG2/tree/master/TextRPG2

배우긴 배웠는데 명칭이나 용법이 맨날 헷갈려서

간단하게 다시 상기하려고 써둠

일단 어제 만든 TextRPG2 클래스와 메서드 구조를 크게 한 번 보자.

C# 명칭 양식

PascalCase - 클래스, 구조체, 메서드(함수) 등
camelCase - 변수 등


public class Character // 캐릭터 클래스

public Character    // 캐릭터 클래스의 생성자

public class Item // 아이템 클래스

public Item     							// 아이템 클래스의 생성자
public void PrintItemStatDescription()      // 아이템 설명 출력 관련, 프로그램 클래스 안에 장착, 상점 관련 메서드들한테 아이템 표시 할 때 신나게 불려가시는 분
public static int GetPrintableLength()      // 아이템 텍스트 정렬 관련 1
public static string PadRightForMixedText() // 아이템 텍스트 정렬 관련 2 

Public Class // 게임스타트 클래스

 - static Character _player; 			프로그램 내 실제 캐릭터, 아이템 선언
 - static Item[] _items; 

 - static void Main(string[] args) 		   메인 메서드
 - private static void GameDataSetting()   게임 데이터세팅 메서드
 - static void StartMenu()  			   스타트메뉴 메서드, 프로그램 클래스 내에서만 쓰이니까 
 										   private 추가하는게 맞지 않나 했더니.. C# 기본은 안 쓰면 자동으로 Private라고 한다.
 - private static void StatusMenu()        플레이어 상태 메뉴
 - private static int getSumBonusAtk(), 방 합산 메서드, 아이템 장착으로 인한 스탯 변화 계산 때문에 쓰임
 - private static int getSumBonusDef()
 
 - private static void InventoryMenu()     인벤토리 메뉴
 - private static void EquipMenu() 		   장착 관리 메뉴
 - private static void ToggleEquipStatus() 아이템 장착 상태 변경 메서드
 
 - private static void StoreMenu() 		   상점 메뉴
 - private static void BuyItemMenu() 	   구매 메뉴
 - private static void SellItemMenu() 	   판매 메뉴
 
 - private static void ShowHighlightText()        메뉴 첫 줄 색 변경 함수
 - private static void PrintTextWithHighlights()  문자열 하이라이트, (가운데 색 변경)
 
 - private static int CheckValidInput() 	입력 값 유효성 확인 함수, 입장-퇴장 등 대부분에 쓰임
 - private static bool CheckIfVaild () 		bool 유효성 확인 함수, 위와 연동 됨. 범위 내면 진행, 아니면 다시
 
 - static void AddItem(Item item) 			아이템 추가 함수, GameDataSetting()의 아이템 생성에 사용.  - private 안 써서 생략 되어있음.
 
 - private static void PrintStartLogo() 	게임 스타트 로고 화면
 
 - private static void RestMenu() 			휴식하기 메뉴
 
 - private static void DungeonMenu() 		던전 입장 메뉴
 - private static void DungeonChoiceMenu() 	던전 난이도 선택 메뉴
 - private static void ExecuteDungeon()     던전 진행
 
 - private static void GameOverMenu()       게임 종료
 
 - private static void SaveGameMenu()       게임 저장 및 로드 메뉴
 - static void SaveGame() 					데이터 저장   - private 안 써서 생략 되어있음
 - static void LoadGame() 					데이터 로드   - private 안 써서 생략 되어있음

1. 선언과 정의?

선언은 이름을 정하는 느낌

static Character _player; 
static Item[] _items;

정의, 데이터를 할당.

int ItemCnt = 0;

간단 요약
한 마디로 데이터를 잡아먹느냐 안 잡아먹느냐의 유무로도 알 수 있겠다.


2. 함수? 메서드? 뭐가 맞는지

함수(Function)와 메서드(Method)는 기본적으로 비슷한 의미.

일반적으로 프로그램에서 코드를 조직하고 재사용 가능한 블록을 나타내는 데 사용.

두 용어는 사용되는 프로그래밍 언어와 컨텍스트에 따라 약간 다르다.

C#과 같은 객체 지향 프로그래밍 언어에서는 "메서드(Method)"라는 용어가 주로 사용.

JavaScript, Python과 같은 절차 지향 "함수(Function)"라는 용어를 주로 사용.

한 마디로 코드를 모듈화하고 재사용 가능한 블록을 말하는 것.

간단요약 :
C#는 객체 지향 이니까 앞으로는 메서드 (=함수) 라 불러야겠구나.
그냥 같은 뜻으로 봐야.


3. 인스턴스? 객체?


객체 = 인스턴스(instance) 큰 뜻은 같다고 하는데,

∴ 클래스에 기반하여 생성된 객체 = 인스턴스(instance)



4. 그 외 기본 용어


"private(사적인)"와 "public(공공적인)"은 접근 한정자(Access Modifier) 또는 접근 제한자라 부름.

private: 같은 클래스 내부에서만 접근 가능

간단 요약 :
데이터 보호 및 변조 방지, 소프트웨어 디자인 원칙 정석, C#에서는 생략하면 기본은 Private임
C#에서 클래스의 멤버들은 액세스 한정자가 명시되지 않은 경우 기본적으로 private으로 설정.



public: 모든 클래스에서 접근 가능

Character 클래스와 Item 클래스가 다 Public인 이유는 만들어 둔 값을
Program Class안의 메서드들이 신나게 참조하기 때문.


2. static(정적인)

게임에서 전역적으로 사용될 플레이어 캐릭터와 아이템 목록.
이러한 데이터는 게임의 여러 부분에서 필요하기에
각각의 인스턴스를 만들지 않고도 접근해야 하므로 정적으로 선언.

공통적으로 써야 해서 값이 변하지 않아야 할 때 쓰는 편.
뭔소리야? 싶다면..

ex)

 	Hp 어쩌구
	Atk 어쩌구
        public int Def { get; }
        public int Gold { get; set; } 
        (생략)
        public static int ItemCnt = 0;  왜 너만 static이니? 아래 참조
`
아이템 클래스를 정의하는 곳을 보면
1. Hp, Atk, Def나 Gold 등등은 다른 메서드들에 불려가서, 
   아이템 구매나 사냥 등 여러가지 인스턴스에서 서로 다른 값을 가질 수 있기 때문에 static이 아니고
2. ItemCnt에는 Static이 붙였는데, 
   기능적으로는 조건문을 통해 0부터 시작해서 아이템 클래스의 배열을 출력하는 기능 말고는 없으니 
   ( =0 값이 )Item 클래스의 모든 인스턴스에 공통적으로 적용 + 
// Public + Static = 전체에 공통적으로 공유되는 느낌이라 보면 될 듯.

static은
값이 공통적으로 쓰이거나 변하지 않아야 할 때 주로 사용.
이번 게임에서는, 아이템 클래스의 인스턴스 간에 공유되는 아이템 개수 카운터(ItemCnt)에 static 사용.



3. void / int / bool / string

뜻은 대충 아니까 패스하고
돌려주는 값이 저거라고 생각하면 됨.

ex)
실컷 계산해서 최종 값이 int다, 수를 연산하는 기능에 쓸거다.
= int 붙여주기, 필요시 다른 데서 계산 할 때 이 메서드 이름으로 활용 할 수 있음

ex2)
void는 반환값이 없다는 건데 그냥 뭔가 특별한 기능이 있다는 것,
필요시 다른 메서드에서 호출하여 만들어 둔 기능을 실행.

(호출한다고 하니 덧붙이자면, 위에서 말한 public or private 제한자에 따라 메서드의 호출 가능 범위는 달라짐. 당연한 소리)



4. 이름

=> 말 그대로 메서드(함수) 이름. pass


5. 메서드 뒤에 ( ) = 매개변수

매개 변수 = Parameter 파라미터

한 줄 요약
데이터를 전달 받고 함수 내부에서 사용하면, 함수가 매개 변수의 다양한 입력을 받아 다양한 작업을 수행

ex) 다시 TextRPG2 코드 참조




public Item(string name, string description, int type, int atk, int def, int gold, bool isEquipped = false)

Item 클래스의 생성자의 매개 변수 안에 우리가 만든 세팅들을 신나게 넣어놨었는데, 밑에 보면


AddItem(new Item("수련자 갑옷", "수련에 도움을 주는 갑옷입니다.", 0, 0, 9, 2000));

가령 Program 클래스의 내의 GameDataSetting() 메서드 안의 아이템 Item 배열에 써먹을 수 있었음.  
0, 0, 9, 2000 전부 int형이어서, string인 name이나 description은 건너뛰고 type, atk, def, gold가 반영 됨.



ex2)
public void PrintItemStatDescription(bool withNumber = false, int idx = 0, bool showPrice = true)

아이템 출력 관련 함수의 매개 변수에 

bool withNumber = false    아이템 앞에 번호 표시 여부에 씀, 기본 상태는 false다.
int idx = 0                아이템 번호, 아이템 배열 띄워주는 데에 씀. (바로 밑에 코드 참조)
bool showPrice = true      구매 상태에 따라 가격 보여주느냐, 구매완료 보여주느냐 여부에 씀 ( 상점이랑 구매/판매 기능 때문에)




private static void InventoryMenu()라는 인벤토리 메서드 안에

            for (int i = 0; i < Item.ItemCnt; i++)   아이템의 Itemcnt 반복문, 아이템의 가짓 수 만큼 출력되어 보임
            {
                if (_items[i].IsPurchased)           구매한 아이템 이라면 표시
                {
                    _items[i].PrintItemStatDescription(true, i + 1, false);
                }
            }


// for 조건문(초기/조건/증감)안에 
// if 조건문 안에

_items[i].PrintItemStatDescription(true, i + 1, false)가 쓰이고 있는데, 매개변수를 보면..
 
1. 매개 변수 첫 번째 true 는 "bool withNumber(숫자 표시 유무)"이다. 현재 인벤토리 메서드에서는 true라서 보여지는데, 
   상점에선 사실 구매 페이지에 진입해서 번호로 구매템 고를거 아니면 아이템 번호를 보여줄 필요가 없기에 false 상태다. 

2. 매개 변수 두 번째 "i + 1"은 인덱스(0부터 시작)랑 실제 표시하고 싶은 숫자 차이(1부터 보여주고 싶으니까) 때문에 한 것.

3. 마지막은 false는 bool showPrice, "가격 or 구매완료 텍스트"를 표시하고 조건에 따라 둘 중 하날 출력 해주는 녀석이다.
false로 되어있는데, 현재 인벤토리 메서드는 얘가 false던 true던 상관 없이 가격or구매완료 표시가 필요 없으니, 
그냥 false를 매개변수에서 지워버리면 관련 글자도 안 보인다. 

그말인즉, 여기서는 PrintItemStatDescription(true, i + 1)"생략" 가능
   
profile
개발 모코코

0개의 댓글