부트캠프 7일차
1. 오늘 학습 키워드
Out, Ref, 다중 상속, 인터페이스, 예외처리, 열거형(enum), delegate, Action, Func, Object
2. 오늘 학습 한 내용을 나만의 언어로 정리하기
2.1 Out, Ref
1) Out
<예시>
using System;
class Program
{
static void Main()
{
int result;
CalculateSum(5, 10, out result);
Console.WriteLine($"Sum: {result}"); // Sum: 15
}
static void CalculateSum(int a, int b, out int sum)
{
sum = a + b; // 반드시 값을 할당해야 함
}
}
메인에서 5,10을 더하는 메서드를 통해 sum 값을 계산하고
이를 result에 넣어준다. 그럼 sum과 result의 값이 같아진다.
Out을 사용할 때, 참조 방식이기에, 값 변경에 조심해야한다.
Out의 특징
1. 메서드 호출 전에 초기화를 할 필요가 없음
2. 메서드 내부에서 반드시 값을 변경해야 함
3. 주로 메서드에서 새로운 값을 반환할 때
2) ref
<예시>
// ref 키워드 사용 예시
void Swap(ref int a, ref int b)
{
int temp = a;
a = b;
b = temp;
}
int x = 1, y = 2;
Swap(ref x, ref y);
Console.WriteLine($"{x}, {y}"); // 출력 결과: 2, 1
Swap이라는 메서드를 만들어서, X와 Y의 값을 Swap 했을 때,
ref 방식도 참조 방식이기에 초기 값과 달라진 값이 달라진다.
ref의 특징
1. 메서드 호출 전에 초기화를 해야함
2. 메서드 내부에서 값을 변경하지 않아도 됨
3. 주로 기존 값 수정 및 사용할 때 사용함.
2.2 다중 상속
- 다중 상속을 하지 않는 이유
1) 다이아몬드 문제 - 한 클래스가 두 개 이상의 클래스를 부모 클래스로부터 동일한 멤버
2) 설계의 복잡성 증가 - 클래스 간의 관계가 복잡해짐
3) 이름 충돌과 충돌 해결의 여러움 - 여러 부모 클래스로부터, 상속받은 멤버들이 이름이 충돌할 수 있음
4) 설계의 일관성, 단순성 유지
2.3 인터페이스
2.3.1 인터페이스를 사용하는 이유
1) 코드의 재사용성 - 다른 클래스에서 해당 인터페이스를 구현하여, 동일한 기능을 공유
2) 다중 상속 제공 - C#에서는 클래스가 단일 상속을 지원하지만, 인터페이스는 다중 상속을 지원여러 인터페이스를 구현함으로써, 여러 개의 기능을 조합할 수 있음
3) 유연한 설계 - 클래스는 인터페이스를 구현하기만 하면 되기에, 클래스와 인터페이스 간에 느슨한 결합 형성
2.3.2 인터페이스 - 클래스가 구현해야 하는 멤버들을 정의하는 것,
⊙인터페이스 특징
1) 클래스의 일종이 아니며, 클래스에 대한 제약 조건을 명시
2) 클래스가 인터페이스를 구현할 시, 모든 인터페이스의 멤버를 구현해야 한다.
3) 다중 상속 지원
⊙ 인터페이스 선언
interface IMyInterface
{
void Method1();
int Method2(string str);
}
⊙ 인터페이스 구현
class MyClass : IMyInterface
{
public void Method1()
{
}
public int Method2(string str)
{
return 0;
}
}
2.4 열거형(enum)
2.4.1 열거형을 사용하는 이유
1) 가독성
2) 자기 문서화 - 의미 있는 이름을 사용하여, 상수를 정의할 수 있다.
3) 스위치 문과 호환성 - 스위치 문과 함께 사용시에 매우 유용함
⊙ 열거형 정의
enum MyEnum
{
Value1,
Value2,
Value3
}
⊙ 열거형 형 변환
int intValue = (int)MyEnum.Value1; // 열거형 값을 정수로 변환
MyEnum enumValue = (MyEnum)intValue; // 정수를 열거형으로 변환
⊙ 열거형 스위치문과 호환
switch(enumValue)
{
case MyEnum.Value1:
break;
case MyEnum.Value2:
break;
case MyEnum.Value3:
break;
default:
break;
}
2.5 예외처리
2.5.1 예외란?
- 프로그램 실행 중에 발생하는 예기치 않은 상황으로, 정상적인 흐름을 방해하고, 오류를 야기한다.
2.5.2 예외 처리의 필요성
- 예외 상황에 대비하여, 프로그램을 안정적으로 유지하도록 도움
- 예외 처리를 통해, 오류를 적절히 처리하고, 프로그램 실행을 계속할 수 있도록 함.
- 디버깅을 용이하게 함.
2.5.3 예외 처리 구현
try
{
// 예외가 발생할 수 있는 코드
}
catch (ExceptionType1 ex)
{
// ExceptionType1에 해당하는 예외 처리
}
catch (ExceptionType2 ex)
{
// ExceptionType2에 해당하는 예외 처리
}
finally
{
// 예외 발생 여부와 상관없이 항상 실행되는 코드
}
⊙ 우선 순위
1. catch 블럭은 위에서부터 순차적으로 실행되기에, 예외 타입에 해당하는 첫 블럭이 실행된다.
2. 상속 관계에 있을 경우, 상위 예외 타입의 Catch 블럭이 먼저 실행 된다.
2.5.4 finally
1. 예외 발생 여부와 관계 없이 항상 실행 됨
2. 예외 처리의 마지막 단계로, 예외 발생 시 정리 작업이나, 리소스 해제 등의 코드를 포함할 수 있다.
3. 생략 가능
2.5.5 사용자 정의 예외
1. 필요에 따라 자신만의 예외 클래스를 작성할 수 있음.
2. Exception 클래스를 상속받아 작성, 추가적인 기능이나 정보가 제공된다.
예시
public class NegativeNumberException : Exception
{
public NegativeNumberException(string message) : base(message)
{
}
}
try
{
int number = -10;
if (number < 0)
{
throw new NegativeNumberException("음수는 처리할 수 없습니다.");
}
}
catch (NegativeNumberException ex)
{
Console.WriteLine(ex.Message);
}
catch (Exception ex)
{
Console.WriteLine("예외가 발생했습니다: " + ex.Message);
}
2.8 TRPG
Text RPG를 제작하며, 내가 한 부분을 정리하려고 한다.
우선 Case에 따른 switch문을 사용 및 가독성을 높이기 위해 enum을 사용했다
enum Lobby_info
{
Status=1,
Inventory,
Store
}
enum Classes
{
전사 = 1,
마법사,
궁수,
도적
}
화면을 처음 켰을 때, Setup 세션으로 이름 설정, 직업을 선택하는 과정이다
static Player player = new Player();
static private void Setup()
{
Console.WriteLine("원하시는 캐릭터의 이름을 입력해주세요");
string name = Console.ReadLine();
player.Name = name;
Console.Clear();
Console.WriteLine("원하시는 직업을 선택해주세요\n");
Console.WriteLine("1. 전사\n2. 마법사\n3. 궁수\n4. 도적");
string choice = Console.ReadLine();
if(int.TryParse(choice, out int Value)&&Enum.IsDefined(typeof(Classes),Value))
{
Classes classes = (Classes)Value;
player.Class = classes.ToString();
switch(classes) // 추후에 마개조(?)인지 아닌지 컨펌,, 직업마다, 세팅 설정
{
case Classes.전사:
// 전사
break;
case Classes.마법사:
// 마법사
break;
case Classes.궁수:
//궁수
break;
case Classes.도적:
//도적
break;
}
}
else
{
Console.WriteLine("잘못된 값을 입력 하셨습니다.");
}
}
조건문을 통해 ReadLine으로 받아온 String인 choice를 int형으로 변환시킨 값을 Value로 반환하고, 그 반환된 값이 Classes에서 매겨준 상수들의 값이 있는가를 판단하여, 있을 경우에는 조건문을 타고, 없을 경우에는 잘못된 값을 입력 하셨습니다. 라는 말을 출력하게 만들었다.
추후에 Class마다 능력치를 변환 할 예정이다.
Lobby
static private void Lobby()
{
while (true)
{
Console.Clear();
Console.WriteLine("스파르타 마을에 오신 여러분 환영합니다.");
Console.WriteLine("이 곳에서 던전으로 들어가기 전 활동을 할 수 있습니다.\n");
Console.WriteLine("1. 상태 보기\n2. 인벤토리\n3. 상점\n");
Console.Write("원하시는 행동을 입력해주세요. \n >> ");
string choice = Console.ReadLine();
if (int.TryParse(choice, out int Value) && Enum.IsDefined(typeof(Lobby_info), Value))
{
Lobby_info enumValue = (Lobby_info)Value;
switch (enumValue)
{
case Lobby_info.Status:
ShowStatus();
//status class
break;
case Lobby_info.Inventory:
ShowInventory();
//inven
break;
case Lobby_info.Store:
ShowStore();
// store
break;
}
}
else
{
Console.WriteLine("잘못된 값을 입력을 하셨습니다.");
}
static void ShowStatus()
{
Console.Clear();
player.DisplayStatus();
Console.ReadKey();
}
static void ShowInventory()
{
}
static void ShowStore()
{
}
}
}
Setup 때와 마찬가지로 작성해둔 enum Lobby_info과 switch 문을 사용해 선택한 값마다 다른 창을 띄우는 구문을 작성중이다.
현재 Status 창에 관련된 작업만 완료했다.
3. 학습하며 겪었던 문제점 & 에러
학습한 내용이 너무 많아서, 정리를 하기가 너무 힘들었다.....
이제 작업을 한 내용을 주로 올릴 것이기에, 작성을 금요일에 해야하지만, 미루다보니,, 월요일에 작성이 끝나였다..
4. 내일 학습 할 것은 무엇인지
List, Dictionary를 사용해 아이템 클래스 추가, player 클래스 추가, 인벤토리 창 추가 정도 구현할 것 같다.
'TIL' 카테고리의 다른 글
25.02.04 TIL (0) | 2025.02.04 |
---|---|
25.02.03 TIL (1) | 2025.02.03 |
if(today == 25.01.27) for (int i = today; i<25.01.28;i++) Class TIL (0) | 2025.01.27 |
Unity Anim , Console.Write("Today is 25.01.24"); (0) | 2025.01.25 |
TIL / 25.01.23 (0) | 2025.01.23 |