C#

object와 Generic(일반화)

코다람쥐 2022. 1. 25. 15:41

1. object 사용

object로 선언하는것을 박싱(boxing)이라고 하고,

캐스팅을 통해 다시 꺼내오는 것을 언박싱(unboxing)이라고 한다.

 

박싱(boxing)

        static void Main(string[] args)
        {
            object obj = 5;
            object obj2 = "OBJ";
            object obj3 = 3.141;
            object obj4 = 3.141f;
        }

오브젝트 클래스는 모든 형태의 값이 대입이 된다.

 

언박싱(unboxing)

            int _obj = (int)obj;
            string _ojb2 = (string)obj2;
            double _obj3 = (double)obj3;
            float _obj4 = (float)obj4;

반대로 쓸때에는 캐스팅을 해줘야한다.

 

2. obejct VS var

차이점

var는 우항에 있는 값을보고 자동으로 캐스팅이 된다.

object는 자료형이 그 자체로 object형이다. 이것이 가능한 이유는 상속때문이다.

C#에서 object는 최상위 부모클래스이다. int형도 float형도 string형도 object형을 상속받은 자식클래스들이다.

하지만 속도적인 문제 때문에 object를 자주 사용하지는 않는다.

 

3. Generic 형식

        class Coda<T>
        {
            T[] arr = new T[10];
        }

C++에서의 템플릿과 유사하다.

T를 통해 int형이 들어오면 int[] arr= new int[10]처럼 작동하고

만약 내가 정의한 Monster클래스를 T에 넣으면

Monster[] arr = new Monster[10]처럼 작동한다.

 

눈치챘을 수도 있지만 리스트(List)도 Generic형식으로 정의되어 있는 클래스이다.

Generic형식 정의

            Coda<int> coda = new Coda<int>();

 

 

함수에 대해 사용

            static void Coda<T>(T n)
            {
                Console.WriteLine(n);
            }

 

 

두 개 이상의 인자

            static void Coda<T, U>(T n, U m)
            {
                Console.WriteLine(n);
                Console.WriteLine(m);
            }

참고로 딕셔너리(Dictionary)는 두 개의 인자가 사용되었다.

 

4. where

T에 들어오는 인자에 대한 조건을 설정한다

자주 사용되는 것으로 struct, class, new(), '클래스명' 등에 대한 조건이 있다.

 

struct

        class Coda<T> where T : struct

struct : T는 반드시 값형식이어야 된다는 조건

 

class

        class Coda<T> where T : class

class : T는 반드시 참조형식이어야 된다는 조건

 

new()

        class Coda<T> where T : new()

new() : 어떠한 인자도 받지않는 기본생성자가 있어야된다는 조건

 

클래스명

        class Coda<T> where T : Monster

클래스명 : 클래스나 그 클래스를 상속받은 클래스여야 된다는 조건

위는 Monster클래스나 Monster클래스를 상속받은 클래스만 인자로 들어 올 수 있다.