본문 바로가기

C# 공부

(22)
람다식(Lambda Expression) 람다식(λ-Expression) 은 익명 메소드를 만드는 또 하나의 방법이다. C#뿐만 아니라 C++, JAVA, Python과 같은 주류 프로그래밍언어에서는 대부분 람다식을 지원하고있다. A. 람다식의 형식 //매개 변수 목록 => 식 delegate int Calculate(int a, int b); //익명메소드를 만들기위해 대리자가 필요하다. static void Main() { Calculate calc = (int a, int b) => a+b; //두개의 int 형식 매개변수 a,b를 받아서 //이 둘을 더해 반환하는 익명 메소드를 람다식으로 만들었다. } ※ 추가적으로 C# 컴파일러는 위 코드를 간결하게 만들 수 있도록 "형식유추(Type Interface)" 라는 기능을 제공한다. del..
대리자(Delegate)와 이벤트 - 2 (이벤트, 대리자와 이벤트의 차이) A. 이벤트 : 객체에 일어난 사건 알리기 이벤트는 대리자를 event 한정자로 수식해서 만들기 때문에 동작원리는 대리자와 거의 비슷하다. - 이벤트를 선언하고 사용하는 절차 Step 1. 대리자를 선언한다. 대리자는 클래스 밖에 선언해도되고, 안에 선언해도 된다. delegate void EventHandler(string message); Step 2. 클래스내에 1에서 선언한 대리자의 인스턴스를 event 한정자로 수식해서 선언한다. class MyNotifier { public event EventHandler SomethingHappend; public void DoSomething(int number) { int temp=number % 10; if(temp!=0 && temp%3==0) { ..
대리자(Delegate)와 이벤트 - 1 (대리자, 대리자를 사용하는 이유와 상황, 일반화 대리자, 대리자 체인, 익명 메소드) 1. 대리자(Delegate) 콜백(Callback)은 프로그래밍에서 어떤일을 해줄 코드를 두고, 이 코드가 실행할 세부코드는 컴파일 시점이 아닌 실행시점에 부여하는것이다. 또한, 대리자는 메소드에 의한 참조이며, 대리자에 메소드의 주소를 할당한 후 대리자를 호출하면 이 대리자가 메소드를 호출해준다. //대리자 선언예시 //메소드에 대한 참조이므로 자신이 참조할 메소드의 반환 형식과 매개 변수를 명시해줘야한다. delegate int MyDelegate(int a, int b) * 대리자는 인스턴스가 아닌 int, string과 같이 형식(Type)이며, 인스턴스를 따로 만들어야 사용가능하다. ex) int Plus(int a, int b){return a+b;} int Minus(int a, int b..
예외 처리하기 (try~catch문, System.Exception 클래스, 예외 던지기, finally, 사용자 정의 예외클래스, 예외 필터(when), 예외처리의 장점) A. try ~ catch문 static void Main(string[] args) { int[] arr = { 1, 2, 3 }; try { for (int i = 0; i < 5; i++) Console.WriteLine(arr[i]); } catch(IndexOutOfRangeException e) { Console.WriteLine($"예외가 발생했습니다 :{e.Message}"); } Console.WriteLine("종료"); } B. System.Exception 클래스 C#에서 모든 예외클래스는 System.Exception 클래스로부터 파생되었다. 즉, catch절에서 Exception으로 모든 예외를 다 받아낼 수 있다. * 하지만, 예외 상황에 따라 섬세한 예외 처리가 필요한 코드에..
일반화(Generic) 프로그래밍 (일반화 메소드/클래스, 형식매개변수 제약, 일반화 컬렉션) A. 일반화 메소드(Generic Method) 데이터 형식을 일반화한 메소드. 일반화할 형식이 들어갈 자리에 구체적인 형식의 이름 대신 형식 매개 변수(Type Parameter)가 들어간다. //int형식 void CopyArray(int[] source, int[] target) { for(int i=0;i
인덱서 (인덱서의 선언과 사용, foreach가 가능한 객체 만들기) A. 인덱서(Indexer)의 선언 인덱서(Indexer)는 인덱스를 이용해서 객체 내의 데이터에 접근하게 해주는 프로퍼티이며, 프로퍼티와 인덱서의 차이점은 인덱스를 사용하여 객체를 배열처럼 사용하게 해주는것이다. 아래는 인덱서의 선언 예시이며, MyList는 내부에 정수형식 배열을 갖고, 인덱서를 통해 이 배열에 접근한다. 인덱서를 통해 데이터를 저장하고자 하는 시도가 이뤄질때 지정한 인덱스보다 배열의 크기가 작다면 인덱스에 맞춰 배열의 크기를 재조정한다. class MyList { private int[] array; public MyList() { array = new int[3]; } public int this[int index] //인덱서 { get { return array[index]; }..
컬렉션 (ArrayList, Queue, Stack, Hashtable) A. 컬렉션(Collection) 같은 성격을 띄는 데이터의 모음을 담는 자료구조를 말한다. .NET 프레임워크는 배열외에도 다양한 컬렉션을 제공하며, 대표적으로 4가지가있다. 1. ArrayList 2. Queue 3. Stack 4. Hashtable 1. ArrayList 배열과 비슷하게 동작하지만, 차이점은 용량을 미리 지정할 필요없이 자동으로 용량이 늘어나거나 줄어든다. - Add() : 컬렉션의 마지막에 요소를 추가한다. - RemoveAt() : 특정 인덱스의 요소를 제거한다. - Insert() : 원하는 위치에 새 요소를 삽입한다. ArrayList list = new ArrayList(); list.Add(10); list.Add(20); list.Add(30); list.RemoveA..
배열 (선언 및 사용, 초기화, System.Array 클래스, 2차원/다차원 배열, 가변배열) A. 배열의 선언 및 사용법 int[] array = new int[5]; int sum; foreach(int score in array) sum+=score; int average= sum/array.length(); B. 배열의 초기화방법 3가지 //1번째 : 기본 string[] array1 = new string[3]{"a","b","c"}; //배열 객체를 초기화하는 {}블록을 컬렉션 초기자(Collection Initializer)라고 한다. //2번째 : 배열의 용량생략 string[] array2 = new string[]{"a","b","c"}; //3번째 : new 연산자, 배열의 용량 모두를 생략 string[] array3 = {"a","b","c"} * 작성시 3번째 방법이 편하..