어제 쓰던거에 이어서,,,
1) 인터페이스와 열거형
{
인터페이스 ( Interface )
{
인터페이스란, 클래스가 구현해야하는 맴버들을 정의하는 것이라 한다.
즉 인터페이스가 클래스의 일종인것은 아니고, 클래스의 제약 조건을 명시하는 것이다.
예시 1 : 이동 구현
![](https://blog.kakaocdn.net/dn/cgFcFZ/btsJIPt22q8/h4D9Q0APgJdOENNAAMBydk/img.png)
이렇게 interface와 그 맴버를 선언하고
![](https://blog.kakaocdn.net/dn/bDQYQ6/btsJJTPJ25E/er6jXbre6Wq1pvKW7aK7b0/img.png)
![](https://blog.kakaocdn.net/dn/cSstnm/btsJI0WqsZ9/bEQw99qcPj6KJ8eUxMK6v1/img.png)
후에 클래스를 선언해 클래스에 인터페이스를 달아줘 제약을 걸어주게되면 빨간줄이 뜬다 ; 인터페이스 맴버를 구현하지 않았기 때문에.
![](https://blog.kakaocdn.net/dn/Ifb4z/btsJIRrSi2i/ctMnLgPSPvrreXjotnrE2k/img.png)
이렇게 클래스를 선언할때 클래스의 구성 요소를 인터페이스가 결정하는 방식이 되어, 클래스를 하나하나 선언할 필요 없이 인터페이스를 수정하고 적용시키는 방식으로 용이하게 작업할수 있게되는 것으로 이해했다.
![](https://blog.kakaocdn.net/dn/bhNFxa/btsJI3S7ISW/ZHteFPkVPefTYfnYT5Heik/img.png)
메인에서 불러와 실행시킬땐 이런식으로 간단히 만들어둔 인터페이스를 참조시키는것으로 통일시킬수 있게된다.
예시 2 : 아이템 구현
![](https://blog.kakaocdn.net/dn/zNe1B/btsJI1fzNSF/coCY4hvflS0uCiT1AkztS1/img.png)
이렇게 아이템을 IUsable로 사용할수 있는 메소드를 달아줄수 있게 되었다.
근데 사용할수 있는(Usable)물건이 Item뿐만 아니라 다른 항목들의 오브젝트들도 만들수 있게 될탠데, 이때 동일한 인터페이스를 사용하면 각기 다른 오브젝트들을 하나의 메소드로 발동시킬수 있게되어 매우 용이하다고 한다.
![](https://blog.kakaocdn.net/dn/PcrnN/btsJIPGrZor/9Whz7x5JeJVYllc5PVMEs1/img.png)
또한 이렇게 메소드별 인터페이스를 다중으로 만들어서 한 클래스에서 다중 상속을 구현할수도 있다.
즉 이 경우엔 아이템의 기능별로 인터페이스를 만들어주면 되는것. 아주 좋은 방식인것 같다.
}
열거형 ( Enums )
{
열거형을 사용하면 연관된 상수들을 명명해 코드의 가독성을 향상 시킨다고 한다.
특히 스위치 문과 호환성이 아주 좋다고 하는데, 왜 그런지는 예제로 알아보도록 하자.
단순히 한 해의 달들을 열거해놨다, 근데 1월(Jan)에 1이라고 명시를 해두니 자동으로 각 달들에 숫자(int값)가 지정이 된다
(1을 명시하지 않으면 0~11의 값으로 지정됨)
그리고 메소드에선 이렇게 사용하게 되는데, (int)Month.Jan으로 Month라는 열거형의 jan의 int (1)값을 불러오고,
같은 방식으로 Dec의 int값(12)도 불러와 사용할수 있다. 가독성이매우 좋아진것 같다.
}
}
2) 예외 처리 및 값형과 참조형
{
예외 처리
{
예외란 프로그램 실행중 발생하는 예기치 못한 상황, 즉 오류이다.
예외 처리란 그 오류 발생 상황을 적절히 처리하고 프로그램의 안정성을 높이는 역할을 한다고 한다.
try-catch 블록을 사용해서 예외 처리를 할수 있다
try 블록에서 예외가 발생할수 있는코드를 작성하고, catch 블록에서 예외를 처리한다.
예제:
try
{
// 예외가 발생할 수 있는 코드
}
catch (ExceptionType1 ex)
{
// ExceptionType1에 해당하는 예외 처리
}
catch (ExceptionType2 ex)
{
// ExceptionType2에 해당하는 예외 처리
}
finally
{
// 예외 발생 여부와 상관없이 항상 실행되는 코드
}
여라가지 catch가 위에서 아래로 순서대로 진행한다. 그리고 마지막에 finally 블록이 있는데, 이 부분은 예외 발생 여부와 상관없이 항상 실행 된다고 하며, 생략 할수도 있다.
이런 예외 클래스는 C#에서 미리 제공되는 경우도 있고, 사용자 정의로 만들수도 있다고 한다.
사용자 정의 예제:
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);
}
예제의 throw는 일부러 예외를 발생시킬때 쓴다고 한다.
}
값형과 참조형
{
값형이란 변수에 값을 직접 저장하는 것이고, int, float, double, bool 등의 기본 데이터 타입을 말한다.
그럼 참조형은 무엇이냐 :
참조형은 변수가 데이터에 대한 참조(메모리 주소)를 저장한다고 한다.
클래스, 배열, 인터페이스가 이에 해당한다.
다음에 설명할 부분은 이 값형과 참조형 사이의 변환에 해당한다.
}
박싱과 언박싱
{
박싱(Boxing)이란 값형을 참조형으로 변환하는 과정이다.
그럼 언박싱(Unboxing)은 반대로 박싱된 참조형을 다시 값형으로 변환하는 과정을 말한다.
박싱/언박싱 예제 :
using System;
class Program
{
static void Main()
{
// 값형
int x = 10;
int y = x;
y = 20;
Console.WriteLine("x: " + x); // 출력 결과: 10
Console.WriteLine("y: " + y); // 출력 결과: 20
// 참조형
int[] arr1 = new int[] { 1, 2, 3 };
int[] arr2 = arr1;
arr2[0] = 4;
Console.WriteLine("arr1[0]: " + arr1[0]); // 출력 결과: 4
Console.WriteLine("arr2[0]: " + arr2[0]); // 출력 결과: 4
// 박싱과 언박싱
int num1 = 10;
object obj = num1; // 박싱
int num2 = (int)obj; // 언박싱
Console.WriteLine("num1: " + num1); // 출력 결과: 10
Console.WriteLine("num2: " + num2); // 출력 결과: 10
}
}
예제에서 값형과 참조형의 특징 (값을 직접 저장 & 값의 주소만 저장) 을 보여주고 그걸 박싱과 언박싱으로 오브젝트로 만들어 사용하는걸 보여주고 있다.
}
}
3) 델리게이트, 람다 및 LINQ
{
// 추후에 기술 //
}
강의를 어느정도 듣다보니 어제 약간 맛봤던 택스트 RPG를 개선할수 있는 방법이 생각나서 진행 해보았는데..........
새로 알게되고 진행한부분이 너무 많다!!! 그래서 다음에 다시 천천히 정리해보며 적도록 하겠다..
'게임개발 > C#' 카테고리의 다른 글
24-09-25 Text RPG 구현하기 (3) | 2024.09.25 |
---|---|
24-09-24 C# 프로그래밍 기초 04 (1) | 2024.09.24 |
24-09-22 C# 프로그래밍 기초 02.7 (0) | 2024.09.22 |
24-09-21 C# 프로그래밍 기초 02.5 (0) | 2024.09.21 |
24-09-20 C# 프로그래밍 기초 02 (0) | 2024.09.20 |