본문 바로가기
다이어리/내일배움 개발일지

게임개발캠프 - 개인과제(A) 6일차, 과제 제출

by E.Clone 2024. 1. 8.

과정명 : 내일배움캠프 Unity 게임개발 3기

전체진행도 : 11일차

부분진행도 : Chapter2.1 - 6일차

작성일자 : 2024.01.08(월)

개발일지 목록 : 클릭


1. 진행중인 과정에 대해

개인과제 제출을 마치고, 부족한 부분은 재제출을 하여 마무리를 하는 날이다. 본인은 C# 기초강좌 중 부족한 부분을 복습하며 하루를 보냈다. 하루종일 피곤하여 엎어져서 자거나 졸기도 했다.

 

2. 오늘 학습에 대해

제너릭, ref 및 out 키워드 그리고 인터페이스에 대해 조금 정리

제너릭

  • 클래스 또는 메서드를 일반화시켜 여러 자료형에 대응할 수 있게 한다.
  • C#에서는 <T> 키워드를 이용. (T 대신 다른 문자나 문자열도 맞춰줘도 상관 없어 보인다.)
  • 아래의 예시에서는 제너릭 클래스 Stack을 선언하여, int형을 관리하는 인스턴스를 만든다.
// 제너릭 클래스 선언 예시
class Stack<T, Ty> // 제너릭으로 사용할 문자열들을 명시
{
    private T[] elements; // 자료형이 쓰일 자리에 사용
    private int top;

    public Stack()              // Stack 생성자. Push와 Pop도 구현하여 스택기능을 구현
    {
        elements = new T[100];  // 역시 자료형 대신 제너릭 문자열을 대신 사용 가능. 100 크기의 배열을 준비
        top = 0;                // 현재 index
    }

    public void Push(T item)    // Push 기능 구현. T형의 item을 매개변수로 전달받음
    {
        elements[top++] = item; // 현재 index에 입력받은 item을 저장하고, top을 1 증가(후위연산)
    }

    public T Pop()              // Pop 기능 구현. T형의 리턴값
    {
        return elements[--top]; // top을 1 감소시킨 후 해당 위치의 원소를 반환한다.(원소 삭제의 구현은 없음)
    }

    public Ty TyTest(Ty tyInput) // 스택 기능은 아니지만 제너릭으로 여러개를 쓸 수 있는지 테스트
    {
        Ty tyElement = tyInput; // 입력받은 Ty형을 그대로 반환하도록 했다. 아래 예시에서는 string으로 객체를 생성
        return tyElement;
    }
}
static void Main(string[] args)
{
    Stack<int, string> intStack = new Stack<int, string>();     // 객체 생성 시, 제너릭 클래스에서 요구하는 수의 자료형을 입력
    intStack.Push(1);
    intStack.Push(2);
    intStack.Push(3);
    Console.WriteLine(intStack.Pop()); // 출력 결과: 3

    Console.WriteLine(intStack.TyTest("나는 intStack이오."));   // 출력 결과: "나는 intStack이오."

}

 

ref와 out 키워드

  • 매개변수 전달 시, 변수를 복사하는 것이 아닌 참조의 형태로 사용할 수 있게 한다
// 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); // x와 y를 참조형태로 전달한다
Console.WriteLine($"{x}, {y}"); // 출력 결과: 2, 1
  • out은 ref와 비슷하지만, out 키워드를 사용한 변수를 메서드 내에서 값을 할당해주지 않으면 오류가 발생한다.
  • ref와는 달리 위와 같은 제약사항을 필요로 하는 경우에 사용.
// out 키워드 사용 예시
void Divide(int a, int b, out int quotient, out int remainder)
{
    quotient = a / b; // quotient와 remainder에 값을 지정해주지 않으면 오류가 발생
    remainder = a % b;
}

int quotient, remainder;
Divide(7, 3, out quotient, out remainder);
Console.WriteLine($"{quotient}, {remainder}"); // 출력 결과: 2, 1
  • ref 와 out 매개변수는 값을 복사 없이 메서드 내에서 직접 접근을 할 수 있게 해주기 때문에 성능상의 이점이 있음.
  • out 매개변수는 메서드 내에서 반드시 값을 할당하기 때문에, 변수의 이전값이 유지되지 않음에 주의.

 

인터페이스

  • 코드의 재사용성, 다중 상속 제공, 유연한 설계 등을 위해 인터페이스를 사용
  • 인터페이스는 클래스가 구현해야 하는 멤버들을 정의함. 클래스의 일종이 아니며, 클래스에 대한 제약조건을 명시해주는 역할.
  • 즉, 클래스가 인터페이스를 구현할(상속받을) 경우, 모든 인터페이스 멤버를 구현해야 한다.
  • 구현 시, [interface 인터페이스명{구현할 내용}] 의 형태를 가지며, 인터페이스명의 이름은 보통 대문자 I로 시작하는 것을 추천함.
 // 인터페이스 및 멤버를 정의하는 예시
interface IMyInterface
{
    void Method1();
    int Method2(string str);
}

// 인터페이스 구현
class MyClass : IMyInterface
{
    public void Method1()
    {
        // 구현
    }

    public int Method2(string str)
    {
        // 구현
        return 0;
    }
}



3. 참고자료

없음

반응형