노력과 삽질 퇴적물

C#: 기초문법 본문

프로그래밍note/언어. C# 계열

C#: 기초문법

MTG 2015. 12. 21. 23:25






0. 필요한 파일 & 예시경로


설치 및 예시경로

 SharpDevelop
 [#다운로드]

 C:\Program Files\SharpDevelop\(버전명)

 .NET Framework

 (기본경로값)

-> 샤프 디벨롭3.2부터는 Frameworks 2.0이상 필요




1. 데이터 타입&enum


1) 리터럴 데이터

 변수에 입력하는 값에 접미어 표시(Suffix)가 없을경우, 다음의 5가지 데이터 타입을 기본으로 할당한다.

 int

 double

 char

 string

 bool


그외 리터럴 데이터 타

-> char과 string 다른 언어하고 동일하게 ''/""로 구분된다.

 long

 unit

 ulong

 float

 double

 decimal

 long var = 2014L;

 unit var = 2014U;

 ulong var = 2014UL;

 float var = 2014F;

 double var = 2014.12D;

 or double var = 2014.12;

 decimal var = 2014.12M;



2) Nullable Type

-> C# 2.0부터 Value Type 변수에 null을 가질수 있다.

-> [??]연산자와 연관성이 있음.

-> 예.  int? a;



3) 배열

-> C# 배열도 Zero-based Array라 첫번째 배열원소 인덱스값이 0이다.

1차원 배열

 int[] idx1 = new Int[5];

 int[] idx2 = {11, 22, 33, 44, 55};

 2차원 배열

 int[,] idx2 = { {21, 22, 23, 24, 25},

                     {31, 32, 33, 34, 35} };

 int[][] idx1 = new int[5][];   //가변배열(Jagged Arr.)

 idx1[] = new int[4];             //배열마다 새로 할당가능.

 idx1[] = new int[2] {1, 2,};

 idx1[] = new int[5];

 3차원 배열

 int[,,] idx;



4) 열거형

C# enum (열거형)



5) 기타

-> 문자열: Immutable이라, 한번 지정된 문자열은 새로 지정하더라도 내부적으로 전혀 다른 메모리를 갖는 객체가 된다고 한다.

-> 전역은 선언시 초기화 안 해도 기본값 자동 / 로컬은 그렇게 했다가 에러




2. 기본 제어


* if, for, switch-case문은 다른 언어와 사용법이 동일해서 생략


1) foreach 반복문

-> 배열/컬렉션뿐 아니라, 다차원 배열에도 유용하다고 한다.

for문

foreach문

int[,] idxArr = { {21, 22, 23, 24, 25},

                       {31, 32, 33, 34, 35} };


for(int line = 0; line < idxArr.GetLength(0); line++)

{

   for(int row = 0; row < idxArr.GetLength(1); row++)

   {

      ... ...

   }

}

int[,] idxArr = { {21, 22, 23, 24, 25},

                       {31, 32, 33, 34, 35} };


foreach (int tmp in idxArr)
{
   ... ...
}






2) 예외처리, try-catch

try
{
   ...
}
catch (Exception ex)
{
   ...

   throw; //throw문 뒤에 Exception객체가 있을경우: 기존 혹은 새로운 객체를 쓰게 함.

             //throw문 뒤에 아무것도 없을경우: 발생된 에러를 디버깅하기 좋음.

}
catch (... ex)
{
   ...
}
finally
{//중간에 에러가 나도 반드시 실행되는 구간
   ...



3) yield
C# yield


4) 전처리기

1
2
3
4
5
6
7
8
9
10
#define DEBUG//심벌
//#define RELEASE
 
#if DEBUG
    ... ... ...
#else
    ... ... ...
    //심벌 RELEASE를 주석해제하고, 심벌 DEBUG를 주석처리시 실행.
#endif
    ... ... ...
cs


기타

#region과 #endregion

> #pragma

자세히 읽기






3. 함수


1) 종류

* 규칙상 5가지 방식으로 구별할 수 있다.

 Pass by Value

 함수인자에 변수를 넣어주는 일반적인 방식이다.

 키워드, ref

 함수 인자에 ref가 붙으면, 함수내에서 변경된 변수값이 함수 밖에서도 유효.

ref가 붙는 변수는 사용전 초기화가 되어야 한다.

 Named 파라미터

 4.0부터 위치 상관없이 파라미터명으로 파라미터 전달가능.

 Optional 파라미터

 4.0부터 가능한 방식. (액션스크립트 3.0에도 쓰임. 미묘하게 다형성이 연상됨.)

 함수인자에서 변수에 기본값을 지정해두면, 함수호출시 해당 인자를 생략해도 된다.

 단, Optional 파라미터에 해당되는 인자가 맨뒤로 배치되야 한다.


ex. void calFunc(int val1, int val2, int result = 0)

{

   ... ... ...

}

... ... ...

calFunc(2014, 12);

calFunc(2015, 12, 21);

 키워드, params

 함수인자에 가변배열 사용가능하게 함.


 ex.

void calFunc(params int[] val)

{

   ... ... ...

}



2) Static 메서드

-> 메서드 내부에서 클래스 인스턴스 객체 멤버를 참조해서는 안된다. (반환타입 있는 메소드로만 사용?)



3) 익명함수

익명 함수(C# 프로그래밍 가이드)



4) 확장 매소드?
-> C# 3.0부터 지원.
-> 다른 클래스의 인스턴스 매소드처럼 사용가능한 static 매소드






4. 클래스


1) 상속

public class Child : Parent

public class Child : MyInterface1, MyInterface2        //인터페이스 선언시, 접근제한자X. 구현은 재정의 해주는 그거임
public class Child : Parent, MyInterface1, MyInterface2


btn.Click += new EventHandler(btn_Click);

partial 키워드는 class, struct, interface 키워드 바로 앞에 위치해야    //Abstract랑 유사?

1
2
3
4
5
6
7
8
9
10
11
public class Parent
{
    public int _mem1 = 0;
    protected int _mem2 = 0;
 
    public virtual void Func1()
    {
        ... ... ...
    }
    ... ... ...
}
cs
1
2
3
4
5
6
7
8
9
10
11
12
13
public class Child : Parent
{
    //public int _mem1 = 0;
    //protected int _mem2 = 0;
 
    //부모함수 재정의
    public override void Func1()
    {
        base.Func1();//부모함수의 동작도 사용.
        ... ... ...
    }
    ... ... ...
}
cs



2) 인덱서

-> 객체가 배열이 아닌데도 배열처럼 클래스내 특정 멤버변수에 접근 가능.

//인덱서
MyClass cls = new MyClass();
      cls[1] = 1024;

class DataObj

{

   ... ...

   public int this[int idx]

   {

      get

      {

      }

      set

      {

      }

   }

}

class



3) is & as

-> as 연산자: 객체를 지정된 클래스 타입으로 변환하는데 사용된다. 만약 변환이 성공하면 해당 클래스 타입으로 캐스팅하고, 변환이 실패하면 null 을 리턴
EX.
    MyBase a = obj as MyBase;    //as연산자로 캐스팅
    MyBase b = (MyBase) obj;     //Implicit Casting. 암묵적 캐스팅. 변환이 실패하면 Exception을 발생
-> is 연산자: 객체가 특정 클래스 타입이나 인터페이스를 갖고 있는지 확인하는데 사용



4) 기타
상속 및 파생 클래스(C# 및 Java)





5. 네임스페이스


C# 네임스페이스 참조
-> C++쪽하고 큰차이는 없다.





6. 고급요소


1) delegate
함수 포인터랑 비슷?

특이하게 함수인자는 int만 가능.



2) Generics
> C++의 템플릿과 비슷
> 클래스, 인터페이스, 메서드 등에 <T> 같은 타입 파라미터를 붙여 사용.
> 어떻게 보면 오버로드(다형성)랑 연관있는 타입
> 또한 using System.Collections.Generic 네임스페이스에 있는 모든 자료구조 관련 클래스가 Generics타입.


3) Property(프로퍼티)
> 필드와 매소드 특징을 모두 가지고 있어서, get/set접근자로 값을 쓰거나 읽어올수 있다.
 여기서 set접근자는 반환타입이 void인 매서드와 유사.


4) 그외
await: Task와 같은 awaitable 클래스 객체가 완료되기를 기다림.






기타.







기타. 변경이력


일자

변경이력

2015-12-21

 초안

2016-01-20

 상속 내용 보완 및 보충

> 재정의

> base 예약어

2016-08-10

 6. 고급요소 보완 및 보충