'게임개발공부/C#공부'에 해당되는 글 25건

  1. 2013.12.29 C#에서 const
  2. 2013.12.27 c#에서의 다형성
  3. 2013.12.27 제네릭(generic), 함수, 변수 개념.
  4. 2013.12.27 속성(property)
  5. 2013.12.20 override 문법의 직관화
  6. 2013.12.19 참조형 함수인자. 확장 메서드.
  7. 2013.12.19 클래스의 새로운 개념 <partial >
  8. 2013.12.19 foreach
  9. 2013.12.19 배열과 배열메소드
  10. 2013.12.18 C#공부에 대해서...

const 키워드를 사용하여 상수 필드 또는 상수 로컬을 선언합니다. 이 키워드는 필드 또는 지역 변수의 값을 상수로, 즉 수정할 수 없도록 지정합니다. 예를 들면 다음과 같습니다.

const int x = 0;
public const double gravitationalConstant = 6.673e-11;
private const string productName = "Visual C#";

상수 선언의 형식은 선언이 소개하는 멤버의 형식을 지정합니다. 상수 로컬 또는 상수 필드의 이니셜라이저는 대상 형식으로 암시적으로 변환할 수 있는 상수 식이어야 합니다.

상수 식은 컴파일 타임에 완전하게 계산될 수 있는 식입니다. 따라서 참조 형식의 상수에 대해 가능한 유일한 값은 string과 null입니다.

상수 선언에서는 다음과 같이 여러 개의 상수를 선언할 수 있습니다.

public const double x = 1.0, y = 2.0, z = 3.0;

static 한정자는 상수 선언에 사용할 수 없습니다.

상수 식에는 다음과 같이 상수를 사용할 수 있습니다.

public const int c1 = 5;
public const int c2 = c1 + 100;
참고참고

readonly 키워드는 const 키워드와 다릅니다. const 필드는 필드를 선언할 때만 초기화될 수 있습니다. readonly 필드는 필드를 선언할 때 또는 생성자에서 초기화될 수 있습니다. 따라서 readonly 필드의 값은 사용된 생성자에 따라 다릅니다. 또한 const 필드는 컴파일 타임 상수인 반면 readonly 필드는 런타임 상수로도 사용할 수 있습니다(예: public static readonly uint l1 = (uint)DateTime.Now.Ticks;).

public class ConstTest 
{
    class SampleClass 
    {
        public int x;
        public int y;
        public const int c1 = 5;
        public const int c2 = c1 + 5;

        public SampleClass(int p1, int p2) 
        {
            x = p1; 
            y = p2;
        }
    }

    static void Main() 
    {
        SampleClass mC = new SampleClass(11, 22);   
        Console.WriteLine("x = {0}, y = {1}", mC.x, mC.y);
        Console.WriteLine("c1 = {0}, c2 = {1}", 
                          SampleClass.c1, SampleClass.c2 );
    }
}
/* Output
    x = 11, y = 22
    c1 = 5, c2 = 10
 */


다음 예제에서는 상수를 지역 변수로 사용하는 방법을 보여 줍니다.

public class SealedTest
{
    static void Main()
    {
        const int c = 707;
        Console.WriteLine("My local constant = {0}", c);
    }
}
// Output: My local constant = 707


'게임개발공부 > C#공부' 카테고리의 다른 글

추상 클래스 봉인 클래스  (0) 2013.12.29
인터페이스  (0) 2013.12.29
c#에서의 다형성  (0) 2013.12.27
제네릭(generic), 함수, 변수 개념.  (0) 2013.12.27
속성(property)  (0) 2013.12.27
Posted by JJOREG

C#에서의 다형성은 -----------------------------------------------------------------------------------------------------------------------------


C++에서의 다형성과 비교해서 확인해보자.


C++에서의 다형성 이라고 하면.


1. 클래스로서의 다형성 (부모클래스의 하위클래스들은 부모클래스의 이름으로 사용될수 있고 그에 대한 인자나 파라매터로 사용이 가능하다.)

2. 함수로서의 다형성(부모클래스와 같은 이름의 함수를 사용하거나 자식클래스는 부모 클래스의 함수를 같은 이름으로 오버라이드 할수 있다.)


/// 다형성을 사용한 일반적인 C++ 코드

class A

{

public: 

virtual void virfun(void) {cout << "im A fun!" << endl;}

};


class B

: public A

{

public: 

virtual void virfun(void) {cout << "im B fun!" << endl;}

};


class C

: public B

{

public: 

virtual void virfun(void) {cout << "im C fun!" << endl;}

};


int _tmain(int argc, _TCHAR* argv[])

{


//A aaa;

//B bbb;

//C ccc;


//ccc = bbb;

//aaa = bbb;


A* aaa = new A;

B* bbb = new B;

C* ccc = new C;

A* aaaB;

A* aaaC;


aaaB = bbb;

aaaC = ccc;


aaa->virfun();   -> A클래스의 virfun()을  호출한다.

aaaB->virfun(); -> B클래스의 virfun()을 호출한다.

aaaC->virfun(); -> C클래스의 virfun()을 호출한다.


delete aaa;

aaa = NULL;

delete bbb;

bbb = NULL;

delete ccc;

ccc = NULL;


return 0;

}


/// 비슷하게 짜본 C# 코드
namespace Extension
{
    class A
    {
        public virtual void Fuc() { Console.WriteLine("Afun"); }
    }

    class B : A
    {
        public override void Fuc() { Console.WriteLine("Bfun"); }
    }

    class C : B
    {
        public override void Fuc() { Console.WriteLine("Cfun"); }
    }


    namespace ConsoleApplication1
    {
        class Program
        {
            unsafe int* p1 = null;

            static void Main(string[] args)
            {
                A aaa = new A();
                B bbb = new B();
                C ccc = new C();

                A aaaB;
                A aaaC;
                aaaB = bbb;
                aaaC = ccc;

                aaa.Fuc(); -> A클래스의 fun()을  호출한다.
                aaaB.Fuc(); -> B클래스의 fun()을  호출한다.
                aaaC.Fuc(); -> C클래스의 fun()을  호출한다.
            }
        }
    }
}


MSDN을 확인해보자. ----------------------------------------------------------------------------------------------------------------------------


C#은 컴파일 타임에 정적으로 형식이 지정되므로 변수를 선언하고 나면 해당 형식을 변수의 형식으로 변환하지 않는 한 변수를 다시 선언하거나 다른 형식의 값을 저장하는 데 사용할 수 없습니다. 예를 들어 정수를 임의의 문자열로 변환할 수 없습니다. 따라서 다음 코드에서 볼 수 있는 것처럼 i를 정수로 선언한 후에는 해당 변수에 문자열 "Hello"를 할당할 수 없습니다.

int i;
i = "Hello"; // Error: "Cannot implicitly convert type 'string' to 'int'"

하지만 값을 다른 형식의 변수나 메서드 매개 변수에 복사해야 하는 경우가 있습니다. 예를 들어 double 형식의 매개 변수를 사용하는 메서드에 정수 변수를 전달해야 하거나 클래스 변수를 인터페이스 형식의 변수에 할당해야 할 경우가 있습니다. 이런 종류의 작업을형식 변환이라고 합니다. C#에서는 다음과 같은 변환을 수행할 수 있습니다.

  • 암시적 변환: 변환의 형식 안전성이 유지되며 데이터가 손실되지 않으므로 특수한 구문이 필요 없습니다. 작은 정수 형식에서 큰 정수 형식으로의 변환, 파생 클래스에서 기본 클래스로의 변환 등이 여기에 포함됩니다.

  • 명시적 변환(캐스트): 명시적 변환에는 캐스트 연산자가 필요합니다. 캐스팅은 변환 시 정보가 손실될 수 있거나 다른 이유로 변환이 성공하지 못할 수 있을 때 필요합니다. 일반적인 예제에는 숫자를 정밀도가 낮거나 범위가 작은 형식으로 변환, 기본 클래스 인스턴스를 파생 클래스로 변환하는 것을 포함합니다.

  • 사용자 정의 변환: 사용자 정의 변환은 기본 클래스-파생 클래스 관계가 없는 사용자 지정 형식 간의 명시적 변환과 암시적 변환이 가능하도록 사용자가 정의할 수 있는 특수한 메서드를 통해 수행됩니다. 자세한 내용은 변환 연산자(C# 프로그래밍 가이드)를 참조하십시오.

  • 도우미 클래스를 사용한 변환: 정수와 System.DateTime 개체 또는 16진수 문자열과 바이트 배열과 같이 서로 호환되지 않는 형식 간에 변환하려면 Int32.Parse와 같은 기본 제공 숫자 형식의 System.BitConverter 클래스, System.Convert 클래스 및 Parse 메서드를 사용합니다. 자세한 내용은 방법: 바이트 배열을 정수로 변환(C# 프로그래밍 가이드)방법: 문자열을 숫자로 변환(C# 프로그래밍 가이드) 및 방법: 16진수 문자열과 숫자 형식 간 변환(C# 프로그래밍 가이드)을 참조하십시오.

기본 제공 숫자 형식의 경우 저장되는 값을 자르거나 반올림하지 않고 변수에 저장할 수 있으면 암시적 변환을 수행할 수 있습니다. 예를 들어, long(8바이트 정수) 형식의 변수에는 int(32비트 컴퓨터에서 4바이트)에 저장할 수 있는 모든 값을 저장할 수 있습니다. 다음 예제의 경우 컴파일러에서는 우변에 있는 값을 bigNum에 할당하기 전에 암시적으로 long 형식으로 변환합니다.

// Implicit conversion. num long can
// hold any value an int can hold, and more!
int num = 2147483647;
long bigNum = num;


암시적 숫자 변환의 전체 목록은 암시적 숫자 변환 표(C# 참조)를 참조하십시오.

참조 형식의 경우 특정 클래스에서 해당 클래스의 직접 또는 간접 기본 클래스나 인터페이스로의 암시적 변환이 항상 존재합니다. 이 경우 파생 클래스는 항상 기본 클래스의 모든 멤버를 포함하기 때문에 특별한 구문이 필요 없습니다.

Derived d = new Derived();
Base b = d; // Always OK.

하지만 정보가 손실될 위험이 없이 변환을 수행할 수 없는 경우에는 컴파일러에서 캐스트라는 명시적 변환을 수행하도록 합니다. 캐스트는 컴파일러에게 변환을 수행하는 의도와 데이터 손실이 발생할 수 있다는 것을 인식하고 있다는 명시적으로 알리는 방법입니다.캐스팅을 수행하려면 변환할 값이나 변수 앞에 캐스팅하려는 형식을 괄호로 둘러쌉니다. 다음 프로그램에서는 double을 int로 캐스팅합니다. 캐스팅하지 않으면 프로그램이 컴파일되지 않습니다.

class Test
{
    static void Main()
    {
        double x = 1234.7;
        int a;
        // Cast double to int.
        a = (int)x;
        System.Console.WriteLine(a);
    }
}
// Output: 1234


허용되는 명시적 숫자 변환의 목록은 명시적 숫자 변환 표(C# 참조)를 참조하십시오.

참조 형식의 경우 기본 형식을 파생 형식으로 변환해야 한다면 명시적 캐스트가 필요합니다.

// Create a new derived type.
Giraffe g = new Giraffe();

// Implicit conversion to base type is safe.
Animal a = g;

// Explicit conversion is required to cast back
// to derived type. Note: This will compile but will
// throw an exception at run time if the right-side
// object is not in fact a Giraffe.
Giraffe g2 = (Giraffe) a;

참조 형식 사이에 캐스트 연산을 수행하면 내부 개체의 런타임 형식은 변경되지 않고 해당 개체에 대한 참조로 사용되는 값의 형식만 변경됩니다. 자세한 내용은 다형성(C# 프로그래밍 가이드)를 참조하십시오.

일부 참조 형식 변환에서는 컴파일러가 캐스트의 유효성 여부를 확인하지 못합니다. 따라서 올바르게 컴파일된 캐스트 작업이 런타임에 실패할 수 있습니다. 다음 예제에서 볼 수 있는 것처럼, 런타임에 실패하는 형식 캐스트는 InvalidCastException을 throw하게 됩니다.

class Animal
{
    public void Eat() { Console.WriteLine("Eating."); }
    public override string ToString()
    {
        return "I am an animal.";
    }
}
class Reptile : Animal { }
class Mammal : Animal { }

class UnSafeCast
{
    static void Main()
    {            
        Test(new Mammal());

        // Keep the console window open in debug mode.
        System.Console.WriteLine("Press any key to exit.");
        System.Console.ReadKey();
    }

    static void Test(Animal a)
    {
        // Cause InvalidCastException at run time 
        // because Mammal is not convertible to Reptile.
        Reptile r = (Reptile)a;
    }

}


'게임개발공부 > C#공부' 카테고리의 다른 글

인터페이스  (0) 2013.12.29
C#에서 const  (0) 2013.12.29
제네릭(generic), 함수, 변수 개념.  (0) 2013.12.27
속성(property)  (0) 2013.12.27
override 문법의 직관화  (0) 2013.12.20
Posted by JJOREG

제네릭(generic)이란? -------------------------------------------------------------------------------------------------


제네릭이란?


    // Declare the generic class.

    public class GenericList<T> -> 템플릿과 비슷한 문법이지만 훨씬 간단하게 사용이 가능하다.

    {

        public void Add(T input) 

        {

            Console.WriteLine(input); 

            Console.WriteLine(input.GetType()); 

        }

    }

    class TestGenericList

    {

        private class ExampleClass { }

        static void Main()

        {

            // Declare a list of type int.

            GenericList<int> list1 = new GenericList<int>();


            list1.Add(1);  -> 지정한 형으로 넣을수 있다.


            // Declare a list of type string.

            GenericList<string> list2 = new GenericList<string>();


            list2.Add("zz"); -> 지정한 형으로 넣을수 있다.


            // Declare a list of type ExampleClass.

            GenericList<ExampleClass> list3 = new GenericList<ExampleClass>();


            list3.Add(new ExampleClass());  -> 지정한 형으로 넣을수 있다.

        }

    }


함수와 변수의 종류? -------------------------------------------------------------------------------------------------

C# 에서 함수와 변수에는 2가지 종류가 있다. 인스턴스(객체) 함수와 클래스 함수의 두가지로 나뉜다.
즉 전역이라는 개념이 없다!
전역 함수를 쓰고 싶다면 클래스에 static 키워를 넣어서 사용하면 된다.
사용법은 c++과 비슷하게 사용하면 된다.

namespace GlobalMember

{

    public class Global

    {

        public static string global = "";

    }

     public class Usecase

    {

        public static void Main()

        {

            Global.global = "Hello";

 

            Console.WriteLine (Global.global.ToString());        -> 출력 결과 Hello.

        }

    }

}


이런 식이다. 마찬가지로 클래스 이므로 속성등을 지정해 주는것도 가능하다. 유용하게 사용해보자.


'게임개발공부 > C#공부' 카테고리의 다른 글

C#에서 const  (0) 2013.12.29
c#에서의 다형성  (0) 2013.12.27
속성(property)  (0) 2013.12.27
override 문법의 직관화  (0) 2013.12.20
참조형 함수인자. 확장 메서드.  (0) 2013.12.19
Posted by JJOREG

속성(property)------------------------------------------------------------------------------------------------------------------------


객체지향프로그래밍에서 일반적으로 맴버에 접근하기 위한 방법으로 Get함수와 Set함수를 만드는 것이 일반적이다.

하지만 C#에서는 이를 좀더 간편하게 하기 위해서 프로퍼티라고 부르는 문법을 지원한다.


namespace ConsoleApplication1

{

    class home

    {

        int age; -> C#에서도 C++과 같이 다른 지정이 없으면 private로 선언된다.


        public int Age -> age와는 다른 Age를 property로 선언했다.

        {

            get

            {

                return age; -> 값을 가져오는 속성을 저장한다.

            }

            set

            {

                age = value; -> 값을 대입하는 속성을 저장한다.

            }

        }

    }


    class Program

    {

        static void Main()

        {

            home home1 = new home();

            home1.Age = 5; -> 자동으로 Age중 set을 호출한다.

            Console.WriteLine(home1.Age); -> 자동으로 Age중 get을 호출한다.

            int a;

            a = home1.Age; -> 자동으로 Age중 get을 호출한다.

            Console.WriteLine(a);

        }

    }

}


참 편하다. 일일이 함수를 호출할 필요가 없이 자연적으로 연산자 오버로딩을 한것처럼 사용할 수가 있다.


하지만 속성은 더욱더 간략화된 방식으로 이용이 가능하다 다음을 보자.


namespace ConsoleApplication1

{

    class Contact

    {

        // Read-only properties.

        public string Name { get; private set; } -> get은 선언을 하나로 묶는다. set은 private성향으로 아무나 접근하지 못하도록 막는다.

        public string Address { get; private set; } -> get은 선언을 하나로 묶는다. set은 private성향으로 아무나 접근하지 못하도록 막는다.


        // Public constructor.

        public Contact(string contactName, string contactAddress) -> 생성자 그런데 public

        {

            Name = contactName;

            Address = contactAddress;

        }

    }


    // This class is immutable. After an object is created,

    // it cannot be modified from outside the class. It uses a

    // static method and private constructor to initialize its properties.   

    public class Contact2

    {

        // Read-only properties.

        public string Name { get; private set; } -> get은 선언을 하나로 묶는다. set은 private성향으로 아무나 접근하지 못하도록 막는다.

        public string Address { get; private set; } -> get은 선언을 하나로 묶는다. set은 private성향으로 아무나 접근하지 못하도록 막는다.


        // Private constructor.

        private Contact2(string contactName, string contactAddress) -> 생성자 그런데 private

        {

            Name = contactName;

            Address = contactAddress;

        }


        // Public factory method.

        public static Contact2 CreateContact(string name, string address)

        {

            return new Contact2(name, address); -> 내부적으로 생성자를 막고 마치 싱글톤처럼 새로운 녀석을 리턴해 주고 있다.

        }

    }


    public class Program

    {

        static void Main()

        {

            // Some simple data sources.

            string[] names = {"Terry Adams","Fadi Fakhouri", "Hanying Feng", 

                              "Cesar Garcia", "Debra Garcia"};

            string[] addresses = {"123 Main St.", "345 Cypress Ave.", "678 1st Ave",

                                  "12 108th St.", "89 E. 42nd St."};


            // Simple query to demonstrate object creation in select clause.

            // Create Contact objects by using a constructor.

            var query1 = from i in Enumerable.Range(0, 5)

                         select new Contact(names[i], addresses[i]); -> 새로운 클래스를 집어 넣는다.


            // List elements cannot be modified by client code.

            var list = query1.ToList();

            foreach (var contact in list)

            {

                Console.WriteLine("{0}, {1}", contact.Name, contact.Address);

            }


            // Create Contact2 objects by using a static factory method.

            var query2 = from i in Enumerable.Range(0, 5)

                         select Contact2.CreateContact(names[4 - i], addresses[4 - i]);


            Console.WriteLine();


            // Console output is identical to query1.

            var list2 = query2.ToList();


            foreach (var contact in list2)

            {

                Console.WriteLine("{0}, {1}", contact.Name, contact.Address); 

-> 값을 가져오는 것은 아무런 이상이 없다. 즉 get은 이상없이 작동한다. 애초에 public였으니 하지만

                contact.Name = 0; 이런 구문을 쓰면 당근 막힌다.


            }


            // List elements cannot be modified by client code.

            // CS0272:

            // list2[0].Name = "Eugene Zabokritski"; 


            // Keep the console open in debug mode.

            Console.WriteLine();

            Console.WriteLine("Press any key to exit.");

            Console.ReadKey();

        }

    }


}

Posted by JJOREG

override --------------------------------------------------------------------------------------------------------------------------------------


override는 메소드를 하위클래스에서 중복선언할때 사용할수 있는 참조 문법이다.

c++에서 사용했던 오버라이드를 직관성있게 문법 그 자체로 표현하고 있다.


namespace ConsoleApplication1

{

    class p1

    {

        public virtual void go() -> 부모클래스에서 정의한 go() 메소드

        {

            Console.WriteLine("z");

        }

    }


    class c1 : p1

    {

        public override void go() -> 

        {

            Console.WriteLine("zz"); -> 부모클래스에서 정의한 go() 메소드

        }

    }

    class Program

    {

        static void Main()

        {

            p1 c11 = new c1();

            p1 p11 = new p1();

            c11.go(); -> 다형성을 이용하여 p1선언을 c1클래스로 객체화 시켰다. 그러므로 c1의 go()함수가 호출된다.

            p11.go(); -> p1을 그냥 p1클래스로 객체화 시켰다. 그러므로 p1의 go()함수가 호출된다.

        }

    }

}


c#에서는 기존의 특별한 구문없이 이루어지던 클래스와의 관계를 문법적으로 묶어서 오히려 더 직관적이다.

이런점은 고위언어로서의 장점으로 보인다.

'게임개발공부 > C#공부' 카테고리의 다른 글

제네릭(generic), 함수, 변수 개념.  (0) 2013.12.27
속성(property)  (0) 2013.12.27
참조형 함수인자. 확장 메서드.  (0) 2013.12.19
클래스의 새로운 개념 <partial >  (0) 2013.12.19
foreach  (0) 2013.12.19
Posted by JJOREG

키워드 ref -------------------------------------------------------------------------------------------------------------------------------------


C++에서는 함수인자로 들어간 파라미터들의 원본의 값까지 변경하고 싶을때 포인터나 레퍼런스를 사용한다.

하지만 C#에서는 ref라는 키워드를 통해서 함수의 인자를 참조하겠다는 것을 명시해줘야 한다.


class RefExample

{

    static void Method(ref int i)

    {

        i = 10;

    }

    static void Main()

    {

        int val = 0; -> ref는 항상 먼저 초기화 해줘야 한다.

        Method(ref val); -> 할때도 붙여줘야 한다. 이제 int val은 값이 변경되어서 다음 구문으로 이동한다.

        // val is now 10 -> val의 값은 이제 44가 되어있다. 일반적으로 val의 값은 변경되지 않는다. 

하지만 참조가 출동한다면? 인자로 집어넣은 값을 변경시킬 수 있다.

    }

}


사용법은 함수 인자 앞에 ref만 붙여주면 끝! 참 쉽다!


키워드 params---------------------------------------------------------------------------------------------------------------------------------


namespace ConsoleApplication1
{
    class Program
    {
        public static void UseParams(params int[] list) -> 같은 배열의 인자를 여러 리스트 형으로 넣는다.
        {
            for (int i = 0; i < list.Length; i++)
            {
                Console.Write(list[i] + " ");
            }
            Console.WriteLine();
        }

        public static void UseParams2(params object[] list) -> 오브젝트 형이라 딱히 인자값의 제한이 없다.
        {
            for (int i = 0; i < list.Length; i++)
            {
                Console.Write(list[i] + " ");
            }
            Console.WriteLine();
        }

        static void Main(string[] args)
        {

            int[] array = new int[8];

            for (int i = 0; i < 8; ++i)
                array[i] = i;

            UseParams(1, 2, 3); -> 상수도 넣고 인자수도 제한이 없다. 

            UseParams(array[0], array[1], array[2], array[3], array[4], array[5], array[6], array[7]); -> 이렇게 넣을수도 있고,

            Array.Clear(array, 0, array.Length); -> 배열 클래스를 통해서 다음과 같이 초기화가 가능하다.

            UseParams(array); -> 배열을 넣어준다.

            UseParams2(1, 'a', "test"); -> 오브젝트이기 때문에 다양한 형을 넣을 수 있다. 
        }
    }
}

키워드 out---------------------------------------------------------------------------------------------------------------------------------


out 키워드는 인수를 참조로 전달하는 데 사용됩니다. 이는 ref 키워드와 비슷하지만 ref의 경우 변수를 전달하기 전에 초기화해야 한다는 점에서 차이가 있습니다. out 매개 변수를 사용하려면 메서드 정의와 호출하는 메서드에서 모두 out 키워드를 명시적으로 사용해야 합니다. 예를 들면 다음과 같습니다.
C#
class OutExample
{
    static void Method(out int i)
    {
        i = 44;
    }
    static void Main()
    {
        int value;
        Method(out value);
        // value is now 44
    }
}


out 인수로 전달되는 변수는 이를 전달하기 전에 초기화할 필요가 없지만 호출하는 메서드는 메서드 반환 이전에 값을 할당해야 합니다.
ref 및 out 키워드는 런타임에 서로 다르게 취급되지만 컴파일 타임에는 동일하게 취급됩니다. 따라서 한 메서드는 ref 인수를 사용하고 다른 메서드는 out 인수를 사용하는 경우 메서드를 오버로드할 수 없습니다. 예를 들어 이러한 두 메서드는 컴파일할 때 동일하게 간주되므로 다음과 같은 코드는 컴파일되지 않습니다.
C#
class CS0663_Example
{
    // Compiler error CS0663: "Cannot define overloaded 
    // methods that differ only on ref and out".
    public void SampleMethod(out int i) { }
    public void SampleMethod(ref int i) { }
}


그러나 한 메서드가 ref 또는 out 인수를 사용하고 다른 메서드는 두 인수 중 어느 것도 사용하지 않는 경우 다음과 같이 오버로드할 수 있습니다.
C#
class OutOverloadExample
{
    public void SampleMethod(int i) { }
    public void SampleMethod(out int i) { i = 5; }
}


속성은 변수가 아니므로 out 매개 변수로 전달할 수 없습니다.


확장메서드 ------------------------------------------------------------------------------------------------------------------------------------


using Extension;

namespace Extension

{

    public static class ExtensionMethod

    {

        public static int Multiplication(this int var, int a, int b)

        {

            int result = var;


            for (int i = 0; i < b; i++)

                result *= a;


            return result;

        }

    }

}


namespace ConsoleApplication1

{

    class Program

    {

        static void Main(string[] args)

        {

            Console.WriteLine("{0}", 6.Multiplication(2, 3)); -> 객체화 하지 않고도 함수를 불러올 수 있다.

        }

    }

}


c++의 static함수를 기억하는가 그것을 기억한다면 알기 쉬울 것이다.

즉 객체를 생성하지 않고도 다음과 같은 출력이 가능하게 하는 것이다. 각 숫자가 어떻게 대입되는지 알겠는가?


using Extension; -> 확장메서드를 사용하기 위해서는 다음과 같이 네임스페이스 지정이 필요하다.


namespace Extension

{

    public static class ExtensionMethod -> 확장메서드를 포함하는 클래스도 static 클래스 이여야 한다.

    {

        public static int Multiplication(this int var, int a, int b) -> this를 붙여주어야 한다. this는 확장매서드 호출에 사용되는 상수나 변수의 값을 받아들인다.

        {

            int result = var;


            for (int i = 0; i < b; i++)

                result *= a;


            return result;

        }

    }

}


namespace ConsoleApplication1

{

    class Program

    {

        static void Main(string[] args)

        {

            Console.WriteLine("{0}", 6.Multiplication(2, 3)); -> 호출하는 부분을 보자. 6? 뭐지? 라고 생각하겠지만 this에 어떤 인자가 들어갈지 생각해보면 편하다.

        }

    }

}


그리고 실험


namespace Extension

{

    public static class ExtensionMethod

    {

        public static int Multiplication(this int var, int a, int b)

        {

            int result = var;


            for (int i = 0; i < b; i++)

                result *= a;


            return result;

        }

    }

}


namespace ConsoleApplication1

{

    class Program

    {

        static void Main(string[] args)

        {

            int a = 6;

            int b = 7;

            b = a.Multiplication(2, 3); -> 역시 변수를 통해서도 호출이 가능했다.

            Console.WriteLine("{0}", b);

        }

    }

}

'게임개발공부 > C#공부' 카테고리의 다른 글

속성(property)  (0) 2013.12.27
override 문법의 직관화  (0) 2013.12.20
클래스의 새로운 개념 <partial >  (0) 2013.12.19
foreach  (0) 2013.12.19
배열과 배열메소드  (0) 2013.12.19
Posted by JJOREG

클래스 나누기 ----------------------------------------------------------------------------------------------------------------------------------


class1.cs

public partial class Employee

{

    public void DoWork()

    {

    }

}


class2.cs

public partial class Employee

{

    public void GoToLunch()

    {

    }

}


msdn에 가보니 다음과 같이 클래스를 분할할수가 있다. 그러다 두 클래스는 같은 클래스로 본다.

기존 c++에서는 불가능 했던 몇가지 경우가 C#에서는 간단히 가능하다.


이를 가능하게 해주는 것은 partial이라는 '한정자'라는 문법을 통해서 가능하게 한다.

어렵게 생각하지 말자. 위의 녀석은 다음과 같은 선언이라고 보면 된다.


public class Employee

{

    public void DoWork()

    {

    }

    public void GoToLunch()

    {

    }

}

'게임개발공부 > C#공부' 카테고리의 다른 글

override 문법의 직관화  (0) 2013.12.20
참조형 함수인자. 확장 메서드.  (0) 2013.12.19
foreach  (0) 2013.12.19
배열과 배열메소드  (0) 2013.12.19
C#공부에 대해서...  (0) 2013.12.18
Posted by JJOREG
2013. 12. 19. 01:09

STL의 for_each가 아니네? ---------------------------------------------------------------------------------------


배열이나 컬렉션(일반적으로 배열을 뜻한다는데 배열 이외의 요소는 아직 접하지 못한 요소)에 대한 반복을 실행시켜주는 용도로 사용하는 것이 foreach문이라고 한다.

사용법은 간단하다.


foreach(데이터형 변수명 in 콜렉션(앞에 선언한 데이터형과 동일한 데이터형의 콜렉션))


콜렉션의 처음부터 끝까지 순회하면서 앞에 선언한 변수에 대입한다. 


            int[] array;


            array = new int[10];


            for (int i = 0; i < 10; ++i)

            { 

                array[i] = 10-i; 

            }


            Array.Reverse(array);


            foreach (int i in array)

            { Console.WriteLine(i); }


과 같은 방법으로 사용이 가능하다. 역시 신기하군.

'게임개발공부 > C#공부' 카테고리의 다른 글

참조형 함수인자. 확장 메서드.  (0) 2013.12.19
클래스의 새로운 개념 <partial >  (0) 2013.12.19
배열과 배열메소드  (0) 2013.12.19
C#공부에 대해서...  (0) 2013.12.18
C#에서 문자열형은?  (0) 2013.12.16
Posted by JJOREG

배열에 그냥 정렬기능이 존재하다니 신기하군! ----------------------------------------------------------------------------


c#에서 배열은 다음과 같이 선언이 가능합니다.


int[] array = new int[3];

인트형 인자 3개를 가진 배열을 선언한다.


신기한 것이 C#에서는 배열이 바깥을 벗어나면 알아서 오류를 출력해 준다는 것과.

이미 모든 배열은 0으로 초기화 되어있다는 것이다.


배열에 메소드! -----------------------------------------------------------------------------------------------------


C#에서는 배열에 대한 정렬기능을 언어차원에서 지원한다.


Array이라는 클래스는 배열과 관련된 기능들을 지원한다.


Array.Sort(정렬하고 싶은 배열명)을 넣어주면 자동으로 오름차순으로 정렬하며.


Array.Reverse(정렬하고 싶은 배열명)은 자동으로 내림차순으로 정렬해준다.


문자열도 그 순서에 따라서 정렬해준다. 

예전에 2.5D수업때 지형버텍스를 손수만든 퀵소팅함수로 정렬했었는데. 클래스 차원의 정렬 지원은 신기했다.

Posted by JJOREG

C++을 이미 배우고 익히고 있는 과정에서의 C#은? ---------------------------------------------------------------------------------------------------


포스팅을 하다가... 생각해보니 전적으로 C++에 의한 지식을 기반으로 해서 이해하고 있습니다. 말그대로 휙휙 넘기고 있죠.

기초중의 기초인 변수선언, 연산자 등 일단은 제가 c#만의 새로운 기능이나 선언법에 대해서만 포스팅하려고 합니다.

현재 학원에 재학중이고 최종적으로 3D팀 포트폴리오만 남은 상황에서 하나하나 집어나가는 것은 굉장히 힘든 일로 보입니다.

추가적으로 나중에 다시 차근차근 포스팅해 보고 싶기도 합니다.

'게임개발공부 > C#공부' 카테고리의 다른 글

foreach  (0) 2013.12.19
배열과 배열메소드  (0) 2013.12.19
C#에서 문자열형은?  (0) 2013.12.16
@의 의미가 대체 뭐지? C#에서 레퍼런스와 포인터란? 막긁어와!  (0) 2013.12.16
객체형????  (0) 2013.12.16
Posted by JJOREG
이전버튼 1 2 3 이전버튼