-
C# 간단정리Programming/C# 2014. 3. 26. 16:33
C# 간단정리
2004/05/20 19:48
출처: http://blog.naver.com/wonhotoss/100002615072
변수
열거형-사용자가 정의한 일련의 이산적인 겂들을 가진 변수 형식, 숫자 대신 사람이 좀더 읽기 쉬운 상수들을 효율적으로 사용하기 위한것
구조체-다른 변수 형식들을 하나로 조직화하는 복합 변수 형식
배열-한 형식의 값들을 여러 개 담을 수 잇는 형식 (색인을 통해서 개별 값들에 접근한다.)명시적 변환
속성-구성속성-빌드-산술연산오버플로/언더플로확인 : 이것을 True로 바꾸면 unchecked를 명시적으로 지정하지 않는한모든 표신식에서 오버플로 점검한다.
. Convert.ToBoolean(val), Convert.ToByte(val), Convert.ToChar(val), Convert.ToDecimal(val), Convert.ToDouble(val)
Convert.ToInt32(val) - int로 변환문자열조작
"<string>.TrimStart() : 문자열의 앞이나 뒤 중 한 쪽의 빈칸들만 제거하려 할 때
<string>.TrimEnd()"
"<string>.PadLeft() : 문자열 앞.뒤에 추가적인 빈칸들을 채우는 명령
<string>.PadRight()"
<string>.Split() : 하나의 문자열을 구분 문자들을 기준으로 나워서 string배열로 만들어준다.(기준이 되는 구분문자는 char배열로지정)변수의Default값
정수타입 :0
부동소수 타입:0.0
char : null문자(\u0000)
decimal :0.0
bool :false조건문
<< IF 문의 형식 >>
if(조건식)
문장
else
문장
---------------------
if(조건식){
문장
}else{
문장
}<< switch문의 형식 >>
switch(표현식)
{
case constant1:
명령문
break;
case constant2:
명령문
break;
default:
명령문
break;
}반복문
<< while문의 형식> <<do while 문의 형식>>
while(조건식){문장} do{문장}
while(조건식);private사용하는 이유
1. 클래스 내부에서만 사용하기 위해서
2. 외부에서 들어오는 데이터라 할지라고 직접적인 할당보다는 간접적으로 할당하기 위해서new
Family sister = new Family()의 분석
Family : 클래스로 생성한 데이터 타입
sister : Family 데이터타입으로 선언한 변수
new : 메모리를 생성하는 연산자
Family() : 메모리 생성 후 초기화 작업을 담당하는 생성자
=> 클래스를 이용하여 만든 변수를 다른 변수들과 구분하기 위해Object또는Instance라는 용어를 사용
ref와 out키워드
ref : 참조할 변수는 반드시 초기화되어 있어야 한다.
out : 참조할 변수가 반드시 초기화될 필요는 없다.<상수>
const 키워드. 상수를 선언하는 키워드
. Const로 선언한 변수는 반드시 초기화 되어야 한다. - 초기화되어 있지 않다면 한번 설정되면 바꿀수 없다는 상수의 법칙에 위배
. Const는 자동으로 static 이 된다.<상수>
readonly키워드. Static 키워드를 사용하면 static 상수가 된다. 사용하지 않으면 일반 상수가 된다.
. 반드시 초기화 할 필요는 없다.
. Static readonly일 경우 스태틱 생성자에서 초기화할 수 있다.(횟수제한-> 한번만 가능)
- 상수의 기본 성질인 중복해서 값을 설정할 수 없다는 것이 포인트
. 일반 readonly일 경우 생성자에서 초기화 할 수 있다.
. Static readonly일 경우 클래스의 이름으로 접근가능
. 일반 readonly일 경우 객체의 이름으로 접근가능static
static으로 선언된 필드나 메서드는 스태틱이라고 하는 특수한 메모리 영역에 단 하나의 메모리가 생성되기 때문에 클래스 전체에
공유가능
스태틱 특성상 객체를 생성하지 않고 클래스의 이름으로 해당 상수에 바로 접근가능하다.열거형
(Enum/Enumeration)
. 이름을 가지는 정적 정수형 상수이다.
. 상수이므로 값이 한번 설정되면 변경할 수 없다.
. 열거형의 멘버들의 초기값은 0부터 자동으로 1씩 증가한다. 만약 중간에 임의의 값이 설정된 곳부터는 해당 값을 1씩 증가시켜 할당
(순차적인 숫자 값을 가져올 경우 현변환 필수겠죠)
. 열거형에서 사용할 수 있는 형 =><< byte, sbyte, short, ushort, int, unit, long, ulong >>네임스페이스와어셈블리
. 진입점을 포함하는 형태의 실행파일(.exe)
. 진입점을 포함하지 않는 라이브러리 형태의 파일(.dll)
. [참고]exe나 dll 은 모두 중간언어(IL) 형태로 되어 있다.Main()메서드의 특징
. 프로그램의 시작점이다.
. Main() 메서드가 끝나면 프로그램은 종료한다.
. 반환형은 void나 int 둘 중의 하나이어야 한다.
. Main() 메서드에서 객체를 생성하거나 다른 메서드를 호출할 수 있다.
. 명령프롬프트 상의 매개변수를 읽기 위해서 string배열을 사용한다.Static 멤버필드
. 모든 클래스에서 공유하기 위한 멤버를 선언하는 데 사용
. 변수, 메서드, 속성,연산자 및 생성자에 사용할 수 있음
. 인덱서 , 소멸자에는 사용할 수는 없음
. 클래스 내의 모든 곳에서 사용할 수 있는 공유변수Static 멤버메서드
. Public static 메서드일 경우 객체를 생성하지 않고 클래스의 이름으로 접근가능
. 객체를 생성하지 않고도 사용할 수 있는 공유 메서드
. 스태틱 메서드를 이용하여 일반 멤버필드에 접근 불가
. 일반 멤버필드는 객체 생성 후에 존재하기 때문에 스태틱 메서드에서는 접근 불가Main()메서드가
static인 이유C#에서는 Main()메서드를 실행할때 CLR 에서 실행 클래스의 객체가 생성되기 전에 접근해야 하기 때문에 스태틱으로 선언
오버로딩(Overloading)
. 하나의 클래스 내에서 동일한 이름을 가진 여러 개의 메서드
. 메서드들의 구별은 메서드의 매개변수의 개수와 매개변수의 형에 의행서 구분
. 리턴타입(Return Type)으로는 구별하지 않는다.오버로딩규칙
. 매개변수의 개수가 달라야 한다.
. 매개변수의 타입이 달라야 한다.
. 위의 개수와 다입중 하나만 달라도 오브로딩의 조건이 성립된다.
. 메서드이 리턴타입은 오버로딩을 구분할 때 사용하지 않는다.상속(Inheritance)
. 계층구조 형태로 클래스들을 생성시키는 방법
. 상위클래스를 기본 클래스라고 하며 하위클래스를 파생클래스라고 한다.
. 상속을 하면 상위클래스의 능력을 하위클래스에서 모두 이용할 수 있다.
Inheritance특징
. 생성자는상속되지 않고 하위클래스의 객체가 만들어질 때 상위클래스의 생성자가 자동으로 호출된다.
. 클래스는 중복상속할 수 없으며 단일 상속만 가능하다.sealed키워드
. Sealed키워드는 클래스로부터의 상속을 막을 때 사용
Constructor의 특징
. 생성자는 리턴타입(Returm Type)이 없다.
- ( 이유 : new 연산자가 메모리를 생성한 후 해당 메모리의 참조값을 객체변수에게 리턴해 버리기 때문에 생성자는 리턴이 없고 초기화만 담당 )
. 생성자의 이름은 클래스의 이름과 동일하다
. New 연산자가 힙(Heap)영역에 해당 클래스의 메모리를 생성한 직후 호출된다.
. 생성자는 말 그대로 객체가 생성될 때 호출되는 메서드입니다. 객체를 생성하는 순간에 함께 함께 호출될 수 있다는 장점이 있다.
소멸자(Destructor)
. 객체가 소멸되기 전에 호출되어 객체에 부여된 메모리의 회수를 담당
. 실제적으로 메모리의 호수 여부는 Garbage Collector가 담당한다.
. 매개변수와 접근 제한자를 가질 수 없다.<< 4.9 protected 접근자 >>
디자인타임의접근문제
상속받아서 코딩하고 있는 순간, 상속을 받아서 하나의 새로운 클래스를 제작하고 있는 순간,
하위클래스 입장에서 상위 클래스의 접근 문제를 다룬다.상속 관계에서의 private
. 상위클래스를 상속받은 하위클래서 내에서 상위클래스의 private멤버필드에 직접 접근할 수 없다.
. 어떠한 경우라도 private이면 public메서드를 통해서만 접근 가능하다.상속 관계에서의
protected. 아버지의 protected 멤버는 실행타임에선 private이면서 아들에게는 완전한 public이 된다.
-모든 면에서 private을 수행하면서 상속의 관계에서만 public의 행위를 하는 것이 바로 protected 이다.Internal접근자
. Private과 public의 중간 형태로 한의 Assembly 내에서만 접근을 허락하는 접근자
. 같은 어셈블리(즉 같은 프로그램 내) 안에 있어야 접근 가능하다.메서드 재정의 종류
. new 키워드를 이용한 재정의
. Virtual, override 키워드를 이용한 재정의Upcasting(업케스팅)
. 정의 - 하위 클래스의 객체를 상위클래스의 객체로 형변환한 것
. New 키워드를 이용하여 메서드를 재정의한 후 업캐스팅 했을 때
- 업캐스팅 되었을 때 상위 클래스는 상위클래스 내의 메서드만을 호출한다.virtual,override,new의
관계. Virtual : 하위 클래스에서 재정의해서 사용할 것을 표시
. Override : 상위클래스에서 virtual로 표시된 메서드를 재정의할 때 사용
. New : 상위클래스의 메서드를 완전히 무시할 대 사용this를사용하는 곳
. 자신을 참조하는 this를 이용하여 멤버를 이용할 수 있다.
. 디자인타임에 자기 자신을 직접 참조할 수 있는 참조변수이다.
. 디자인타임에 자기 자신을 참조할 수 있는 유일한 키워드이다.
- 디자인타임에 하나의 이름으로 자시능ㄹ 참조하고 실행 타임에서는 각각에 적용this.멤버
. 지금은 클래스 내부의 this이지만 언젠가 생성될 내 메롬리의 this라고 해석할 수 있다.
즉 , 언젠가 생성될 메모리의 참조값이 되는 것입니다.자신의 멤버를
가르키는 this. 메서드의 매개변수와 클래스의 멤버필드를 구분해 주어야 할 때 사용
. This키워드를 사용하지 않아도 무방this()
. 자신의 생성자를 호출할 때도 사용
. 자신의 생성자를 재사용하기 위새서 생성자를 호출하는 방법을 제공base() 키워드
. 디자인타임에 아버지를 참조하는 유일한 참조변수이다.
. 무시당한 아버지클래스의 메서드를 사용하고 싶을 때 사용한다.
. 아버지 생성자에 매개변수가 존재한다면 생성자의 매개변수의 형과 개수를 맞추어 주어야한 호출이 가능
. 생성자 내에서 아버지 생성자를 호출하기 위해 사용Boxing // UnBoxing
. 박싱(Boxing) : 값타입을 참조타입으로 변환하는 기법
. 언박싱(UnBoxing) : 참조타입을 값타입으로 변환하는 기법
Boxing의 순서
. 값타입 변수를 객체화하기 위한 메모리를 Heap영역에 생성한다. 이공간을 Box라고 한다.
. P 에 있는 값을 Heap에 생성한 Box로 복사
. 참조타입 변수 o에 Box의 참조값을 할당
예> int p = 123;
object o = pUnBoxing의 순서
. 해당 객체가 지정한 값타입을 Boxing한 값인지 확인
. 박싱된 객체라면 객체의 값을 값타입 변수에 복사한다.
. Boxing한 메모리와 UnBoxing한 메모리 두 개가 존재한다.추상클래스가 되는 방법
. 몸체가 없는( 메서드의 구현부가 없다는 뜻) 메서드를 하나라도 포함하고 있는 클래스
. 몸체없는 메서드를 포함하고 잇지 않더라도 클래스를 선언할 때 abstract 키워드를 포함하고 있는 경우
< 추상메서드는 묵시적으로 virtual메서드이다.>Abstract Class
(추상클래스)추상클래스는 객체가 가지는 특성들을 추상화시켜 놓고 구체적인 구현은 이 추상클래스를 상속받는 파생클래스에서 하도록 한것
. Abstract 키워드를 사용
. 몸체없는 추상메서드를 하나라도 포함하고 있으면 추상클래스가 된다.
. 추상클래스가 되면 반드시 클래서 선언부에 abstract 키워드를 명시해야 한다.
. 클래스를 선언할 때 클래스 앞에 abstract 키워드를 사용하면 추상메서드를 포함하고 있지 않아도 추상클래스가 된다.ㅋ
. 추상클래스는 객체(인스턴스)를 생성할 수 없다.
. 추상메서드는 묵시적으로 가상메서드(Virtual Method)가 된다.
. 추상메서드는 virtual키워드를 사용하지 않지만 자동으로 virtual이 된다.Abstract Method
(추상메서드). 몸체가 없는, 몸뚱이가 없는 메서드
. 프로토타입(Prototype)만 가지고 있음
virtual키워드가 디폴트로 포함되어 있음Interface의 구성요소
/특징Method, Property, Event, Indexer
. 인터페이스 내의 멤버는 모두 몸체가 없다.
. 인터페이스의 멤버는 디폴트로 전부 public이다.
. 내부에 필드를 가질 수 없다.
. 멤버에 어떠한 접근자, 한정자도 붙이지 않는다.Interface의 멤버가
public인 이유. 인터페이스를 하위클래서에서 구현하기 위해서는 최소한 하위클래서에서 접근할 수 있어야 하며
인터페이스로 외부에서 작업하기 위해서는 인터페이스의 멤버는 기본적으로 public이어야 한다.
- 인터페이스내의 멤버 앞에 abstract, public, protected, internal, private, virtual, override, static과 같은 키워드들 사용못함Interface 메서드
구현 주의사항. 인터페이스 멤버의 접근지정자는 자동으로 public이 된다 때문에 구현하는 클래스에서도 이와 일치시키기 위해 public을 명시
클래스의 멤버는 접근지정자가 명시된지 않으면 private으로 지정된다. Public void a(){…}
. 그러나 명시적으로(상속받은 인터페이스네 같은 이름의 메서드가 존재시) 구현한 메서드는 접근 지정자를 붙이지 않는다.override
. 추상클래스와 인터페이스의 추상메서는 모두 가상(virtual)메서드이 성질을 가지고 있습니다. 하지만 추상클래스내의
추상메서드를 재정의할 때에는 override 키워드를 사용하여 메서드를 재정의하지만 인터페이스 내의 추상메서드를 재정의할
때에는 override키워드를 사용하지 않습니다.추상클래스와
인터페이스의 공통점. 스스로 객체를 생성할 수 없다.
. Upcasting이 가능하다.
. 모든 추상 멤버를 구현해야 한다.
. 추상클래스와 인터페이스의 추상메서드는 virtual(가상)메서드이다.추상클래스와
인터페이스의 차이점. 인터페이스는 멤버의 접근지정자를 선언할 수 없다.
. 추상클래스 내의 멤버에 접근지정자를 사용해서 선언할 수 있다.
. 인터페이스는 인터페이스들 끼리의 상속과 중복구현이 가능하다.
. 추상클래스는 클래스이기 때무에 단일 상속을 원칙으로 한다.
. 인터페이스는 일반적인 멤버필드를 포함할 수 없다.
. 추상클래스는 일반적인 멤버필드나 멤버메서드를포함할 수 있다.
. 인터페이스는 멤버를 abstract키워드로 선언할 수 없다.
. 추상클래스에서 추상메서드는 abstract키워드로 명시해야 한다.
. 인터페이스의 추상메서드는 구현할 때 override를 사용하지 않지만 추상클래스에서는 override르르 사용하여 재정의 한다.메서드 재정의에서의
업캐스팅(Upcasting). New 키워드를 이용한 메서드 재정의에서 나타나는 업캐스팅
- 업캐스팅된 상위클래스의 객체는 상위 클래스 내의 메서드만을 호출한다.
- 아들의 몸체지만 아버지의 이름이라면 아버지의 메서드만 호출할 수 있다.
. Virtual 키워드를 이용한 메서드 재정의에서 나타나는 업캐스팅
- 상위클래스의 이름으로 메서드를 호출했을 때 해당 메서드가 재정의되어 있을 경우에만 하위클래스의 메서드를 호출할 수 있다.
- 아들의 몸체지만 아버지의 이름으로 아들의 메서드를 호출한다.
Delegate정의
. 메서드의 대리자
. 메서드를 보다 효율적으로 사용하기 위하여 특정 메서드 자체를 캡슐화할 수 있게 만들어 주는 방법배열의 분류
. Value Type의 배열
. Object 배열배열의 특징
. 같은 데이터 타입의 변수를 한꺼번에 여러 개 생성할 수 있다.
. 배열의 크기는 배역의 첨자(index)로 결정된다.
. 첨자에 해당하는 만큼의 같은 데이터타입을 가진 메모리가 생성된다.
. 배열의 메모리는 연속적으로 잡히게 된다.
. 배열은 참조값(ReferenceValue)을 잉ㅇ하여 핸들링할 수 있다.
. 배열의 이름은 연속된 변수들을 참조하기 위한 참조값이다.
. 배열의 요소는 변수이다.
. 배열은 객체다.배열의 선언
데이터형[] 변수명 = new 데이터형[첨자];
배열의 선언 및 초기화
예> 배열의 이름이 mydream이고 int형의 배열 요소를 10개 생성한다면
. 선언과 메모리 할당을 동시에 => int[] mydream = new int[10];
. 선언과 메모리 할당의 분리 => int[] mydream ;
mydream = new int[10];배열의 선언과
동시 초기화● int[] mydream = new int[]{100,200,300,400,500,600,700,800,900,999};
● int[] mydream = {100,200,300,400,500,600,700,800,900,999};값타입의 배열과
객체배열의 생성시 차이점. 값타입(Value Type)배열 => 배열 생성과 동시에 메모리 확보
. 객체(object)배열 , 참조타입(Reference type)배열 => 객체변수의 이름들만 생성할 뿐, 객체의 메모리는 생성되지 않음 .
- 객체변수의 참조값 자체를 위한 메로리만 확보, 배열 요소의 메모리는 따로 생성해 주어야 함.HashCode?
해시코드는 메모리가 생성될 때 객체에 부여되는 32bit 정수형으로 서로 다른 객체는 같은 해시코드를 부여 받을 수 없다.
따라서, 해시코드가 없다는 것은 아직 메모리가 생성되지 않았다는 것을 의미 결국, NullreferenceException이 발생2 차원 배열 초기화
int[,] myarray = new int[3,2]
2 차원배열선언과
동시초기화int[,] myarray = new int[,]{{1,2},{3,4},(5,6}};
int[,] myarray = {{1,2},{3,4},(5,6}};
참고> string[,] saRObjId = {{sObjId[i].ToString()},{"ContentsList"}};
=================================================================
using System;
class ArrayDemo
{
public static void Main()
{
string[] sid = {"a","b","c","d"}; //가변적으로 변화는 값이다
string[,] obj = new string[sid.Length,2];for (int i=0; i < sid.Length ; i++)
{
obj[i,0] = sid[i]; //**
obj[i,1] = "z"; //**for (int j=0; j < 2; j++)
Console.WriteLine("Element({0},{1})={2}", i, j, obj[i,j]);
}
}
}배열의 길이(Length)와
차원(Rank)의 수. 배열의 길이는 배열이름.Length로 나타낸다.
. 배열의 차원의 수는 배열이름.Rank로 나타낸다.System.Array클래스
. Public abstract class Array : Icloneable, Ilist, Icollection, Ienumerable
. 배열을 생성하고 지원하는 언어 구현의 기본적 클래스
. 배열은 기본적으로 Array클래스를 상속한다.Array클래스의
유용한 메서드. Array.Sort(배열) - 배열을 작은 순으로 정렬
. Array.Reverse(배열) - 배열을 큰 순으로 정렬
. Array.Clear(배열,0,5) - 0번째부터 5번째까지 6개를 0으로 초기화
. Array.IndexOf(배열,55) - 배열의 첫부터 검색하여 55가 있는 index의 위치를 반환
. Array.LastIndexOf(배열,5) - 배열의 끝에서부터 검색하여 처음으로 5가 있는 위치를 리턴Array클래스이 메서드
. 배열은 Array클래스를 상속받았기 때문에 Array클래스의 메서드들은 대부분static 메서드이기 때문에 클래스의
이름을 통해서만 접근할 수 있다.배열을 복사하는 방법
. Array.Copy() 메서드를 이용하는 방법 => 배열의 일부분 복사(부분 배열 복사)
. Clone() 메서드를 이용하는 방법 => 배열의 전체 복사 ( 배열의 메모리 차원의 복사)Array.Copy()메서드
. 원본과 복사본 배열 객체가 존재하고 있어야 한다.
. 주로 배열의 부분복사를 위해 사용된다.배열.Clone() 메서드
. 원본 배열의 메모리를 통째로 복사해 준다.
. Object형을 반환하므로 다운캐스팅(Downcasting)을 해주어야 한다.
foreach문
. Array이나 collection 내에 존재하는 각 요소들에 대해 접근할 수 있게 해주는 제어문
<< 형식 >> foreach(데이터타입 변수명 in 배열명){ 실행문장 }
. 데이터타입 : foreach 문 내부에서 사용될 반복변수의 형
. 반복변수 : 컬렉션 요소의 값을 반복적으로 얻어내는 변수
. 컬렉션식 : foreach 문을 실행시킬 배열이나, 컬렉션
foreach문 특징
. 메모리에 저장된 순서대로 요소 값이 호출됨
. 반복변수는 오직 읽기전용으로 사용
. 따라서, 반복변수를 사용한 배열요소의 데이터 값을 변경할 수는 없다.Array 객체 만들기
. System.Array.CreateInstance()메서드
- Array 클래스의 새 객체를 생성하는 메서드
- 스택틱(static) 메서드
. Array 클래스 객체 입출력
- SetValue(Object obj, int i) => 지정된 요소를 지정된 값에 출력(첫번째 매개변수: 저장할 데이터, 두번째매개변수: 인덱스)
- GetValue(int i) => 지정된 요소의 값 출력문자열
. 문자열은 System.String 클래스의 객체이다.
. 문자열은 문자상수의 집합니다.
. + 연산자를 사용하여 두 문자열을 연결하여 새로운 문자열을 생성한다.
. 특수문자를 문자 그대로 받아들일 때는 @를 사용한다.문자열 주요 메서드
. IndexOF() - 문자열을 첫 부분부터 검색하여 입력한 문자열을 제일 먼저 만나는 위치를 int로 반환
. LastindexOf() - 문자열을 마지막 부분부터 검색하여 입력한 문자열을 제일 먼저 만나는 위치를 int로 반환
. Replace(a,b) - 문자열에서 특정 문자(a)를 원하는 문자 (b) 로 치환한 문자열을 반환한다.
. Substring() - 문자열에서 지정된 위치에 있는 부분 문자열을 반환합니다.System.Text.StringBuilder
. Stringbuilder의 용량은 추가되는 데이터가 커지면 문자를 저장하는데 필요한 메모리를 자동으로 늘리기 때문에 동적으로
용량이 늘어난다.(기본용량 16)
. Public sealed class StringBuilder
. 문자열의 수정을 가능하게 하는 클래스Stringbuilder클래스의
메서드 및 속성. Append(데이터) - 지정된 문자열 표현을 StringBuilder 객체의 끝에 추가
. EnsureCapacity(int capacity) - 인스턴스의 용량을 최소한 지정된 값이 되도록 함
. ToString() - StringBuilder를 String으로 변환
. Capacity 속성 - 인스턴스의 요량을 지정하거나 반환
. Length 속성 - 인스턴스의 길이를 가져오거나 설정Collection류 클래스들의
특징. 켈렉션류 클래스들은 ㅅ형 메모리 데이터베이스의 기능인 수정, 삭제, 검색, 삽입 등의 기능을 함
. 동적으로 메모리 확장 가능컬렉션류 인터페이스의
특징. 인터페이스들은 컬렉션류 클래스들의 일관성과 사용상의 편리성을 제공
. 컬렉션 인터페이스들은 많은 컬렉션 클래스들 사이에 공통된 사용자 패턴을 정의IEnumerable
인터페이스의 메서드public interface IEnumberable{
IEnumerator GetEnumerator();
}IEnumerator속성
object Current - 컬렉션에서 현재 객체에 대한 참조(Element)를 반환하는 읽기전용 속성
IEnumerator 메서드
. Bool MoveNext();
- 열거자를 컬렉션의 다음 요소로 커서를 이동시킨다.
- 다음 요소가 존재하지 않는다면 false를 존재한다면 true를 리턴한다.
- 커서를 이동시킨 뒤 Current속성을 이용하여 데이터를 추출할 수 있다.
. Void Reset();
- Current 포인터를 컬렉션의 처음 부분 앞에 있는 정의하지 않은 값으로 다시 설정한다.
- Reset을 호출한 후 Current를 접근하기 전에 MoveNext()를 호출해야 한다. 이유는 처음에는 Current참조가 정의되어
있지 않기 때문이다.ICollection인터페이스
속성. Int Count -컬렉션의 객체 수를 반환한다. 즉, 켈렉션 내에 얼마나 많은 객체가 잇는지 알아낸다.
. Bool IsSynchronized - 다중 스레드된 액세스를 위해 컬렉션에 대한 액세스(Access)를 동기화한 경우 true를 반환한다.
컬렉션이 동기화되는지에 따라서 쓰레드 안전성이 있는지 검사한다.
. Object SyncRoot - SyncRoot 속성은 스레드에서 컬렉션에 대한 액세스를 동기화하기 위해 사용할 수 있는 객체를 반환한다.
- CLR 은 자동으로 어떤 .NET 형식 인스턴스라도 동기화 루트(SyncRoot)가 되도록 한다.
- SyncRoot 는 하나 이상의 코드 문장이 동시에 한 스페드에 의해서만 실행되는 것을 확실하게 하기 위해
잠거거나 해제할 수 있다.,
- ICllection.SyncRoot를 실행하면 항상 적절한SyncRoot객체를 반환한다.
ICollection인터페이스
메서드. Void CopyTo(Array array, int index) - 지정한 배열 위치부터 컬렉션의 요소를 배열로 복사한다.
IList 인터페이스 속성
. bool IsFixedSize {get;} - 리스트가 고정 길이 리스트인지 체크한다.
. bool IsReadOnly{get;} - 리스트가 읽기전용인지 체크한다.
. object this[int index] {get;set;} - 인덱스 값으로 데이터를 얻거나 추가할 수 있다.
- 인덱서(Indexer)IList 인터페이스 메서드
. int Add(object value); - 리스트 끝에 데이터를 추가할 수 있다.
. void Clear(); - 리스트의 모든 데이터를 제거한다.
. bool Contains(object value); - 어떤 데이터가 리스트내에 존재하는지 여부를 체크한다.
. int IndexOf(object value) - 리스트 내의 특정 데이터의 위치를 반환한다.
. void Insert(int index, object value); - 리스트 내의 특정 위치에 대이터를 삽입한다.
. void RemoveAt(int index); - 참조 또는 인덱스에 의해 지정한 인덱스의 데이터를 제거한다.IDictionary 인터페이스
속성. bool IsFixedSize{get;}; - 컬렉션의 크기가 정해져 있는지 검사한다.
. bool IsReadOnly {get;} - 컬렉션이 읽기전용인지 검사한다.
. ICollection Keys {get;} - 컬렉션 내의 모든 키를 나열한다.
. ICollection Values {get;} - 컬렉션 내의 모든 값을 나열한다.IDictionary 인터페이스
메서드. void Add(object key, object value); - 키와 값을 전달하여 데이터를 컬렉션에 추가한다.
. void Clear(); - 컬렉션을 비운다.
. bool Contains(object Key); - 특정 키가 데이터와 연관되어 있는지 검사한다.
. IDictionaryEnumerator GetEnumerator(); - 키와 갓을 나열한다. IdictionaryEnumerator 인터페이스를 반환한다.
. boid Remove(object key); - 삭제할 값의 키를 전달하여 데이터를 컬렉션에서 삭제한다.IDictionaryEnumerator
인터페이스의 상속구조. DictonaryEntry Entry{get;} - 열거 요소내의 키와 값을 가져온다.
. Object Key {get;} - 열거 요소내의 키를 가져온다.
. Object Value {get;} - 열거요소 내의 값을 가져온다.ArrayList클래스의
프로토타입. public class ArrayList : IList, ICollection, IEnumerable, Icloneable
Hashtable 클래스의
프로토타입. public class Hashtable : IDictionary, ICollection, IEnumerable, ISerializable, IDeserializationCallback, Icloneable
- IDictionary 인터페이스의 대표적인 예
- 객체를 삽입할때 특별한 Key와 Value을 같이 입력해야 한다.SortedList 클래스의
프로토타입. Public class SortedList : IDictionary, ICollection, IEnumerable, Icloneable
- SortedList는 키의 목록 또는 값의 목록만 반환하는 메서드를 제공
- SortedList는 내부적으로 두 개의 배열 즉, 키에 대한 배열과 관련 값에 대한 배열을 유지하여 요소를 목록에 정장
- SortedList는 각 요소에 대해 키, 값 또는 인덱스의 세가지 방법으로 액세스함.
- 요소가 삽입되면, 지정된 키가 이미 존재하는지 검사 -> 중복을 허용치 않음Queue 클래스
. public class Queue : ICollection, IEnumerable, ICloneable
Queue 클래스의 특징
. 선입선출 컬렉션 클래스
. Enqueue() 메서드는 Queue의 첫위치에 요소를 삽입
. Dequeue() 메서드는 Queue의 마지막 위치의 요소를 삭제
. Peek() 메서드는 Queue의 마지막 위치의 요소를 제거하지 않고 반환Stack 클래스의
프로토타입. Public class Stack : ICollection, IEnumerable, Icloneable
Stack 클래스의 특징
. 후입선출 컬렉션 클래스
. Push() 메서드는 Stack의 맨 위에 요소를 삽입
. Pop() 메서드는 Stack의 맨 위에 있는 요소를 삭제하고 데이터를 반환
. Peek() 메서드는 Stack의 맨 위에 있는 요소를 제거하지 않고 반환BitArray 클래스의
프로토타입. public sealed class BitArray : ICollection, IEnumerable, Icloneable
- BitArray b = new BitArray(8);
- 8비트를 가지는 비트배열 생성
- 모든 비트는 false로 설정
NameValueCollection
클래스Exception
표준 예외들. Exception : Object형으로 모든 예외의 기본클래스
. SystemException : Exception 형으로 모든 런타임 생성 오류의 기본 클래스
. IndexOutOFRangException : SystemException 형으로 매열이 올바르지 않게 인덱싱되는 경우에만 런타임에 의해 throw된다.
배열의 인덱스가 유효한 범위를 벗어날 때 사용 ex) arr[arr,Length+1]
. NullReferenceException : SystemException형으로 null 객체가 참조되는 경우에만 런타임에 의해 throw됨.
ex) object o = null; o.ToString();
. InvalidOperationExceptio : System.Exception형으로 유효하지 않은 상태에 있을 때 메서드에 의해 throw됨
. ArgumentException : SystemException형으로 모든 인수 예외의 기본 클래스 입니다.
. ArgumentNullException : ArgumentException형으로 인수에 null을 혀용하지 않는 메서드에 의해 throw됨.
ex) string s = null; "Calclulate".IndexOf(s);
. ArgumentOutRangeException : ArgumentException형으로 인수가 지정된 범위에 있는지 검사하는 메서드에 의해 throw됨
ex)string s = "string"; s.Chars[9];
. ExternalException : SystemException형으로 런타임 외부에서 발생하거나 런타임 외부의 환경을 대상으로 하는
예외의 기본 클래스
. COMExceptionExternalException : COM HRESULT 정보를 캡슐화하는 예회, COM interop 에서 사용됨
. SEHException : ExternalException형으로 Win32 구조의 예외처리 정보를 캡슐화하는 예외, 곤리되지 않는 코드
interrupt에서 사용try~catch
. try(예외감시자) - 예외가 발생할 가능성이 있는 코드의 영역을 지정
. catch(예외처리기) - try에서 발생한 예외들에 대해 어떤 종류의 예외를 어떻게 처리해 줄 것인가를 결정try~catch 사용형식
try{}
catch(예외타입 변수명) { }다중 catch 문을 사용할
때의 주의사항. 각각의 catch문은 반드시 서로 다른 종류의 예외를 처리할 것
. catch 문에서 사용될 예외 객체는 하위예외타입을 상위 예외타입보다 먼저 사용할 것try~catch~finally문
try{ //예외를 발생시킬 가능성이 있는 코드
}
catch(예외타입1 변수명)
{ // 예외1이 발생했으 때 실행되는 코드
}
catch(예외타입2 변수명)
{ // 예외2가 바랭했을 때 실행되는 코드
}
finally
{ // 필수 실행 코드
}Exception 클래스에서
예외의 상태정보 속성. StackTrace 속성 : 이 속성에는 오류 발생 위치를 알 수 있으며 스택을 추적한 정보를 포함하고 있다.
스택 추적에는 소스파일 이름과 프로그램 줄 번호가 포함됩니다.
. InnerException 속성 : 예외가 발생했을 때 하나의 예외가 발생하면 또 다른 예외로 이어지게 되는데 하나의 예외에
포함된 다른 예외정보를 포함하고 있는 속성
. Message 속성 : 예외에 포함된 메시지를 포함하고 있는 속성
. HelpLink 속성 : 예외의 원인에 대한 정보를 제공하는 도움말 파일의 URL 또는 URN이 보관 될 수 있다.checked & unchecked
키워드. Arithmetic Overflow - 산술연산 중 특정 타입의 변수가 허용하는 값의 범위를 초과하는 것
. CLR 에서 오버플로에 대한 기본 설정
- 상수식(일반상수로만 이루어진 식) : 컴파일 시 오버플로 검사
- 비상수식(변수를 포함되어 만들어진 식) : 오버플로를 검사하지 않음상수식의 기본 성질
. 상수식은 checked가 기본 성질이다.
. 상수식은 컴파일러가 컴파일할 때 오버플로를 검사한다.비상수식의 기본 성질
. 비상수식은 unchecked가 기본 성질이다. (즉, 비상수식에서 오버프로가 발생하더라도 체크하지 않는다는 뜻)
. 컴파일 시 비상수식의 오버플로는 점검될 수 없다.
. 실행시(런타임)에 오버플로가 발생할 수 있다.
. 실행시 오버플로의 에러 감지를 위해서 checked키워드를 이용한다.
Stream의 정의
. 자료의 입출력을 도와주는 추상적인 개념의 중간 매개체
데이터 흐름의
방향성 분류. 입력스트림( Stream, TextReader,BinaryReader)
. 출력스트림(Stream, TextWriter, BinaryWriter)데이터 처리하는
단위기준. Byte Stream 과 Character Stream 으로 구분
입력스트림의 사용
. 목표지점에 대이터 스트림 생성
. 알맞은 데이터 스트림으로 변환
. 데이터 입력(Read 계열 메서드)
. 데이터 스트림 닫기(Close() 메서드)출력스트림의 사용
. 목표지점에 데이터 스트림 생성
. 알맞은 데이터 스트림으로 변환
. 데이터 출력 또는 저장 (Write 계열 메서드)
. 데이터 스트림 닫기 (Close() 메서드 )Byte Stream의 종류
. Stream : 스트림 계층 구조의 최상위 추상 기본 클래스
. BufferedStream : 바이트스트림에 버퍼 기능의 추가
. FileStream : 파일 I/O 에 사용
. MemoryStream : 메모리에 사용Character Stream의
종류. TextReader, TextWriter : 문자스트림 계층 구조의 최상위 추상클래스
. StreamReader : 입력 바이트스트림을 문자스트림으로 변환
. StreamWriter : 출력 바이트스트림을 문자스트림으로 변환
. StringReader : 문자열을 핸들하기 위한 입력 문자스트림
. StringWriter : 문자열을 핸들하기 위한 출력 문자 스트림파일, 디렉터리 관련
클래스들. FileSystemInfo - 파일시스템 객체를 나타내는 기본 클래스
. Directory, DirectoryInfo - 디렉터리를 나타내는 기본 클래스
. File, FileInfo - 파일을 나타내는 기본 클래스
. Path - 경로를 조작하기 위한 클래스File 클래스
. Public sealed class File
. FileStream의 객체 생성
. 파일 관련 메서드 제공
. 멤버메서드들이 public static으로 선언File 클래스의
주요메서드. AppendText() : UTF-8로 인코딩된 텍스트를 추가하는 STreamWriter를 만든다.
. Copy() : 새파일에 기존 파일을 복사
. Create() : 경로에 파일을 만든다.
. CreateText() : UTF-8로 인코딩된 텍스트를 쓰기 위해 새 파일을 만들거나 연다.
. Delete() : 파일을 삭제합니다. 지정된 파일이 없어도 예외가 throw되지 않는다.
. Exists() : 파일이 있는지 여부를 확인한다.
. GetAttributes() : 정규화된 경로에 있는 파일의 FileAttributes를 가져옴.
. GetCreationTime() : 파일 또는 디렉터리를 마지막으로 액세스한 날짜와 시간을 반환
. GetLastAccessTime() : 파일 또는 디렉터리를 마지막으로 액세스한 날짜와 시간을 반환
. GetLastWriteTime() : 파일 또는 디렉터리를 마지막으로 쓴 날짜와 시간을 반환
. Move() : 파일을 새 위치로 이동하고 파일의 이름을 새로 정할 수 있다.
. Open() : 지정된 경로에서 FileStream을 엽니다.
. OpenRead() : 읽기용으로 팡ㄹ을 엽니다.
. OpenText() : UTF-8 로 인코딩된 텍스트 파일을 읽기용으로 Open
. OpenWrite() : 쓰기용으로 기존 파일을 엽니다.
. SetAttributes() : 파일의 지정된 FileAttributes를 가져온다.
. SetCreationTime() : 파일이 만들어진 날짜와 시간을 설정
. SetLastAccessTime() : 파일을 마지막으로 액세스한 날짜와 시간을 설정
. SetLastWriteTime() : 파일에 마지막으로쓴 날짜와 시간을 설정Directory 클래스
. 디렉터리의 생성, 이동, 삭제의 기능을 이용할 수 있다.
. public sealed class Directory
. 디렉터리 생성 및 삭제
. 하위디렉터리 생성 및 삭제
. 디렉터리 관련 메서드 제공
. 멤버메서드는 모두 public static 으로 선언되어 있다.
Path 클래스
. public sealed class Path
. 파일이나 디렉터리의 경로의 확장 및 변경, 수정하는 클래스
. 멤버메서드, 멤버필드 모두 public static으로 선언되어 있다.Stream 클래스
. public abstract class Stream : MarshlbyRefObject, IDisposable
. 바이트스트림 클래스들의 추상 기본 클래스
. 기본적이 입출력에 관련된 메서드를 포함하고 있다.
. 바이트 스트림 클래스들이란 Stream 계열의 BufferedStream, FileStream, MemoryStream, NetworkStream, CryptoStream등
- 추상클래스이므로 스트림을 직접 생성하지는 못하고 , Stream 클래스를 구현하여 각각의 장치에 맞는 스트림을 만들어 사용스트림을 얻기 위한
Console의 정적 메서드. public static Stream OpenStandardOutput()
- 표준 출력스트림을 가져옵니다.
. public static Stream OpenStandardOutput(int)
- 표준 출력스트림을 가져와서 지정한 버퍼 크기로 설정Stream클래스의
속성(Property). CanRead : 파생클래스에서 재정의될 때 현재 스트림이 읽기를 지원하는지 여부 확인
. CanSeek : 파생클래스에서 재정의 될 때 현재 스트림이 검색을 지원하는지 여부 확인
. CanWrite: 파생 클래스에서 재정의 될 때 현재 스트림이 쓰기를 지원하는지 여부 확인
. Length: 파생클래스에서 재정의된 경우 스트림 바아트의 길이 반환
. Position: 파생클래스에서 재정의되면 현재 스트림 내의 위치를 가져오거나 설정FileStream 클래스
. public class FileStream : Stream
. 파일에서 스트림을 생성할 때 사용
. 바이트 형식의 파일을 읽고 쓸 때 사용
. Stream 클래스의 모든 기능 사용 가능FileStream의 변환
. 바이트가 아니라 문자 방식으로스트림을 사용하기 위해서는 FileStream 클래스를 StreamReader 클래서와
StreamWriter 클래스로 변환하여 사용합니다. 스트림의 변환 절차를 거치면 자동적으로 바이트스트림을 문자스트림으로
핸들할 수 있게 해줍니다. StreamReader클래스와 StreamWriter 클래스는 바이트스트림을 문자스트림으로 변환하고자 할 때
주로 사용합니다.File 클래스를 이용하여
스트림을 생성하는 예FileStream을 이용하여 직접 FileStream을 생성할 수 있지만
예 > FileStream fs = new FileStream(path, FileMode.Create);
File클래스의 OpenRead()메서드를 이용하여 FileStream 객체를 생성할 수도 있습니다.
예 > FileStream fs = File.Openread("C:\C#Example\03\HelloWorld\test.txt");FileMode 상수
. Append : 해당 파일이 있을 경우 파일을 열고, 파일의 끝까지 검색하거나 새 파일을 만듬
. Create : 운영체제에서 새 파일을 만듬. 해당 파일이 있으면 덮어씀.
. CreateNew : 운영체제에서 새 파일을 만듬. 파일이 존재하면 Exception 발생
. Open : 운영체제에서 기존 파일을 열도록 지정 파일이 없으면 Exception 발생
. OpenOrCreate: 파일이 있으면 열고, 없으면 새 파일을 만듬
. Truncate : 기존 파일을 열고, 파일 크기가 0 바이트가 도도록 만듬.SeekOrigin 상수
. Begin : 스트림의 맨 앞을 지정합니다.
. Curerent : 스트림 내의 현재 위치를 지정합니다.
. End : 스트림의 맨 끝을 지정합니다.Fush()
Flsh() 메서드는 스트림에 기록한 모든 데이터들을 목표지점으로 밀어내는 역할
Peek()
Peek()메서드는 읽을 데이터가 있으면 그 값을 반환하지만, 없으면 -1을 반환하는 메서드
BufferedStream 클래스
. public sealed class BufferedStream : Stream
. BufferedStream은 내부적으로 버퍼 기능을 제공해 준다.
. 디폴트 버퍼 사이즈는 4096 Bytem
. 내부에 버퍼를 사용하기 때문에 처리하는 속도가 훨씬 빠름MemoryStream 클래스
. public sealed class MemoryStream : Stream
. 메모리에서 스트림 생성
. 부호없는(unsigned)바이트 배역 (byte[])로 저장된 데이터를 캡슐화
TextReader & TextWriter
클래스. public abstract class TextReader : MarshalbyRefObject, Idisposable
. public abstract class TextWriter : MarshalbyRefObject, Idisposable
. 문자스트림(Character Stream)의 최상위 클래스StringReader &
StringWriter
클래스. public class sStringReader : TextReader
. public class StringWriter : TextWriter
. StringReader 클래스는 string형 데이터를 매개변수로 직접 스트림 생성
. StringWriter 클래스는 스트림에 문자를 기록한다.StreamReader &
StreamWriter
클래스. public class StreamReader : TextReader
. public class StreamWriter : TextWriter
. 바이트스트림 - > 문자스트림
. TextReader 와 TextWriter를 상속받는 문자스트림
. 바이트 스트림을 문자스트림으로 변환할 때 사용BinaryReader &
BinaryWriter
클래스. public class BinaryReader :IDisposable
. public class BinaryWriter : Idsposable
. 타입에 따라 이진 데이터를 읽거나 쓸 경우 사용하는 클래스Object 클래스
. .NET Framework 최상위 클래스
. 모든 클래스는 Object클래스를 상속Object 클래스의
멤버메서드. public virtual bool Equals(object obj)
- 지정한 객체가 현재 객체과 같은지 비교
- 디폴트는 참조비교, 파생되어 다양한 비교를 함
. public static bool Equals(object obj1, object obj2)
- 지정한 두 객체가 같은 객체인지 비교하는 스태틱 메서드
- 매개변수로 들어오는 객체의 Equals()에 따라서 비교가 결정
. public static bool ReferenceEquals(object obj1, object obj2)
- obj1 과 obj2 같은 참조값을 가지는지 비교
. public virtual int GetHashCode()
- 객체의 HashCode 값 반환
- 기본 참조코드 반환, 파생되어 다양한 형식의 유일키 반환
. public Type GetType()
- 런타입시 객체의 형 반환
. public virtual string ToString()
- 재정의하지 않았을 때 디폴트로 객체의 타입을 출력한다.
- 객체의 정보출력을 목적으로 함, 재정의되어 객체의 다양한 정보를 반환
. protected ~ Object()
- 메모리 해제시 가ㅣ지콜렉터에 의해 자동호출
. protected object MemberwiseClone()
- 객체의 메로리 단순 복사해시코드(HashCode)란?
. CLR이 부여하여 객체를 식별하는 고유한 ID
. GetHashCode()에 의하여 반환
. 사용자가 GetHashCode()를 재정의하여 사용할 수 있음GetType() 메서드
. System.Type의 객체를 반환하는 메서드
※ Type 클래스 : 프로그램이 실행될 때 클래스는 CRL에 로딩되어질 것입니다. CLR에 로딩된 클래스는 클래스 내의 모든
정보를 담고 있습니다. 예를 들어 , 생성자가 몇 개인지, 멤버필드가 어떠한 것인 있는지, 누구로부터 상속을
받았는지 등에 관한 클래스 자체의 모든 정보를 담고 있습니다. 가령, 여러분이 문자열을 핸들하고자 한다면
string 클래스를 사용합니다. 이와 마찬가지로 클래스의 모든 정보를 핸들하고자 한다면 Type클래스를
이용하는 것입니다.Type 클래스의 메서드가
제공하는 클래스 정보. 클래스 타입에 관관 정보 : 클래스 상속, 인터페이스 구현 등의 정보
. 클래스 멤버에 관한 정보 : 메서드 , 속성, 이벤트, 객체의 정보Reflection이란
실행시에 객체를 통해 클래스의 정보를 분석해내는 프로그램 기법
일반적인 클래스의 사용
. 클래스 디자인
. 클래스를 이용해서 객체변수 선언
. 선언된 객체에 메모리 할당
. 객체변수를 통해서 메서드 호출
리플렉션(Reflection)
기법의 사용. 메모리를 보유하고 있는 객체가 존재할 경우
. 객체의 형(Type) 정보를 알아낸다. (즉, 해당 객체의 Type 클래스 생성)
. 생성된 Type과 해당 객체의 메모리를 이용하여 멤버들을 호출할 수 있다.클래스의 형정보
(Type Information)가
존재하는 곳. 파일 어셈블리(Assembly) 내에 형정보가 들어 있다.
. 어셈블리에 존재하는 클래스가 로딩되었다면 CLR의 모모리 내에도 형정보가 존재한다.
. 해당 객체가 CLR 내에 존재한다는 것은 해당 클래스의 타입(형)정보가 로딩되었다는 것을 의미한다.Type 클래스
. Type 클래스는 클래스의 모든 정보를 관리하는 클래스
. 특정 객체의 타입(Type)만 알고 있다면, 이 Type을 이용하여 모든 작업을 할 수 있다.Type을 얻을 수 있는 방법
. 객체.Type()
. Type.GetType("클래스 명")
. Typeof(클래스명)동적바인딩과
정적바인딩typeof 키워드는 클래스 자체를 인수로 받아서 컴파일 시에 그 클래스를 검사사하기 때문에 해당하는 클래스가 없다면 예외를 발생
그리고, 실행시(Run-Time) 에는 이미 확인된 타입을 그대로(정적으로) 사용하는 것입니다. 하지만, Type.GetType() 메서드는
프로그램 실행시, 해당 구문을 실행할 때 문자열로 지정된 타입을 동적으로 찾아서 그 형을 반환하므로, 컴파일 타임과는 상관이
없게 되는 것이입니다.Type 클래스를 분석하는
방법. 생성자를 알아낼 때 : public ConstructorInfo[] GetConstructors() 사용
. 메서드를 알아낼 때 : public MethodInfo[] GetMethods() 사용
. 변수를 알아낼 때 : public FieldInfo[] GetFields() 사용대리자(Delegate)
. 메서드의 대리자
. 메서드를 보다 효율적으로 사용하기 위하여 특정 메서드 자체를 캐슐화할 수 있게 만들어 주는 방법대리자(Delegate) 구현단계
. 1단계 : Delegate할 메서드를 정한다.
. 2단계 : 메서드에 맞는 Delegate 선언하기
- 메서드의 리턴타입과 매개변수를 정확하게 일치(반환형, 매개변수 개수, 매개변수 타입)
. 3단계 : 임의의 객체 만들기
. 4단계 : Delegate 생성과 호출Delegate의 선언
. 사용하려는 Delegate의 형을 생성하는 부분
public delegate void TopDelegator(string str);
. 메서드의 선언 (시그너쳐)
public void NormalMethod(string str)
public static void StaticMethod(string str)Delegate의 생성
. 생성된 Delegate 타입으로 부터 Delegate 객체를 생성하는 부분
- Delegate객체를 만들 대의 매개변수는 메서드의 이름이다.
- 예) TopDelegator dele = new TopDelegator(t.NormalMethod);Delegate를 사용하여
메서드 호출하는 부분. 생성된 Delegate 객체를 사용하여 메서드를 호출하는 부분
td1("jabook")
td2("소설같은 C#")Delegate의 해석
. 메서드의 포인터를 편리하게 사용하는 방법을 제공한다.
. Safe Type Method Pointer
. Method의 Pointer를 C#에서는 Delegate라는 형식을 빌어 사용할 수 있게 해준다.
. 메서드를 Delegate라는 것에서 관리하게 하고 메서드의 반환형과 매개변수 등의 안전성을 보장 받는다.Thread에 사용되는
Delegate의 구현. ThreadTest tt = new ThreadTest(); //임의의 객체
. Thread t = new Thread(new ThreadStart(tt.메서드));
. thread.Start();ThreadStart
. 스레드를 만들기 위해서는 스레드로 사용할 메서드를 반드시 ThreadStart 델리케이트로 만들어야 합니다.
ThreadStart 델리케이트는 라이브러리 내부에 선언되어 있으며 여러분은 스레드를 만들고자 할 때 ThreadStart를
사용하기만 하면 됩니다.하나의 Delegate에
다른 Delegate를 추가,
삭제하는 방법. 추가하려는 메서드를 담고 있는 객체를 += 연산자를 사용하여 등록
. 추가한 메서드를 제거할 때에는 -= 연산자를 사용하여 제거
. 멀티 Delegate를 사용할 때 메서드는 반드시 void를 반환해야 함
이벤트란?
. 이벤트(Event) 그 자체
. 이벤트를 발생시키는 이벤트 발생기
. 이벤트를 받는 이벤트 처리기 (Event Handler)일반적인 이벤트 순서
1단계 : GUI 이벤트를 테스트 하기 위한 윈도우 폼 만들기
2단계 : 폼에 등록된 이벤트 찾가(Click)
3단계 : Click 이벤트 처리기(Event Handler) 만들기
EventHandler의 형태 => private void ClickReceive(object sender, EventArgs e){ }
object sender : 메시자가 어디서 발생하는지 발생된 곳의 참조값을 의미
EventArgs e : 이벤트의 데이터를 담고 있는 매개변수
4단계 : Form의 Click 이벤트에 이벤트 처리기 등록하기
5단계 : Click 이벤트 발생, 이벤트, 이벤트 처리Event의 처리 순서
1. User가 폼을 클릭한다.(Click 이벤트 발생)
2. 폼의 Click 이벤트에 연결된 이벤트 처리기를 찾는다 (등록된 EventHandler검색)
3. 이벤트 처리기를 호출한다. (EventHandler 호출, 매개변수로 ㅎ출자와 이멘트의 정보를 주고 Eventhandler를 호출한다.
4. EventHandler에 포함된 메서드를 호출하여 작업을 처리한다.전처리 지시어의 종류
. #define, #undef ; 조건부 컴파일 기호를 정의하거나 정의를 해제할 때 사용
. #if, #elif, #else, #endif : 소스 코드의 특정 부분을 조건적으로 건너 뛸 때 사용
. #line : 오류나 경고에 대해 생성되는 줄 번호를 제어할 때 사용
. #error, #warning : 오류나 경고를 발생시킬 대 사용
. #region, #endregion: 소스 코드의 특정 부분을 명시적으로 표시할 때 사용스레드( Therad)의 특징
. 프로그램내의 일련의 작업단위
. 스레드 단위로 CPU의 제어권을 확보할 수 있다.
. 스레드를 프로그래머가 직접 제어할 수 있다.Process와 Thread
Process는 실행중인 하나의 프로그램을 의미하고,
Thread는 프로세서내에서 작업의 단위로서 여거 개 존재할 수 있다.
Process - Thread t1 - TLS(Thread Local Storage)
- Call Stack
---------------------------------------
- Thread t2 - TLS(Thread Local Storage)
- Call Stack
※ Call Stack : Thread 내에서 사용하는 메서드 호출 순서와 메서드 내부에서 사용하는 메모리를 저장하는 역할 담당
( 스레드에서 사용하는 메모리 자체)
※ TLS : 스레드 자신의 정보를 저장하는 역할Thread 상태
Unstarted(생성 직후의 상태) - Runnable(실행 가능한 상태) - Suspended(대기상태) - Stopped( 실행을 끝내고 죽은 상태)
Thread 클래스에 정의된
메서드Thread.Start() - 해당 스레드의 실행
Thread.Abort()- 해당 스레드의 종료
Thread.Join() - 해당 스레드의 실행 종료시까지 대기
Thread.Suspend() - 해당 스레드를 대기 상태로 변경
Thread.Resume() - 해당 스레드를 실행 상태로 변경
Thread.Sleep() - 해당 스레드를 특정 시간동안 대기 상태로 변경스레드를 대기상태로
보내는 방법. Sleep()
- 지정한 시간(Millisecond) 동안 스레드를 대기상태로 만듬
- 지정된 시간이 지나면 자동으로 Runnable 상태가 된다.
. Suspend()
- 스레드를 대기상태로 보낸다.
- 다시 실행 상태가 되기 위해서는 Resume() 메서드를 호출해야 한다.
- Resume()을 호출하지 않으면 스레드는 Runnable 상태로 되돌아 올 수 없다.스레드의 종료
. 자동 종료 - 해당 메서드의 종료
. 강제 종료 - Abort() 메서드를 이용하여 ThreadAbortException을 발생하여 종료
. ThreadAbortException
- 일반적으로는 처리할 수 없는 예외 해당
- 단, 스레드가 WaitSleepJoin 상태라면 이 예외를 처라할 수 있음
동기화(Synchronization)
. 스레드가 자원을 공유할 때 한번에 하나의 스레드만 사용
. 하나의 스레드가 공유자원을 사용할 때 공유자원에 lock을 걸어준다.동기화(Synchronization)
위한 방법들. Lock 키워드의 사용
. Threading 네임스페이스의 Monitor 클래스의 사용
. Threading 네임스페이스의 Mutex 클래스의 사용Marshaling ?
예> 객체를 메모리로 통째로 저장한 후 다른 컴퓨터로 전송했는데 이것을 복원해서 사용하려 합니다.
컴퓨터간에 사요하은 데이터타입의 메모리가 다르거나 데이터를 저장하는 형태가 다르다면 어떻게 될까요?
이것을 방지하기 위해서는 적절한 정보를 첨부해서 객체를 전송하거나 다른 방법을 강구해야만 합니다. 이러한 형식을 맞추기 위해서 해주는 작업을 마샬링 이라고 합니다.'Programming > C#' 카테고리의 다른 글
.NET Form에서 MFC DLL 불러오기 두번째 (0) 2014.03.26 .NET 프로그램에서 확장(Extension) DLL 불러오기 (0) 2014.03.26 대화창 자동 스크롤 (0) 2013.12.12 String Builder (0) 2013.12.12 명명 규칙 (C#) (0) 2013.11.13