TIL(Today I Learned)

C# 기초 문법 나머지, 텍스트 RPG 게임 만들기 - TIL#8 (1)

Najdorf 2024. 1. 3. 21:45
728x90

어제는 객체 지향 프로그래밍(OOC)과

가장 중요한 개념인 객체와 클래스를 중점적으로 다뤄봤었다.

 

 

오늘은 이어서

인터페이스(Interface)에 대해서 배웠는데,

인터페이스는 USB 포트와 같이

클래스를 정의할 때 일종의 규격을 만드는 기능이다.

 

클래스 상속과 사용 방법은 거의 동일하다.

이러면 클래스와 다를 게 뭔가 의문점이 든다.

 

인터페이스를 쓰는 이유를 크게 3가지로 볼 수 있다.

 

  • 다중 상속 가능 (클래스는 안 됨)
  • 클래스 정의 시 일정한 규격의 변수 지정을 강제할 수 있음
  • 객체정보 간소화

클래스는 다이아몬드 문제를 피하기 위해 다중 상속이 안되지만,

인터페이스는 일종의 다중 상속과도 같은 기능을 구현해 볼 수 있다.

 

다이아몬드 문제 관련글:

https://velog.io/@soongle/c-%EB%8B%A4%EC%9D%B4%EC%95%84%EB%AA%AC%EB%93%9C-%EC%83%81%EC%86%8Ddiamond-inheritance

 

[c++] 다이아몬드 상속(diamond inheritance)

A클래스를 상속받은 B클래스와 C클래스를 다중 상속받을 경우 발생하는 문제이다.

velog.io

 


다음은 열거형(Enums)와 관련된 이야기이다.

 

열거형은 이름에서도 알 수 있듯이 단순히 정보들을 하나의 틀 안에

묶어서 함께 정의하는 형태이다.

 

그러면 왜 사용을 하는가?

 

열거형 자료 안에서 정의된 순서에 따라 숫자를 부여받는데,

(enums Month = { Jan = 1, Feb, ..., Dec };

라고 정의했다면 (int)Jan 은 숫자 1이 반환되는 방식이다.)

 

이 때문에 하나의 변수의 값에 따라 분기를 하는

조건식인 Switch-case 문과의 호환성이 매우 좋으며,

 

무엇보다도 비슷한 자료들을 한 군데에 모아뒀다는 점 때문에

코드의 가독성이 상당히 좋아진다는 장점이 있다.

 

열거형 자료는 형변환을 명시적으로 할 수 있다.

int형 자료는 해당 번호를 부여받은 자료로 변환되며, ((Month)1 은 Jan으로 변환되는 식)

enums형 자료는 부여받은 번호의 값으로 변환된다. ((int)Dec 은 1로 변한되는 식)

 

이러한 열거형 자료의 특징 때문에

자주 사용되는 곳은

게임 상태, 아이템 등급, 방향 입력 등의 기술 구현에 주로 사용된다.

 


C#의 예외 처리

try-catch 문이 기본으로 사용된다. (Python은 try-except)

 

예외 처리문은 여타 다른 프로그래밍 언어에서도 주로 지원하기 때문에,

키워드만 간단하게 짚고 넘어가려고 한다.

 

finally는 예외 발생 여부와 관계없이 항상 실행되는 코드 블록,

throw는 일부러 예외를 발생시키는 용도로 사용되는 키워드이다.

 


C#은 객체 지향 프로그래밍을 하기 때문에,

개념적으로 자료의 값형참조형의 차이를 아는 것이 대단히 중요하다.

(클래스와 배열을 비롯한 여러 변수가 참조형이기 때문)

 

값형참조형의 차이는

구조체(struct)클래스(class)의 차이로 생각하면 거의 맞다.

 

값형 자료는 직접 변수에 값을 저장하고, 다른 변수에 할당할 때는 복사해서 할당한다는 특징이 있다.

모든 기본적 자료형(int, bool, float, double, ...)이 여기에 해당된다.

 

참조형 자료는 변수에 데이터에 대한 참조(메모리 주소)를 저장하는 방식이다.

그래서 참조하는 원본 데이터의 값이 바뀌면 참조하던 모든 변수의 값이 바뀐다.

 

메모리 주소라는 용어를 보니...

C를 처음 배울 때 나를 괴롭혔던 포인터라는 개념이 생각나기도 한다.

 

내가 제대로 이해한 건지는 모르겠지만, 비유를 하자면?

하나의 칠판을 비추고 있는 여러 대의 카메라를 생각하면 대강 맞지 않을까 싶다.

칠판에 적힌 정보를 바꾸면, 카메라가 띄우는 영상 속 정보도 바뀔 거라고 생각해서...

 

아무튼, 참조형 자료는 클래스, 배열, 인터페이스 등이 있다.

 

 

값형과 참조형의 차이를 앎에 있어서 중요한 개념이 하나 더 있는데,

바로 박싱(Boxing)언박싱(Unboxing)이다.

 

박싱은 값형 변수를 참조형 변수로 변환하는 과정을 의미하는데,

int num1 = 10;
object obj = num1;

위와 같이 object 라는 키워드를 써서 박싱을 할 수 있다.

여기서 object는 모든 클래스의 직간접적인 상위 클래스이다.

한마디로, 클래스가 사는 세상이라고 볼 수 있다.

 

int num2 = (int)obj;

언박싱은 위와 같이 명시적 형변환을 통해 할 수 있다.

 

나도 제대로 이들을 이해한 것은 아니나,

나중에 최적화 작업을 할 때는 반드시 필요한 개념으로 생각된다.


이번엔 델리게이트(delegate)에 대해서 알아보자.

 

델리게이트는 메서드를 참조하는 타입이다.

 

다른 프로그래밍 언어에서는 함수 포인터라는 용어를 사용하기도 한다는데,

C#에서 부르는 메서드가 다른 곳에서는 함수이고,

그 함수를 참조하는 타입이니, 어찌보면 당연한 네이밍이라고 생각한다.

 

델리게이트 하나에 여러 개의 메서드를 할당할 수도 있어서,

델리게이트를 호출할 때 한 번에 여러 메서드를 동작할 수도 있다.

 

이것만으로도 델리게이트의 사용 이유가 나오지 않나 싶다.

 

용어가 어려워서 그렇지, 또 내가 비유를 해 보자면(?)

 

델리게이트는 밀키트라고 생각한다.

 

여러 가지 재료(메서드)가 마트에 있는데,

이걸 사서 어떤 요리(목표하는 기능)를 만드는 것은 개인 자유이나...

 

미리 묶여있는 밀키트(델리게이트)를 사용하면

요리를 단 한 번의 구매로 간편하게 할 수 있다!

 

 

델리게이트는 다음과 같이 사용할 수 있다.

delegate int Calculate(int x, int y);

static int Add(int x, int y)
{
    return x + y;
}

class Program
{
    static void Main()
    {
        // 메서드 등록
        Calculate calc = Add;

        // 델리게이트 사용
        int result = calc(3, 5);
        Console.WriteLine("결과: " + result);
    }
}

델리게이트 하면 빠질 수 없는

람다(Lambda) 이다.

 

람다는 이름이 없는 메서드를 만들 수 있는 기능이다.

 

본래 메서드를 만들려면, 반환 타입부터해서 이름, 파라미터 등을 정의를 하는데...

람다를 사용하면 그러지 않아도 된다!

 

하지만 기능이 기능인만큼 복잡한 메서드 구현보다는

정말 기능이 단순한 한 줄 짜리 메서드를 구현하는데 많이 쓰인다.

(e.g. Sum(x,y)라는 메서드는 x+y라는 반환값을 반환)

 

그래서 보통 델리게이트와 함께 자주 쓰이며,

구현 방법은 다음과 같다.

// 위에서 Calculate란 델리게이트를 정의했음
Calculate calc = (x, y) => 
{	
		return x + y;
};

Calculate calc = (x, y) => x + y;

 

위에서 (x, y) => x + y; 로 이루어진 부분이

람다를 사용한 메서드라고 할 수 있다.

 


델리게이트와 함께 또 알아야 할 매우 중요한 키워드가 남아있다.

바로, FuncAction 키워드이다.

 

Func, Action은 델리게이트를 대체하는 미리 정의된 제너릭 형태인데,

사실상 델리게이트보다 많이 쓰이는 중요한 키워드이다.

 

Func는 값을 반환하는 형태의 키워드이고,

Action은 값을 반환하지 않는다.

 

사용 방법은, 아래와 같이 사용한다.

Func<int, int, int> addFunc = Add;

 

 

위 코드는 addFunc 델리게이트는 2개의 int 자료형의 값을 입력 받아 1개의 int 자료형을 반환한다는 의미이다.

 

Action<int, int, int>라고 사용한다면,

위와는 다르게 3개의 int 자료형 값을 입력 받아 아무런 값도 반환하지 않는다는 것을 의미한다.

 

꼭 알아두도록 하자.


 

다음 TIL로 이어짐.

https://sicilian-najdorf.tistory.com/10

 

C# 기초 문법 나머지, 텍스트 RPG 게임 만들기 (2) - TIL#8

이전 글에 이어서 TIL을 작성한다. 이번 글에선 LINQ, 고급 자료형, 본격적인 텍스트 RPG 게임 만들기에 대해 다룰 것이다. LINQ란? .NET 프레임워크에서 제공되는 쿼리 언어 확장이다. 데이터베이스에

sicilian-najdorf.tistory.com

 

728x90