c# 윈도우 프로그래밍 정리

Download Report

Transcript c# 윈도우 프로그래밍 정리

NameSpace:성격이나 하는 일이 비슷한 클래스, 구조체, 인터페이스, 델리게이트, 열거 형식 등을
하나의 이름아래 묶는 일을 한다
namespace 네임스페이스_이름
{
클래스,구조체,인터페이스 등등..
}
Class:프로그램을 구성하는 기본단위, 데이터와 데이터를 처리하는 기능(Method)으로 이루어짐
주석(//, /*~*/):코드안에 기록하는 메모
Main메소드:1.C# 콘솔 응용프로그램이나 windows 응용 프로그램의 진입점
2.응용프로그램이 시작할떄 제일 처음 호출되는 메소드
3.진입점은 단 한 개
4.클래스나 구조체 내부에 존재
5.정적-X
6.public-X
class Test
{
static void Main(string[] args)
{
Console.WriteLine(args.Length);
}
}
변수(Variable):컴퓨터의 메모리로부터 할당받은 공간을 의미 수치나 문자 등과 같은 데이터를 저장
하는 용도로 사용
데이터형_이름 변수_이름;
int num=100;
데이터 형식은 값 형식(value types)이거나 참조 형식(reference types)이다
값 형식(value types):변수가 값을 담는 데이터 형식
참조 형식(reference types):변수가 값 대신 값이 있는 곳의 위치를 담는 데이터 형식
기본 데이터 형식(privitive types):어떤 데이터 타입이던지 컴파일러가 직접 지원해주는
데이터 타입
1.정수 계열 형식(integral types):정수 데이터를 담기 위해 사용
(ex: byte, short, int, long 등등..)
2.부동 소수점 형식(Floating Point Types):부동 소수점 상수를 나타내기위해 사용되는
형식(ex: float, double)
3.decimal 형식:실수를 다루는 데이터 형식, 부동 소수점과는 다른 방식,정밀도가 높음
(ex: decimal)
4.문자 형식:하나의 문자를 다루는 데이터 형식(ex: char)
5.문자열 형식:여러 개의 문자를 다루는 데이터 형식(ex: string)
6.논리 형식(boolean Types):참(true), 거짓(false)으로 이루어지는 형식
7.object 형식:object란 객체를 말하는 것으로 어떤 물건이든지 다룰 수 있는 데이터 형
식
형식 변환(type Conversion):변수를 다른 데이터 형식의 변수에 옮겨 담는것
Byte a = 2;
Int b = (int)a;
상수(constants):값을 바꾸는 것이 불가능한 변수
const int a = 3;
const 자료형 상수명 = 값;
열거 형식:여러 개의 상수를 정리
enum test {yes, no, ok}
Eunm 열거형식명 : 기반자료형 {상수1, 상수2, 상수3,………}
Nullable 형식:변수에게 할당된 메모리 공간을 비움
데이터형식? 변수이름;
int? a = null;
var:데이터 형식을 알아서 파악하는 컴파일러
var a = 3; // a는 int 형식
var b = “hello”; // b는 string 형식
연산자:프로그램의 논리식이나 산술식을 표현하고 처리하기 위해 제공되는 다양한 기호
분류
연산자
산술연산자
+, -, *, /, %
증가/감소 연산자
++, --
관계 연산자
<, >, ==, !=, <=, >=
조건 연산자
?:
논리 연산자
&&, ll, !
비트 연산자
<<, >>, &, l, ^, ~
할당 연산자
=,+=, -=, *=, /=, %=, &= ……..
산술 연산자:수치 형식의 데이터를 다루는 연산자
int result 15 / 3;
증가/감소 연산자:피연산자의 값을 1 증가시키거나 1 감소시키는 연산자
-전위 증가/감소 연산자:변수의 앞에 위치시켜 사용
-후위 증가/감소 연산자:변수의 뒤에 위치시켜 사용
int a = 10;
a++ //a 는 10
a-- //a 는 11
int a = 10;
Console.WriteLine(a++); // 11을 출력, 출력 후 a는 11로증가
Console.WriteLine(++a); // 12을 출력
관계 연산자:두 피연산자 사이의 관계를 확인하는 연산자
Result = 3 > 4; //거짓
Result = 3 < 4; //참
논리 연산자:참과 거짓으로 이루어지는 진리값이 피연산자인 연산
Int a=3;
bool c = a < b && b < 5; // c는 true
Int b=4;
bool c = a > b && b < 5; // c는 false
조건 연산자: 조건의 결과가 참 혹은 거짓중 하나일 떄 사용하는 연산자
int a = 30;
string result = a == 30 ? “삼십” : “삼십 아님” // result 는 “삼십”
비트 연산자:두 개의 비트를 대입 했을때 각각의 비트 연산 즉 이진화로 구현해서 연산
Int a = 10;
Int b = a>>2;
int a = 10; int b = 2;
int c = a^b;
할당 연산자:변수 또는 상수에 피연산자 데이터를 할당하는 기능
int a = 100;
a += 90; // a=a+90
a는 즉 190
int number = 10;
if(number < 0)
Console.WriteLine(“음수”);
If, else 그리고 else if
하나의 조건을 판단하여, 참 또는 거짓
을 가진다
else if (number > 0)
Console.WriteLine(“양수”);
좀더 다양한 조건식을 사용하기 위
해 else if 문을 사용한다
else
if와 else는 식에서 딱 한번만 쓸수
있으므로 else if 를 통해 조건을 더
추가 해준다
Console.WriteLine(“0”);
if문의 조건을 검사하여 만족 하면 뒤의 코드가 실행
만족 하지 않으면 else if 문으로 넘어가 같은 실행을 반복한다
else if 문에도 만족하는 경우가 없을 경우 최종 else로 넘어와
뒤의 코드를 실행하고 끝이 나게 된다.
Switch 문
switch (number)
{
case 1 :
Console.WriteLine(“하나”);
break;
case 2 :
Console.WriteLine(“둘”);
break;
case 3 :
Console.WriteLine(“셋”);
break;
default:
Console.WriteLine(“없음”);
break;
}
조건식의 결과가 가질 수 있는 다양한 경우
를 한번에 평가하고 프로그램의 흐름을 가
를 떄 사용
number라는 변수의 값에 따라 case 별로
있는 곳에 해당 하는 곳 의 코드를 실행하
게된다
코드가 실행되고 난 후는 break를 통해
switch문을 나가게 된다
그러나 case에서 해당하는 경우가 없을 경
우 최종 default 문으로가 해당 코드를 실
행하고 break문을 만나 빠져 나감
int a = 10;
while(a > 0)
Console.WriteLine(a);
while
조건식이 참인 동안 코드를 반복 실행
a값이 10이고 a가 0보다 크다는 조건에 만족
하기 때문에 a가 출력이 된다
do while
int a = 10;
do{
Console.WriteLine(a);
}
while(a<0);
while 문과 유사한 반복문, 하지만 do while
은 코드를 무조건 한번 실행 수 조건식을 평
가한다
a의 값이 10이고 우선은 조건에 상관없이
a가 한번 출력하게 되고 그 다음 while 문
의 조건을 판별 후 a가 0보다 작다는 조건
이 성립되지 않으므로 do while 문이 끝나
게 된다
for(int i = 0; i < 5; i++){
Console.WriteLine(“*”);
}
for문
while문 보다 반복을 더 정교하게 제어 할 수
있다. For문은 초기화식,조건식,반복식 으로
이루어 진다
i의 값이 0이고 조건식이 5보다 작을때 까지 이고 실행을 할때 마다 i값이 증가하므로 총
5번의 * 모양을 출력하게 된다
foreach문
int[] arr = new int[]{0, 1, 2, 3, 4};
foreach (int a in arr)
{
Console.WriteLine(a);
}
배열을 순회하며 각 데이터 요소에 차례대로
접근하게 해준다
arr의 배열을 선언후 foreach문을 통해 a라는
변수에 arr의 배열 내용을 읽어온다
그리고 a를 출력하게 되면 arr의 배열 값들이
출력 되게 된다
int i = 0;
while(i >= 0){
if(i==10)
break;
i++;
}
for(int I = 0; I < 5; i++){
if(I == 3)
continue;
Console.WriteLine(i);
}
goto jump;
Console.WriteLine(“2”);
Console.WriteLine(“3”);
jump:
Console.WriteLine(“4”);
break문
현재 실행 중인 반복문을 중단하고자 할 때 사용
i는 0으로부터 시작하게 되고 while문이 실행되면
서 i가 1씩 증가하다가 10이 될경우에 if문의
break를 만나 반복문 이 끝나게 된다
continue문
한 회 건너 뛰어 반복을 계속 수행하게 하는 기
능
i가 3인 경우 현재 실행 중인 즉 3의 값은 출력하지
않고 반복을 건너 뛴다
Goto문
레이블이 가리키는 곳으로 점프시키는 문
2와3을 출력하는 문을 뛰어 넘어 바로 4를 출력하
는 코드로 이동한다
메소드(Method):객체의 일을 처리하는
방법 또는 방식
반환(return):결과를 돌려주는것
Class Calculator{
public static int plus(int a, int b)
{
Console.WriteLIne(“input : {0}, {1}”, a, b,);
}
}
int result = a + b;
return result;
매개변수(parameter):몇 개의 변수 사이
에 함수관계를 정하기 위해서 사용되는
또 다른 하나의 변수
1.값에 의한 전달(Call by value): 데이터를
복사해서 매개 변수에 넘기는 것
2.참조에 의한 전달(Call by reference):
매개 변수가 메소드에 넘겨진 원본 변수
를 직접 참조(ex: ref)
3.out에 의한 참조: out 키워드를 사용하
면 호출하는 쪽의 인수를 초기화 할 필요
가 없다(ex: out)
------메소드 오버로딩------int plus (int a, int b)
{
return a + b;
}
double plus (double a, double b)
{
return a + b;
}
------가변길이 매개 변수----int sum( params int[] args)
------명명된 매개 변수-----static void printprofile(string name, string phone)
{
Console.WriteLine(“Name:{0}, Phone:{1}”,name,phone);
}
static void Main(string[] args)
{
printprofile(name: “박찬호”, phone:”010-123-1234”):
}
------선택적 매개 변수-----Void MyMethod(int a = 0, int b = 0)
{
Console.WriteLine(“{0}, {1}”, a, b);
}
MyMethod(3);
MyMethod(3, 4);
메소드 오버로딩:하나의 메소드 이름에
여러 개의 구현을 올리는 것
가변길이 매개 변수:params 키워드와 배
열을 이용해서 선언, 매개 변수의 개수가
유연하게 변할 수 있는 매개 변수를 말한
다.
명명된 매개 변수: 메소드를 호출할 때
매개 변수의 이름에 근거해서 데이터를
할당할 수 있는 기능
선택적 매개 변수:매개 변수는 특정 값으
로 초기화하듯 메소드를 선언할수 있다
필요한 경우에는 데이터 할당을 할 수도
있다
기본값을 가지는 매개 변수는 필요에 따
라 데이터를 할당하거나 할당하지 않을
수 있기 때문에 이를 선택적 매개 변수라
고 부른다
class cat{
public cat(string _Name, string _Color){
Name=_Name;
Color=_Color;
}
생성자
}
소멸자
~cat()
{
Console.WriteLine(“{0} : 잘가”, Name);
}
객체생성
cat kitty = new cat(“키티”, “하얀색”);
class employee
{
private string name;
public void setname(string name)
{
this.name = name;
}
}
객체:모든 주관이나 주체의 작용 대상
이되는것
생성자:클래스의 이름과 동일한 이름을
가지며 객체를 생성하는 역할
소멸자:클래스 이름 앞에 ~ 기호를 붙
인다, 객체 파기 함수의 개념
this 키워드: 객체가 자신을 지칭할
때 사용하는 키워드
객체 내부에서는 자신의 필드나 메
소드에 접근할 때 this 키워드를 사용
한다는 것
접근 한정자:감추고 싶은 것은 감추고 보여 주고 싶은 것은 보여 줄수 있도록 코드를 수식
접근 한정자
설명
public
클래스의 내부/외부 모든 곳에서 접근할수 있다.
protected
클래스의 외부에서는 접근할 수 없지만, 파생클래스에서는 접근이
가능하다.
private
클래스의 내부에서만 접근할 수 있다 파생클래스에서도 접근이 불
가능하다.
internal
같은 어셈블리에 있는 코드에 대해서만 public으로 접근 할 수 있다.
다른 어셈블리에 있는 코드에서는 private와 같은 수준의 접근성을
가진다.
protected internal
같은 어셈블리에 있는 코드에 대해서만 protected로 접근할 수 있다.
다른 어셈블리에 있는 코드에서는 private와 같은 수준의 접근성을
가진다.
상속:기존의 클래스를 재사용해서 새로운 클래스를 만드는것
class base{
public base(){
Console.WriteLine(“base()”);
}
}
class derived : Base{
public derived(){
Console.WriteLine(“deriver()”);
}
}
메소드 오버라이딩:상위 클래스를 상속 받은 하위 클래스에서 상위 클래스에 정의된 메
소드를 재정의 하는 것, 오버라이딩을 하기 위해서는 메소드가 virtual 키워드로 한정 되
어 있어야 한다.
class ArmorSuite{
public virtual void initialize(){
Console.WriteLine(“armored”);
}
}
class IronMan : ArmorSuite{
public override void initialize(){
Console.WriteLine(“Repulsor Rays Armed”);
}
}
메소드 숨기기:기반 클래스에서 구현된 버전의 메소드를 감추고 파생 클래스에서 구현
된 버전만을 보여주는 것 파생클래스의 메소드를 new 한정자로 수식
메소드 봉인:메소드 앞에 sealed 키워드를 붙여줌으로써 메소드를 봉인할수 있다 봉인
한 메소드는 오버라이딩을 할 수 없다.
중첩클래스: 클래스 안에 클래스를 선언 하는것.
1.클래스 외부에 공개하고 싶지 않은 형식을 만들고자 할 때
2.현재의 클래스의 일부분처럼 표현할 수 있는 클래스를 만들고자 할 떄 사용
분할클래스:여러 번에 나눠서 구현하는 클래스를 말한다, 클래스의 구현이 길어질 경우
여러 파일에 나눠서 구현하게 함으로써 소스 코드 관리의 편의를 제공하는 데에 그 의
미가 있다.
확장메소드:기존 클래스의 기능을 확장하는 기법
namespace 네임스페이스 이름
{
public static class 클래스 이름
{
public static 반환형식 메소드이름(this 대상형식 식별자, 매개_변수_목록){
//
}
}
}
구조체: 다른 종류의 데이터를 하나로 묶어서 사용 하는 데이터 결합법
struct mystruct{
public int myfield1
public int myfield2
}
public void mymethod(){
//
}
interface 인터페이스이름
{
반환형식 메소드이름1(매개변수);
반환형식 메소드이름2(매개변수);
//……
}
interface Logger
{
void WriteLog(string log);
}
abstract class 클래스이름
{
//클래스와 동일하게 구현
}
abstract class AbstractBase
{
public abstract void Somemethod();
}
인터페이스
1.뼈대만 가진 클래스.
2.공용적으로 사용할 메소드, 속성 등을 기술.
3.아무 기능도 하지 않는 클래스.
4.인터페이스 내에서는 필드 – X.
5.메소드는 만들수 있지만,코드가 없다.
6.인터페이스는 상속도 가능, 다중 상속도 가능.
7.상속 받은 인터페이스의 멤버를 모두 구현하지
않으면 에러가 발생한다.
추상클래스
1.몸체 없는 함수를 하나라도 포함하는 클래스.
2.상속 받는 객체들의 행동을 표준화한다.
3.상속 관계에서의 일반 클래스 부모 위치한다.
4.몸체 없는 함수를 포함하고 있지 않아도 클래스를 선
언할때 abstract 포함.
5.추상 클래스는 객체를 생성 할 수 없다.
6.추상 함수는 자동으로 가상함수.
7.부분 구현이 가능하다.
추상메소드
1.몸체 없는 함수.
2.프로토타입만 가지고 있다.
3.구현부 –X / 시그니처만 갖는다.
4.파생 클래스에서 반드시 구현하여야 한다.
class Myclass{
private int myfield;
public int myfield{
get{ return myfield; }
set{ myfield = value; }
}
}
public class namecard{
public string name{
get; set;
}
}
birth b = new birth()
{
name = “나”
birthday = new dt(1991, 6, 28)
};
프로퍼티:get{…}와 set{…}을 사용, get 접근자는
필드로 부터 값을 읽어 온다, set 접근자는 필드
에 값을 할당한다.
자동 구현 프로퍼티: 필드를 읽고 쓰기만 하
는 아무 논리도 섞여 있지 않은 경우, 코드를
더 단순하게 만드는 프로퍼티 방식, get과 set
접근자 뒤에 세미콜론(;)만 붙이면 된다.
프로퍼티를 이용한 초기화:객체를 생성할때
목록에 객체의 모든 프로퍼티가 올 필요 없
이 초기화 하고 싶은 프로퍼티만 넣어서 초
기화 하면 된다.
무명형식:형식의 선언과 동시에 인스턴스를
var myin = new{name=“박상현”, age=“17”}; 할당, 주의할 점은 무명 형식의 프로퍼티에
할당된 값은 변경 불가
interface iname{
string name{
get; set;
}
}
abstract class product{
abstract public date{
get; set;
}
}
인터페이스의 프로퍼티:인터페이스안은 틀만,
상속받은 클래스에서 get,set 구현을 한다
추상클래스의 프로퍼티:파생클래스에서 추상 프
로퍼티를 재정의 하여야 한다.
배열:동일한 타입의 자료를 묶음으로 처리할 떄 유용한 자료구조
데이터형식[] 배열이름 = new 데이터형식[ 용량];
int[] array = new int[3]{1,2,3};
int[] array = new int[]{1,2,3};
int[] array ={1, 2, 3};
int[] array = new int[5];
배열의 초기화 방법
1.배열의 용량 명시 뒤의 중괄호에 데이터를 입력
2.배열의 용량 명시 생략 뒤의 중괄호에 데이터를 입력
3.new, 형식, 괄호, 배열의 용량 모두 생략, 블록사이에 배열
의 각원소에 할당할 데이터를 입력
2차원배열:(세로+가로)으로 원소를 배치하는 2차원 배열이다, 배열을 선언과 동시에 초기화하는 방
법은 위의 초기화 방법과 동일 하다
int[ , ] arr = new int[2, 3]{ {1, 2, 3}, {4, 5, 6} };
다차원배열:차원이 둘 이상인 배열을 말한다, 2차원 배열도 다차원 배열에 해당한다, 선언하는 문법
은 2차원 배열과 같다 다만 차원이 늘어 날수록 요소에 접근할 때 사용하는 인덱스의 수가 증가하
는 점만 다르다.
int[ , ,] array = new int[2, 3 ,2]{ {1,2}, {3,4}, {5,6}
{1,4}, {2,5}, {3,6} };
가변배열:다양한 차원과 크기를 가질수 있도록 구조화 할 수 있다.
int[ ] [ ] jaggged = new int [3] [ ];
jagged[0] = new int[5] {1,2,3,4,5};
jagged[1] = new int[]{10,20,30};
jagged[2] = new int[]{100, 200};
컬렉션:같은 성격을 띠는 데이터의 모음을 담는 자료 구조
ArrayList list = new ArrayList();
ArrayList:크기에 필요에 따라 동적으로 생성되는 배열
list.add(10);
list.add(20);
Queue que = new Queue();
que.enqueue(1);
que.enqueue(2);
Stack stack = new Stack();
stack.push(1);
stack.push(2);
Queue:FIFO의 방식으로 작업을 차례대로 입력해 뒀다
가 순서대로 하나씩 꺼내 처리하기 위해 사용
Stack:LIFO의 방식으로 나중에 들어온 데이터가 먼
저나가는 자료구조
Hashtable ht = new Hashtable();
ht[“book”] = “책”;
ht[“cook”] = “요리사”;
Hashtable:키와 값의 쌍으로 이루어진 데이터를 다룰
때 사용하는 구조
int[] array = new int[5];
public int this[int index]{
get{ return array[index]; }
set{ array[i]=value; }
}
인덱서:객체를 배열처럼 사용할 수 있게 하는 닷넷 언어적
기능 메소드의 일종으로, 클래스안에 배열이나 컬렉션과
같이 복합 값이 있을 경우 유용하게 사용 , 인덱서는 this
키워드를 통해 구현한다.
foreach가 가능한 객체 만들기 : foreach 구문은 Ienumerable와 Ienumerator를 상속하는 형식만 지
원한다 즉 이 인터페이스를 상속하면 foreach문을 사용하여 순회할수 있다.
일반화 프로그래밍:타입 인수를 사용하여 일반화된 클래스나 메소드를 정의하는 기법
일반화 메소드:일반화한 메소드, 구체적인 형식의 이름 대신 형식 매개 변수가 들어간다
void copyArray( T[ ] source, T[ ] target){
for(int i = 0; i < source.Length; i++)
데이터 형식이 사용된 부분을 T기호로 치환
targer[i] = source[i];
}
일반화 클래스:일반화한 클래스, 형식 매개 변수가 있는 클래스
class Array_Generic< T >
{
private T[] array;
public T GetElement(int index) { return array[index]; }
}
형식 매개 변수 제약:특정 조건을 갖춘 형식에만 대응하는 형식 매개 변수
Class List<T> where T : struct
{
//
}
제약
설명
where T : struct
T는 값 형식
where T : class
T는 참조 형식
where T : new()
T는 매개 변수가 없는 생성자가 있어야 함
where T : 인터페이스_
이름
T는 명시한 인터페이스를 반드시 구현해야
한다, 여러 개의 인터페이스를 명시할 수도
있다.
where T : U
T는 또 다른 형식 매개 변수 U로부터 상속받
은 클래스 여야 한다.
where T : 기반_클래스_
이름
T는 명시한 기반 클래스의 파생클래스여야
한다.
일반화 컬렉션:앞에서 소개한 컬렉션의 종류에 일반화 한것으로 일반화의 사용으로 형식의 안정성,
명료한 코드, 수행성능의 향상을 기대 할 수 있다.
List<int> list = new Lint<int>();
List<T>:비일반화 클래스인 ArrayList와 같은 기능,
인스턴스를 만들 때 형식 매개 변수를 필요로 하고
형식 매개 변수로 입력한 형식 외에는 입력을 허용
하지 않는다.
Queue<int> que = new Queue<int>();
Queue<T>:형식 매개 변수를 요구하는 점을 제외
한 비일반화 클래스인 Queue와 동일
Stack<int> stack = new Stack<int>();
Stack<T>: 형식 매개 변수를 요구하는 점을 제
회안 비일반화 클래스인 Stack와 동일
Dictionary<string, string>dic = new
Dictionary<string, string>();
Dictionary<Tkey, Tvalue>:형식 매개 변수를 두
개를 요구한다, Hashtable의 일반화 버전
foreach를 사용할 수 있는 일반화 클래스:
앞서 말한 foreach문을 사용하는 클래스를 만들기 위해 IEnumerator 와 IEnumerable를 일반화 버
전인 IEnumerator<T>와 IEnumerable<T> 이 두 인터페이스를 상속 받으면 된다.
예외:프로그래머가 생각하는 시나리오에서 벗어나는 사건
예외처리:예외가 프로그램의 오류나 다운으로 이어지지 않도록 적절하게 처리하는 것
static void something(int arg){
try{
int (arg < 10)
Console.WriteLine(“arg : {0}”, arg);
else
throw new Exception(“arg가 10보다 큼”);
}
예외던지기
catch(Exception e){
Console.WriteLine(“예외발생 :{0}”, e.Message);
}
finally{
Console.WriteLine(“프로그램 종료”);
}
}
}
try~catch문:try 절에서 실행 하고자 했던
코드를 처리하다가 예외가 발생하면
catch 블록이 받아낸다, catch 블록은 여러
개를 둘 수 있다.
예외던지기:throw 문을 이용해서 예외
를 넘겨준다.
finally:try~catch문의 제일 마지막에 연결
해서 사용, finally 절은 어떤 경우에라도
실행이 된다.
사용자 정의 예외 클래스:
Class InvalidArgumentExcrption : Exception{
public Invalid ArgumentException(){
}
public Invalid ArgumentException(string message) : base(message){
}
////////////////////
}
모든 예외 객체는
System.Exception 클래스
로부터 파생되어야 한다
즉, Exception 클래스를
상속하기만 하면 새로운
예외 클래스를 만들수 있
다.
델리게이트:메소드를 가르키는 참조형, 메소드의 번지를 저장하거나 다른 메소드의 인수로 메소드
자체를 전달하고 싶을때 사용
namespace Delegate{
delegate int MyDelegate(int a, int b);
class Calculator{
public int plus(int a, int b){
return a+b;
}
}
plus()호출
class MainApp{
static void Main(string[] args){
Calculator c = new Calculator();
MyDelegate Callback;
Callback = new MyDelegate(c.plus);
Console.WriteLine( Callback(3, 4) );
}
}
}
Callback
호출
메소드
호출시도
델리게이트
호출자
실행 및 실행 결과
델리게이트를 이용하여 콜백을 구현하는 과정
1.델리게이트를 선언한다.
2.델리게이트의 인스턴스를 생성한다. 인스턴스를 생성할 때는 델리게이트가 참조할 메
소드를 매개 변수로 넘긴다.
3.델리게이트를 호출한다.
일반화 델리게이트:일반화 메소드를 참조할 수 있도록 형식 매개 변수를 이용하여 선언하는 델리게
이트
delegate int Compare<T>(T a, T, b);
delegate 키워드만 빼면 일반화 메소드의 선언과 같다
static void BubbleSort<T>( T[ ] DataSet, Compare<T> Comparer){
int i, j =0;
T temp;
for (i = 0; i < DataSet.Length – 1; i++){
///////////////
델리게이트 체인:여러 개의 콜백을 동시에 호출해야 할 때 사용
+,=,연산자나 Delegate.Combine()메소드를 이용해 만든다, 특정 델리게이트를 끊어낼때는 -,= 을
사용하거나 , Delegate.Remove()메소드를 이용하는 방법이있다.
delegate void Fire(string location);
void call119(string location){///}
void shotout(string location){///}
void escape(string location){///}
Fire f = new Fire(call119);
f += new Fire(shotout);
f += new Fire(escape);
익명 메소드:내용을 정확히 알 수 없어도 메소드의 역할을 할 수 있도록 해 주는 간결성의 장점을
살린 개념의 메소드, 익명 메소드는 자신을 참조할 델리게이트의 형식과 동일한 형식으로 선언.
delegate int Calculate(int a , int b);
Public static void Main(){
Calculate Calc;
}
이름을 제외한 메소드의 구현
(익명 메소드 부분)
Calc = deledate (int a , int b){
return a + b;
}
Calc를 호출하면 이 코드를 실행한다.
Console.WriteLine(“3 + 4 : {0}”, Calc(3, 4));
이벤트:어떤 사건이 발생 했을 때 호출 되어야 하는 메소드의 목록
이벤트에 의해 호출되는 메소드를 특별히 이벤트 핸들러라고 부른다.
이벤트는 public 한정자로 선언되어도 클래스 외부에서는 호출이 불가능, 하지만 델리
게이트의 이벤트는 public,internal로 수식되어 있으면 클래스 외부에서도 호출이 가능
델리게이트선언
class mytest{
public delegate void test() ;’
public event test t ;
public void stop(){
if(t != null){
t();
}
}
델리게이
트를 이용
한 event
의 인스턴
스 생성
void value(){
//value ->0
}
mytest mt = new mytest();
mt.t += value;
mt.stop();
이벤트를 연결
람다식:익명 함수식이라고 불리며, 델리게이트 함수, 이벤트 함수, 특정 추상 클래스 함수에서 쓰인
다.
매개_변수_목록 => 식
delegate int Calculate(int a, int b);
//.
..
static void Main(string[] args){
Calculate clac = (int a, int b) => a+b;
}
익명 메소드를 만들려면 델리게이트 필요
두 개의 int형식 매개변수를 받아 둘을 더해
반환하는 익명 메소드를 람다식으로 만듬
C# 컴파일러는 형식 유추라는 기능을 제공한다.
delegate int Calculate(int a, int b);
////
Static void Main(string[] args){
calculate calc = (a, b) => a + b;
c# 컴파일러는 이 람다식이 만드는 익명 메소드의
}
매개 변수의 형식을 유추해 낸다.
문 형식의 람다식: => 연산자의 오른편에 식 대신 중괄호로 둘러싸인 코드블록이 위치
(매개_변수_목록) => {
Dosomething DoIt = ( ) => {
문장1;
Console.WriteLine(“1”);
문장2;
Console.WriteLine(“2”);
문장3; //////
};
문장 형식의 람다식은 중괄호로 둘러
}
싼다.
Func 델리게이트:일종의 일반화를 적용한 대리자, 람다식과 같이 많이 쓰임
public delegate TResult Func<out TResult>()
.NET Framework에는 모두 17가지 버전
public delegate TResult Func<in T, out TResult>(T arg)
의 Func 델리게이트가 준비되어 있다.
//////////////////////////////
Public delegate TResult Func<in T1, in T2, in T3, ….. Out TResult>(T1 arg1, T2 arg2….T16 arg16)
Func 델리게이트의 형식 매개 변수 중 가장 마지막에 있는 것이 반환 형식이다.
Func<int> func1 = () => 10;
//입력 매개 변수 없음, 무조건 10을 반환
Func<int, int> func2 = (x) => x*2; // 입력 매개 변수는 int 형식 하나 반환 형식도 int
Console.WriteLine(func2(3);)
// 6을 출력
Action 델리게이트: Func 델리게이트와 거의 유사, 차이점은 반환 형식이 없다는 것
Action<int> act2 = (x) => result = x * x; //람다식 밖에서 선언한 result에 x*x의 결과를 저장
Action<double, double> act3 = (x, y) =>{
double pi = x / y ;
Console.WriteLine(“Action<T1, T2>({0}, {1}) : {2}”, x, y, pi);
};
act3(22.0, 7.0);
//매개 변수가 두개인 Action의 사용
식 트리:
● 트리로 표현한 자료 구조, 한 부모 노드가 단 두 개만의 자식 노드를 가질 수 있는 이진트리
●
연산자는 부모노드가 되며 피연산자는 자식 노드가 된다.
●
컴파일러나 인터프리터를 제작하는 데에도 응용된다.
●
식 트리는 코드를 “데이터”로써 보관할 수 있다.
●
데이터베이스 처리를 위한 식 트리는 LINQ에서 사용 된다.
링크(LINQ):Language Integrated Query의 약어로 C# 언어에 통합된 데이터 질의기능
질의(Query)=From: 어떤 데이터 집합에서 찾을 것인가?
Where: 어떤 값의 데이터를 찾을 것인가?
Select: 어떤 항목을 추출할 것인가?
Profile[ ] arrProfile={
new Profile() { Name=“정우성“,
new Profile() { Name=“김태희“,
new Profile() { Name=“고현정“,
new Profile() { Name=“이문세“,
new Profile() { Name=“하동훈“,
};
Height=186},
Height=158},
Height=172},
Height=178},
Height=171}
var profiles=from profile in arrprofile
where profile.Height < 175
orderby profile.Height
select profile;
from: LINQ 쿼리식의 시작, 데이터 원본과 데이터 원본 안에 들어있는 각 요소 데이터를 범위 변수에 지
정, from의 데이터 원본은 IEnumerable<T> 인터페이스를 상속하는 형식만 사용.
where: 필터 역할을 하는 연산자, 데이터 원본으로부터 뽑아낸 범위 변수가 가져야 하는 조건.
orderby:데이터의 정렬을 수행하는 연산자, 기본적으로 오름차순으로 정렬한다.
select : 최종 결과를 추출하는 쿼리식의 마침표와 같은 역할, LINQ 질의 결과는 IEnumerable<T>로 반환
되는데 이 때 형식 매개 변수 T는 select문에 의해 결정 된다, 또한 무명 형식을 이용해서 새로운 형식을
즉석에서 만들어 낼수도 있다.
Var classes from c in arrClass
여러 개의 데이터 원본 접근:
from s in c.Score
from문을 중첩해서 사용하면 된다.
첫 번째 데이터 원본
where s < 60
두 번째 데이터 원본
select new { c.Name, Lowest = s};
group by: 데이터를 분류 기준에 따라 데이터를 그룹화 해주는 기능
group A by B into C , A에는 from절에서 뽑아낸 범위 변수, B에는 분류 기준, C에는 그룹 변수
Profile[ ] arrProfile ={
new Profile() { Name=“정우성“, Height=186},
new Profile() { Name=“김태희“, Height=158},
new Profile() { Name=“고현정“, Height=172}
};
var listprofile = from profile in arrProfile
group profile by profile.Height < 175 into g
select new { GroupKey = g.Key, Profiles = g };
그룹 변수 g에는 Height 값이 175 미만인 객체의 컬렉션과 175이상인 객체의 컬렉션이 입력 된다.
select 의 무명 형식은 컬렉션의 컬렉션이 되고 무명 형식의 Profiles 필드는 바로 이 그룹 변수 g를
담게 된다.
내부 조인(Inner Join):첫 번째 데이터 원본의 데이터를 기준으로 해서 이 데이터의 특정 필드와 두
번째 데이터 원본이 갖고 있는 각 데이터의 특정 필드를 비교해서 일치하는 데이터들만 반환.
From a in A
Join b in B on a.XXXX equals b.YYYY
from 절에서 뽑아낸 범위 변수 a
join이라는 내부 조인 절을 통해 b라는 연결 대상 데
터를 뽑고 on 절의 조건은 오직 동등(Equality)만 허용
외부 조인(Outer Join):내부 조인과 비슷하지만 조인 결과에 기준이 되는 데이터 원본은 모두 다 포
함 된다(기준이 되는 데이터 원본의 모든 데이터를 조인 결과게 넣는다, 연결할 데이터 원본에 기준
데이터 원본의 데이터와 일치하는 데이터가 없다면 그 부분은 빈 값으로 결과를 채운다.
From profile in arrProfile
Join product in arrProduct on profile.Name equals product.Star into ps
From product in ps.DefaultIfEmpty(new Product(){Title=“그런거 없음“})
Join 절을 이용해서 조인을 수행한 후 그 결과를 임시 컬렉션에 저장, 이 임시 컬렉션에 대해
DefaultIfEmpty 연산을 수행해서 비어 있는 조인 결과에 빈값을 채워 넣음
Where(), OrderBy(), Select()등의 메소드는 IEnumerable<T>의 확장 메소드이기 때문에 이들을 사
용하려면 System.Linq 네임스페이스를 사용하도록 선언을 해야한다.
C#의 쿼리식에서 지원하는 LINQ 연산 메소드
종류
정렬
메소드 이름
설명
C#쿼리식 문법
OrderBy
오름차순으로 값을 정렬
orderby
OrderByDescending
내림차순으로 값을 정렬
orderby…descending
ThenBy
오름차순으로 2차 정렬
orderby …, …
ThenByDescending
내림차순으로 2차 정렬
orderby…, … descending
필터링
Where
필터링할 조건을 평가하는 함수를 통과하는
값들만 추출
where
데이터
추출
Select
값을 추출하여 시퀀스를 만듬
Select
SelectMany
여러 개의 데이터 원본으로부터 값을 추출
하여 하나의 시퀀스를 만듬 여러 개의 from
절을 사용
Join
공통 특성을 가진 서로 다른 두 개의 데이터
소스의 객체를 연결, 공통 특성을 키로 삼아
키가 일치하는 두 객체를 쌍으로 추출
join… in… on…
equals…
GroupJoin
Join연산자와 같은 일을 하되 조인 결과를
그룹으로 만들어 넣음
join… in… on…
Equals… into…
데이터
그룹화
GroupBy
공통된 특성을 공유하는 요소들을 각 그룹
으로 묶음
Group … by 또는
Group … by … into …
형식
변환
Cast
컬렉션의 요소들을 특정 형식으로 변환
범위 변수를 선언할 때 명시
적으로 형식을 지정 하면 됨
from profile profile in
arrprofile
데이터
결합