Junsu.com

C# 기본 문법 정리

object 형식

모든 형을 담을 수 있는 형식(기본 데이터 형식, 복합 데이터 형식, 사용자 데이터 형식..)


Nullable 형식

null 이 가능한 형식. 기본적으로 컴파일러에서 null값을 허용하지 않는데 ?를 붙여 줌으로 변수에 null 값을 허용 할 수 있다.

int? a = null;
float? b = null;

var 형식

javascript, as 와 같이 컴파일러에서 형식을 판단 해서 사용할 수 있게 하는 형식. 지역 변수로만 사용 가능.


Console.WriteLine

여러가지 값 출력 하기.

int a=3, b=15;
string c = "abc";
Console.WriteLine("a:"+a+" b:"+b+" c:"+c);     //a:3 b:15 c:abc
Console.WriteLine("{0} {1} {2}", a, b, c);    // 3 15 abc

정수를 특정 자릿수의 10진수로 출력하기

int a = 3;
Console.WriteLine("{0:D5}",a);  // 00003

정수를 16진수로

int a=255;
Console.WriteLine("{0:X8}", a);   // 000000FF

명명된 매개변수

public MainWindow()
{
    InitializeComponent();

    addPhoneNumber(number: "01234", name: "홍길동");
    addPhoneNumber(name: "박찬호", number: "2345");
    addPhoneNumber("이승엽", number: "9876");
}

private void addPhoneNumber(string name, string number)
{
    Console.WriteLine("Name:{0} Phone:{1}", name, number);
}
출력:
Name:홍길동 Phone:01234
Name:박찬호 Phone:2345
Name:이승엽 Phone:9876

선택적 매개변수

void MyMethod(int a=0, int b=1)
{
...
}
MyMethod(2);

this() 생성자

class MyClass
{
     int a,b,c;
     public MyClass()
     {
          this.a = 123;
     }
     public MyClass(int b) : this()     // 이렇게 하면 위쪽 MyClass() 생성자가 먼저 호출 된다.
     {
          this.b = b;
     }
}

접근 한정자


형식 확인, 변환(is, as)

is : 객체가 해당 형식에 해당하는지를 검사하여 그 결과를 bool 값으로 반환합니다. as : 형식을 변환 하지만 실패하는 경우 객체 참조를 null로 만듭니다.

class Test
{
    public Test()
    {
        Dog d = new Dog();
        if (d is Animal)
        {
            Console.WriteLine(d);
        }

        Animal a = d as Animal;
        if(a != null)
        {
            Console.WriteLine(a);
        }
    }
}

class Animal
{
}
class Dog : Animal
{
}

메소드 숨기기

파생 클래스에서 기반 클래스에서 구현된 함수를 다시 구현 할때 new 키워드를 사용한다. 사용하지 않으면 warning이 발생한다.

class Animal
{
    public void A()
    {
    }
}
class Dog : Animal
{
    public new void A()
    {
    }
}

분할 클래스

partial 키워드를 이용해서 클래스를 같은 파일이나 다른 파일에서 분할 해서 구현 할 수 있다.

partial class Animal
{
    public void A()
    {
    }
}
partial class Animal
{
    public void B()
    {
    }
}

확장 메소드

기존의 클래스나 형식을 확장 해서 사용하게 해 주는 메소드 방식

namespace WpfApplication1
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            1.print();
        }
    }

    public static class AA
    {
        public static void print(this int a)
        {
            Console.WriteLine(a);
        }
    }
}

프로퍼티 선언

변수에 대한 get함수, set함수를 생성 하는 대신 프로퍼티 형식으로 선언해서 접근 제한이나 예외 처리를 할 수 있다.

public MainWindow()
{
    InitializeComponent();
    A a = new A();
    a.Num = -1;
    Console.WriteLine(a.Num);   // 0
}

class A
{
    private int _num = 0;
    public int Num
    {
        get { return _num; }
        set
        {
            if(value>0)
                _num = value;
        }
    }
}

자동프로퍼티, 프로퍼티 생성자

public MainWindow()
{
    InitializeComponent();
    A a = new A()
        {
            Num = -1,
        };
    Console.WriteLine(a.Num);   // -1
}

class A
{
    public int Num
    {
        get;
        set;
    }
}

인덱서(Indexer)

Index를 이용해서 객체 내의 데이터에 접근하게 해 주는 프로퍼티.

public MainWindow()
{
    InitializeComponent();

    A a = new A();
    a[1] = 2;
}

class A
{
    private int[] _array = new int[3];
    public int this[int i]
    {
        get
        {
            return _array[i];
        }
        set
        {
            if (i < 3)
                _array[i] = value;
        }
    }
}

일반화(Generalization)

데이터 형식을 일반화한 메소드.

public MainWindow()
{
    InitializeComponent();

    Console.WriteLine(equal(1, 3) + " " + equal("A", "A")); //False True
}

bool equal<A>(A src, A dst)
{
    return src.Equals(dst);
}

일반화 클래스

public MainWindow()
{
    InitializeComponent();

    A<int> a = new A<int>() { data = 1 };
    A<string> b = new A<string>() { data = "abc" };
    Console.WriteLine(a.data +" "+b.data);  //1 abc
}

class A<T>
{
    public T data;
}

일반화 클래스 매개 변수 제약

모든 값들을 사용하는 것이 아니라 struct, class, 기반 클래스, 인터페이스 이름 등을 지정 할 수 있다.

public MainWindow()
{
    InitializeComponent();

    Console.WriteLine(equal(3, 3) + " "); //True
}

bool equal<A>(A src, A dst) where A : struct
{
    return src.Equals(dst);
}

델리게이트(delegate)

Callback 과 같은 기능을 구현 할 때 사용

delegate int MyDelegate(int a, int b);
public MainWindow()
{
    InitializeComponent();

    MyDelegate a = new MyDelegate(Plus);
    Console.WriteLine(a(1, 2)); //3
}

int Plus(int a, int b)
{
    return a + b;
}
delegate void MyDelegate(int a, int b);
public MainWindow()
{
    InitializeComponent();

    MyDelegate a = new MyDelegate(Plus);
    a += new MyDelegate(Minus);
    a(1, 2); //3-1
}

void Plus(int a, int b)
{
    Console.Write(a + b);
}
void Minus(int a, int b)
{
    Console.Write(a - b);
}

이벤트(event)

델리게이트를 사용해 함수를 만들고 event로 등록해서 함수를 호출 할 수 있다.

event MyDelegate OnMyDelegateEvent;
delegate void MyDelegate(int a, int b);
public MainWindow()
{
    InitializeComponent();
    OnMyDelegateEvent += new MyDelegate(MainWindow_OnMyDelegateEvent);

    OnMyDelegateEvent(1, 2);
}

void  MainWindow_OnMyDelegateEvent(int a, int b)
{
                Console.WriteLine(a+b);
}

람다식

쫌 더 간결한 형식으로 함수를 묘사 하기 위해서 만들어 진 형식. (LISP 같은 언어에서 적용되었으나. C 나 Java에서는 계획되었다가 불분명한 이유로 취소 되었다고 함)

delegate int Calculate(int a, int b);
public MainWindow()
{
    InitializeComponent();

    Calculate calc = (int a, int b) => a + b;
    Console.WriteLine(calc(1, 2));  //3
}

링크(LINQ)

데이터를 쉽게 선택, 정렬 할 수 있게 해 주는 방법.

public MainWindow()
{
    InitializeComponent();

    int[] numbers = { 6,7,4,3,8,1,2,9 };
    var result = from n in numbers
                 where n % 2 == 0
                 orderby n
                 select n;

    foreach(int n in result)
        Console.Write(n + " "); //2 4 6 8
}

dynamic 형식

컬파일 시에 데이터 형식이 정해 지는 것이 아니라 실행시에 형식이 정해진다.(컴파일 에러를 비켜 가기 위해서 사용, COM과의 연동 때문에 추가)