과정명 : 내일배움캠프 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. 참고자료
없음
반응형
'다이어리 > 내일배움 개발일지' 카테고리의 다른 글
게임개발캠프 - 팀과제(B) 2일차 (0) | 2024.01.10 |
---|---|
게임개발캠프 - 팀과제(B) 1일차 (0) | 2024.01.10 |
게임개발캠프 - 개인과제(A) 5일차 (0) | 2024.01.05 |
게임개발캠프 - 개인과제(A) 4일차 (0) | 2024.01.04 |
게임개발캠프 - 개인과제(A) 3일차 (0) | 2024.01.03 |