프로젝트를 진행하는데 있어 필요한 형식(int, float형)마다 class를 만들어서 사용해야 할 경우가 있다.
하지만 필요에 따라 각 형식의 class를 만드는 것은 코드가 길어지고 이후 변경하기 번거로운 단점이 있다.
이 상황을 대비헤 다른 방법이 무엇이 있는지 알아본다.
1. 모든 타입을 사용할 수 있는 object 타입을 사용하는 것이다.
=> object obj = 3;
object obj2 = "Hello";
int num = (int)obj; // 결과 '3'
string str = (string)obj2; //결과 'Hello'
object 타입은 어느 타입이든 사용할 수 있다는 장점이 있다.
* 이와 비슷한 var를 사용할 수도 있다, 단 var의 경우 object와는 전혀 다른 성질은 지닌다.
=> object obj = 3;
object obj2 = "Hello";와
var obj = 3;
var obj2 = "Hello";의 컴파일 후 출력된 값은 동일하지만 var의 경우 컴파일 시 오른쪽에 지정된 값을 보고
컴파일러가 해당 타입을 유추하여 값을 출력하고,
object의 경우에는 처음부터 object 타입이라고 명시되어 저장 및 출력이 된다.
object 타입이 이와 같이 다른 타입(int, float형)을 모두 선언 받을 수 있는 이유는 '상속'때문이다.
최상위 부모 클래스에 있는 것을 하위(자식) 클래스가 '상속' 받아 사용할 수 있는데,
int형과 float형과 같은 경우 object 타입을 상속받기 떄문에 object 타입이 포함하고 있는 타입을
소화할 수 있는 것이다.
단 object 타입의 경우 처리 속도가 상대적으로 느리다.
2. 일반화 방식을 사용한다.(Generic)
=> class 사용 방법
class MyArr<T> // class 이름 지정 후 <>를 사용하여 추가로 이름을 선언해준다.(템플릿, 타입이라는 뜻으로
T라는 이름을 자주 사용한다.)
class MyArr<T>
{
T[] arr = new T[5]; //'T'타입의 일반화를 사용하고 'T'형태의 배열을 생성한다.
}
static void main(string args)
{
MyArr<int> myint = new MyArr<int>();
MyArr<float> myfloat = new MyArr<float>(); // MyArr의 일반화로 생성한 배열을 사용하고자 하는 타입에 맞춰
뽑아서 쓸 수 있다.
}
=> 함수 사용 방법
static void Test<T>(T input) // 'T'타입의 일반화를 사용함과 동시에 'T'형태로 인자를 받음으로 모든 타입의 인자를
받고 값을 출력할 수 있다.
static void main(string args)
{
Test<int>(1);
Test<float>(2.0f); // 사용하고자 하는 타입을 지정한 후 값을 선언해주어 사용할 수 있다.
}
* Generic(일반화)에 조건 추가하기
class MyArr<T> where T : class // where T : 조건을 입력한다.
=> 어느 'T'값이던 상관 없지만 조건에 맞는 'T'의 값만을 받겠다는 선언이다.
위의 조건의 경우 참조 형식의 T값만을 받겠다는 의미이다.
'C#' 카테고리의 다른 글
| 객체지향 (0) | 2021.05.14 |
|---|---|
| 추상클래스, 인터페이스 (0) | 2021.05.14 |
| Dictionary (0) | 2021.05.13 |
| 다차원 배열 (0) | 2021.05.13 |
| 배열 (0) | 2021.05.12 |