jangjeonghun.tistory.com

Download Report

Transcript jangjeonghun.tistory.com

C#
11장. 고급 C# 프로그래밍
11장. 고급 C# 프로그래밍
학습 목표
속성과 인덱서를 배우고 각각을 비교해 본다
위임과 이벤트의 관계를 이해한다
네임스페이스를 사용하여 프로그램을 간결하게 만들 수 있다
어셈블리를 통하여 .dll 파일을 작성한다
ILDASM도구를 사용하여 어셈블리의 구성을 파악한다
c#
2 / 82
11장. 고급 C# 프로그래밍
목차
•
•
•
•
•
•
c#
속성
인덱스
위임
이벤트
네임스페이스
어셈블리
3 / 82
11장. 고급 C# 프로그래밍
1. 프로퍼티(속성)
클래스는 엑세스 지정자라는 것을 통해 중요한 멤버를 외부로부터 보호
할 수 있다.
c#
4 / 82
11장. 고급 C# 프로그래밍
1. 프로퍼티(속성)
using System;
class Time
{
private int hour, min, sec;
public Time(int h, int m, int s) { SetHour(h); SetMin(h); SetSec(s); }
public int GetHour() { return hour; }
public void SetHour(int aHour) { if (aHour < 24) hour = aHour; }
public int GetMin() { return min; }
public void SetMin(int aMin) { if (aMin < 60) min = aMin; }
public int GetSec() { return sec; }
public void SetSec(int aSec) { if (aSec < 60) sec = aSec; }
public void OutTime()
{
Console.WriteLine("현재 시간은 {0}시 {1}분 {2}초이다.", hour, min, sec);
}
}
class CSTest
{
static void Main()
{ Time Now;
Now = new Time(12, 30, 45);
Now.OutTime();
Now.SetHour(55);
Now.OutTime();
c#
5 / 82
11장. 고급 C# 프로그래밍
1. 프로퍼티(속성)
• 메서드는 외부로 공개되더라도 전달된 인수를 점검하여
원하는 값만 선택적으로 대입할 수 있다.
• 앞의 예에서 Set 메서드는 입력값이 일정 기준과 다를 경
우 대입을 거절한다.  앞의 예에 대한 객체는 안전함
• 클래스의 이런 기능을 정보 은폐라 한다.
• 멤버 변수를 보호하려면 멤버 함수를 같이 만들어야 한
다.  필드 하나당 두 개씩의 메서드를 일일이 만드는
것은 불편하다.
• C#은 Get/Set 메서드의 쌍을 컴파일러가 대신 생성하는
프로퍼티라는 새로운 멤버를 제공한다.
c#
6 / 82
11장. 고급 C# 프로그래밍
1. 프로퍼티(속성)
프로퍼티를 선언하는 기본 형식
• 필드를 선언하는 방법과 유사
• {} 블록 안에 get, set 접근자
블록을 추가로 가진다.
• get 블록 : 프로퍼티 값을 읽어서 리턴
• set 블록 : 값을 변경하는 코드를 작성
지정자 타입 이름
{
get { return 값;}
set { 값 변경 ;}
}
• 컴파일러는 프로퍼티 참조문에 대해 get,set 블록을 자동으로 호출
한다.
▫ 프로퍼티 읽는 경우 : get 접근자를 호출
▫ 프로퍼티를 쓰는 경우 : set 접근자를 호출
• 프로퍼티는 메서드에 적용 가능한 지정자 사용 가능
(static, virtual, protected, public, …)
c#
7 / 82
11장. 고급 C# 프로그래밍
1. 프로퍼티(속성)
using System;
앞 예제를 프로퍼티로 바꾼 내용
class Time
{
private int hour, min, sec;
public Time(int h, int m, int s) { Hour = h; Min = m; Sec = s; }
public int Hour
{
get { return hour; }
set { if (value < 24) hour = value; }
}
public int Min
{
get { return min; }
set { if (value < 60) min = value; }
}
public int Sec
1. Get/Set 메서드는 모두 제거됨
2. Hour, Min, Sec 프로퍼티가 추가됨
(프로퍼티는 필드명의 첫 글자를 대문자로)
3. 프로퍼티가 숨겨진 필드의 값을 대신 엑세스
하고, 조건에 맞는 값만 인정한다.
 객체의 무결성 유지
{
get { return sec; }
set { if (value < 60) sec = value; }
}
public void OutTime()
{
Console.WriteLine("현재 시간은 {0}시 {1}분 {2}초이다.", Hour, Min, Sec);
}
}
class CSTest
{
static void Main()
{ Time Now;
Now = new Time(12, 30, 45);
Now.OutTime();
Now.Hour = 55;
Now.OutTime();
c#}
}
8 / 82
11장. 고급 C# 프로그래밍
using System;
class Time
{
private int hour, min, sec;
1. 프로퍼티(속성)
using System;
class Time
{
private int hour, min, sec;
public Time(int h, int m, int s) { SetHour(h); SetMin(h); SetSec(s);
}
public Time(int h, int m, int s) { Hour = h; Min = m; Sec = s; }
public int Hour
{
public int GetHour() { return hour; }
get { return hour; }
public void SetHour(int aHour) { if (aHour < 24) hour = aHour; }
set { if (value < 24) hour = value; }
}
public int GetMin() { return min; }
public int Min
public void SetMin(int aMin) { if (aMin < 60) min = aMin; }
{
get { return min; }
public int GetSec() { return sec; }
set { if (value < 60) min = value; }
public void SetSec(int aSec) { if (aSec < 60) sec = aSec; }
}
public int Sec
public void OutTime()
{
{
get { return sec; }
Console.WriteLine("현재 시간은 {0}시 {1}분 {2}초이다.", hour, min,
sec);
set { if (value < 60) sec = value; }
}
}
}
public void OutTime()
class CSTest
{
Console.WriteLine("현재 시간은 {0}시 {1}분 {2}초이다.", Hour, Min, Sec);
{
}
static void Main()
{ Time Now;
}
Now = new Time(12, 30, 45);
class CSTest
Now.OutTime();
{
Now.SetHour(55);
static void Main()
Now.OutTime();
{ Time Now;
Now = new Time(12, 30, 45);
}
Now.OutTime();
}
Now.Hour = 55;
Now.OutTime();
}
c#
}
9 / 82
11장. 고급 C# 프로그래밍
1. 프로퍼티(속성)
• 객체를 사용하는 쪽에서는 프로퍼티를 마치 필드처럼 읽거나 대입하는 형
식으로 액세스 할 수 있다.
• 시간을 알고 싶을 때 : Now.Hour 프로퍼티를 읽는다
 get 접근자가 호출됨
• 시간을 변경하때 : Now.Hour = 55 ; 값을 대입
 컴파일러는 Hour 프로퍼티의 set 접근자를 호출
대입식의 우변인 55는 set의 암시적 인수 value로 전달한다.
A = Now.Hour
호출
get { return hour ; }
리턴
Now.Hour = 55
호출
set { hour = value ; }
전달
c#
10 / 82
11장. 고급 C# 프로그래밍
1. 프로퍼티(속성)
• Now.SetHour(55) ; 와 Now.Hour = 55 는 차이는 별로
없으며 실제 실행되는 코드도 같다.
• 프로퍼티는 Get/Set 메서드를 쓰는 것보다는 확실히 더
진보된 방법이다.
c#
11 / 82
11장. 고급 C# 프로그래밍
1. 프로퍼티(속성)
프로퍼티의 장점
• 참조문이 더 간단하다
시간을 1 증가 시키는 경우
Now.SetHour(Now.GetHour() + 1 ;
GetHour 메서드로 현재 값을 읽고 그 값에 1을 더
해 SetHour 메서드를 다시 호출한다.
Now.Hour = Now.Hour + 1 ;
그냥 1 더해 대입 한다.
• 프로퍼티는 코드를 가진 메서드 이므로 능동적으로 동작한다.
즉 조건에 맞는 값만 받아 들인다.
• 다음과 같이 여러 개의 필드로부터 복잡한 값을 조합해 내는 수식에 자주
사용된다.
private int price ;
private double sale;
public double SalePrice
{
get { return price * sale ; }
}
c#
12 / 82
11장. 고급 C# 프로그래밍
1. 프로퍼티(속성)
프로퍼티의 장점
• 값을 바꾸면서 다른 코드도 실행할 수 있으므로 값이 바뀔 때 같이 해야 하
는 작업을 처리할 수 있다. 예를 들어 날짜를 바꾸면 요일도 같이 바꿀수 있
다. 이러한 것을 자동 처리 가능하게 할 수 있다.
• 읽기 전용이나 쓰기 전용의 프로퍼티를 만들 수 있다.
디스크의 용량 조사는 읽기 저용 프로퍼티의 예
• 닷넷 2.0 부터는 get, set 접근자의 액세스 권한을 다르게 지정할 수 있다.
앞 예제에서 Sec 프로퍼티의 set 접근자만 protected 로 변경하면 이 접근
자는 자신이나 파생 클래스에서만 호출할 수 있다.
public int Sec
{
get { return sec ; }
protected set { if(value < 60 )
}
c#
sec = value ; }
13 / 82
11장. 고급 C# 프로그래밍
1. 프로퍼티(속성)
프로퍼티의 장점
• 프로퍼티는 Get/Set 메서드보다 더 빠르게 동작한다. Get/Set 메서드는 메
서드 이므로 호출에 따른 부담이 있다.
• 짧은 접근자의 프로퍼티는 컴파일러에 의해 인라인 처리 되기 때문에 호출
과정은 없다. 단, 가상으로 선언되었거나 본 체의 코드가 너무 길 때는 인라
인화 되지 않는다.
• 프로퍼티는 필드처럼 보이지만 실제로는 메서드이며 내부적으로도 메서드
로 구현된다. 그러므로 메서드가 할 수 있는 거의 모든 동작을 할 수 있다.
(가상으로 선언할 수도 있고, 재정의도 가능하고, 추상으로 선언할 수도 있
다. 또한 다형성도 성립한다.)
• 프로퍼티가 필드처럼 보이지만 실제로 기억 장소가 할당되어 있는 필드는
아니다. 그러므로 프로퍼티를 메서드의 출력용 인수나 참조용 인수로 전달
하는 것은 불가능하다.
c#
14 / 82
11장. 고급 C# 프로그래밍
1. 속성
속성(property)은 클래스의 내부에 존재하는 정보를 의미
C#에서는 속성에 접근해서 값을 가져오거나 혹은 새로 값을 부여할 때
set과 get 명령을 사용한다.
c#
15 / 82
11장. 고급 C# 프로그래밍
1. 속성
속성(property)이란?
클래스의 속성을 함수적 동작에 의하여, 표현하는 구성요소다
• 필드처럼 보이지만 실제로는 메소드처럼 동작한다.
• get,set 접근자에 의하여 표현이 된다.
• 클래스의 내부구조를 추상적으로 표현하여 보호한다.
• 내부적으로 메모리가 배정되지 않는다.
• 메소드처럼 동작하므로, virtual, static, abstract, override
키워드
사용이 가능하다.
c#
16 / 82
11장. 고급 C# 프로그래밍
1. 속성
속성(property)사용 예제(1/7)
1. namespace PropertySample1
2. {
3.
using System;
4.
public class PropertyTest
5.
{
6.
private string _name;
(17행) PropertyTest 클래스의 인스턴스 pt 생성
7.
public string
Name
(18행) 생성된 인스턴스 pt의 속성인 Name에 값 지정
8.
{
(19행) pt의 속성 Name 출력
9.
get { return _name; }
10.
set { _name = value; }
11.
}
12.
}
13.
public class Test
14.
{
15.
public static void Main(string[] args)
16.
{
17.
PropertyTest pt = new PropertyTest();
18.
pt.Name = "첫번째 프로퍼티 예제 입니다.";
19.
Console.WriteLine(pt.Name);
20.
}
21.
}
22. }
c#
17 / 82
11장. 고급 C# 프로그래밍
1. 속성
속성(property)사용 예제(2/7)
1. namespace PropertySample1
2. {
3.
using System;
PropertyTest 클래스
4.
public class PropertyTest
_name : private로 설정된 PropertyTest클래스의 멤버 필드
5.
{
6.
private string _name;
Name : public으로 설정된 PropertyTest 클래스의 속성
7.
public string
Name
get : read 기능을 수행하는 메소드
8.
{
9.
get { return _name; }
set : write 기능을 수행하는 메소드
10.
set { _name = value; }
value : set 접근자에게 전달되는 인자 값
11.
}
12.
}
13.
public class Test
14.
{
15.
public static void Main(string[] args)
16.
{
17.
PropertyTest pt = new PropertyTest();
18.
pt.Name = "첫번째 프로퍼티 예제 입니다.";
19.
Console.WriteLine(pt.Name);
20.
}
21.
}
22. }
c#
18 / 82
11장. 고급 C# 프로그래밍
1. 속성
속성(property)사용 예제(3/7)
1. namespace PropertySample1
2. {
3.
using System;
PropertyTest 클래스에서는 이 클래스의 멤버 필드 변수
4.
public class PropertyTest
_name과 Name 속성이 존재한다.
5.
{
6.
private string _name;
get 접근자는 read 기능을 포함하며, 멤버 필드의 값을 읽을
7.
public string
Name
때 실행한다.
8.
{
9.
get { return _name ; }
set 접근자는 write 기능으로 멤버 필드 값을 지정할 때 실행
10.
set { _name = value ; }
한다.
11.
}
12.
}
즉, 속성은 get, set 명령을 통해 멤버 필드 값을 읽거나 쓸
13.
public class Test
수 있는 기능을 제공한다.
14.
{
15.
public static void Main(string[] args)
16.
{
다른 클래스에서 멤버필드 변수를 읽거나 쓰려
고 요청이 들어 왔을 때만 속성을 사용할 수 있다.
17.
PropertyTest pt = new PropertyTest();
18.
pt.Name = "첫번째 프로퍼티 예제 입니다.";
19.
Console.WriteLine(pt.Name);
20.
}
21.
}
22. }
c#
19 / 82
11장. 고급 C# 프로그래밍
1. 속성
속성(property)사용 예제(4/7)
1. namespace PropertySample1
2. {
3.
using System;
4.
public class PropertyTest
5.
{
6.
private string _name;
7.
public string
Name
8.
{
9.
get { return _name ; }
10.
set { _name = value ; }
11.
}
(17행) Main() 메소드에서 pt 인스턴스를 만든 이유 : PropertyTest
12.
}
클래스 내에 있는 속성(7행 Name) 접근
13.
public class Test
14.
{
15.
public static void Main(string[] args)
16.
{
17.
PropertyTest pt = new PropertyTest();
18.
pt.Name = "첫번째 프로퍼티 예제 입니다.";
19.
Console.WriteLine(pt.Name);
20.
}
21.
}
22. }
c#
20 / 82
11장. 고급 C# 프로그래밍
1. 속성
속성(property)사용 예제(5/7)
1. namespace PropertySample1
2. {
3.
using System;
4.
public class PropertyTest
5.
{
6.
private string _name;
7.
public string
Name
8.
{
9.
get { return _name ; }
(18행) 직접적으로 속성 Name의 값을 지정
10.
set { _name = value ; }
 속성 내에 존재하는 접근자 중에 set 연산자(10행)를 사용해서
11.
}
_name 값을 바꾸었고, 인자인 “첫번째 프로퍼티 예제 입니다.” 라
12.
}
는 문자열이 속성 내의 value 변수로 복사되어 _name 필드에 저장
13.
public class Test
된다.
14.
{
15.
public static void Main(string[] args)
16.
{
17.
PropertyTest pt = new PropertyTest();
18.
pt.Name = "첫번째 프로퍼티 예제 입니다.";
19.
Console.WriteLine(pt.Name);
20.
}
21.
}
22. }
c#
21 / 82
11장. 고급 C# 프로그래밍
1. 속성
속성(property)사용 예제(6/7)
1.
2.
3.
4.
5.
6.
7.
8.
namespace PropertySample1
{
using System;
public class PropertyTest
{
private string _name;
public string
Name
{
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22. }
get { return _name ; }
set { _name = value ; }
}
}
public class Test
{
public static void Main(string[] args)
{
PropertyTest pt = new PropertyTest();
pt.Name = "첫번째 프로퍼티 예제 입니다.";
Console.WriteLine(pt.Name);
}
(19행) Console.WriteLine(pt.Name) 명령을 통해서 멤버 필드를 출
}
력하는 경우는 get 접근자가 사용되며, _name의 값을 리턴하고 그
값이 pt.Name에 저장되어 출력된다.
c#
22 / 82
11장. 고급 C# 프로그래밍
1. 속성
속성(property)사용 예제(7/7)
1.
2.
3.
4.
5.
6.
7.
8.
namespace PropertySample1
{
using System;
public class PropertyTest
{
private string _name;
public string
Name
{
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22. }
get { return _name ; }
set { _name = value ; }
}
}
public class Test
{
public static void Main(string[] args)
{
PropertyTest pt = new PropertyTest();
pt.Name = "첫번째 프로퍼티 예제 입니다.";
Console.WriteLine(pt.Name);
}
}
c#
•속성 내에 선언된 get, set 접근자는 프로그램을
실행할 때 연이어 실행되는 명령이 아니라, 각 문
장의 구조에 따라 사용되기도 하고, 사용되지 않
기도 한다.
•여기서는 get과 set 을 각각 한번씩 호출해서 사
용했다.
23 / 82
11장. 고급 C# 프로그래밍
1. 속성
속성의 형식
속성은 get 접근자를 통해 필드 값을 돌려주고, set 접근자를 통해 인자를 받아 필드 값을 변
경하기도 하는데, 경우에 따라 get 접근자를 사용하거나 set 접근자만을 사용하는 속성이 존
재 할 수도 있다.
기능적으로 속성을 크게 네가지로 나눌 수 있다.
c#
24 / 82
11장. 고급 C# 프로그래밍
1. 속성
속성의 종류
• Read-Write Property : get,set 두 개의 접근자 모두를 사용
하며 프로퍼티의 가장 일반적인 모습이다.
• Read-Only Property : get접근자만 프로퍼티 내 존재하여,
읽을 수만 있는 읽기전용 프로퍼티.
• Write-Only Property : set접근자만 사용하며, 멤버 값을 쓰기
만 할 수 있는 프로퍼티.
• Static Property : 클래스 레벨에 존재하는 프로퍼티로서, 개체
를 만들지 않고도 사용이 가능하며, this 키워드 사용이 불가능하
다.
c#
25 / 82
11장. 고급 C# 프로그래밍
1. 속성
속성 예제 2(도움말)
다음 예제에서는 인스턴스, 정적 및 읽기 전용 속성을 보여 준다. 키보드에서 직원 이
름을 입력 받고, NumberOfEmployees 변수의 값을 1만큼 증가시킨 다음 직원 이름
과 번호를 표시한다.
public class Employee
{
public static int NumberOfEmployees ;
private static int counter;
private string name;
// A read-write instance property:
public string Name
{
get { return name; }
set { name = value; }
}
// A read-only static property:
public static int Counter
{
get { return counter; }
}
class TestEmployee
{
static void Main()
{
Employee.NumberOfEmployees = 100;
Employee e1 = new Employee();
e1.Name = "Claude Vige";
System.Console.WriteLine
("Employee number: {0}", Employee.Counter);
System.Console.WriteLine
("Employee name: {0}", e1.Name);
}
}
// A Constructor:
public Employee()
{
// Calculate the employee's number:
counter = ++counter + NumberOfEmployees ;
}
}
c#
26 / 82
11장. 고급 C# 프로그래밍
인덱서
• 인덱서(Indexer)는 객체를 마치 배열인 것처럼 사용할 수
있는 특별한 메서드이다.
• 순서가 있는 여러 개의 필드들이 있을 때, 또는 순서가
있는 어떤 값을 계산해 내는 기능이 있을 때 인덱서를 사
용하면 첨자로 원하는 값을 편리하게 액세스 할 수 있다.
c#
27 / 82
11장. 고급 C# 프로그래밍
인덱서
• 형식
지정자 타입 this[인수]
{
get { return 값 ;}
set { 값 변경 ; }
}
내부에 값을 읽고 쓰는 get, set 접근자 블록을
가지므로 프로퍼티와 유사하다.
이름이 this로 고정
액세스 대상인 첨자를 {}괄호 안의 인수로 전달
한다.
c#
28 / 82
11장. 고급 C# 프로그래밍
2. 인덱스
인덱서(indexer)란?
내부적으로 객체를 배열처럼 사용할 수 있게 해주는 일종의 연산자 이다.
속성(property)과 마찬가지로 모습은 필드이지만 실제로는 메소드로 동작한다.
인덱서의 특징
• 필드처럼 보이지만 실제 동작은 메소드이다.
• get , set 접근자에 의하여 표현된다
• this키워드를 반드시 사용한다.
• 배열에 접근 하는 것 처럼 []기호를 사용한다.
c#
29 / 82
11장. 고급 C# 프로그래밍
2. 인덱스
인덱서의 쓰임
1. public class IndexerTest
2. {
3.
private string[] list;
4.
private string this[int idx]
5.
{
6.
get { return list[idx]; }
7.
set { list[idx] = value; }
8.
9. }
(3행) list 는 IndexerTest 클래스의 내부
에 설정된 문자열형 배열.
get, set 접근자를 사용하는 속성과 차이 ;
- 속성 : 일반 변수를 읽고 저장
- 인덱서 : 배열 요소를 읽고 저장
}
다른 클래스에서 이 클래스에게 list의 값을 요청한
다면 (6행)이 실행 되고
반대로 list의 값을 저장했다면 (7행)이 실행된다.
c#
30 / 82
11장. 고급 C# 프로그래밍
2. 인덱스
인덱서의 사용
인덱서는 속성과는 다르게 this 키워드를 사용해서 구현한다.
인덱서는 배열을 사용하는데, 원래의 배열에서는 정수형 요소만 사용할 수 있으나,
인덱서에서 사용하는 배열의 요소는 구분이 가능한 자료형이라면 무엇이든지 가능하다.
또한 인덱서는 오버라이딩이 가능하므로 여러 형식의 인덱서가 존재할 수 있다.
c#
31 / 82
11장. 고급 C# 프로그래밍
2. 인덱스
인덱서 사용 예제의 도식화
IndexerTest(클래스)
myFavorite(해쉬 테이블)
종류(kind)
내용
fruit
apple
color
blue
this(메소드)
입력 기능 명령어
출력 기능 명령어
c#
32 / 82
11장. 고급 C# 프로그래밍
2. 인덱스
인덱서의 사용 예제(1/5)
 다음 예제는 좋아하는 과일과 색을 해시 테이블에 저장하고, 인자로는 항목을 넘겨주어
해당 항목에 저장된 인덱서의 값을 보여주는 예이다.
1. namespace Indexer1
2. { using System;
3.
using System.Collections;
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
c#
(4~8행) IndexerTest 클래스는 실제 인덱서를 구현
(11~17행) Test 클래스는 IndexerTest 클래스의
인스턴스 생성 및 set과 get 접근자 호출
public class IndexerTest
{ private Hashtable myFavorite
= new Hashtable();
public string this[string kind]
{ get { return (string)myFavorite[kind]; }
set { myFavorite[kind] = value; }
}
}
public class Test
{ public static void Main(string[] args)
{ IndexerTest it = new IndexerTest();
it["fruit"] = "apple"; // 입력기능 명령어 호출
it["color"] = "blue";
System.Console.WriteLine(it["fruit"]);
System.Console.WriteLine(it["color"]);
33 / 82
11장. 고급 C# 프로그래밍
2. 인덱스
인덱서의 사용 예제(2/5)
 다음 예제는 좋아하는 과일과 색을 해시 테이블에 저장하고, 인자로는 항목을 넘겨주어
해당 항목에 저장된 인덱서의 값을 보여주는 예이다.
1. namespace Indexer1
2. { using System;
3.
using System.Collections;
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
c#
(5행) myFavorite 해시 테이블을 선언
public class IndexerTest
(7행,8행) kind를 인자로 받아서 해시 테이블에
해당 인자에 포함된 값을 각각 get, set 실행
{ private Hashtable myFavorite
= new Hashtable();
public string this[string kind]
{ get { return (string)myFavorite[kind]; }
set { myFavorite[kind] = value; }
}
}
public class Test
{ public static void Main(string[] args)
{ IndexerTest it = new IndexerTest();
it["fruit"] = "apple";
it["color"] = "blue";
System.Console.WriteLine(it["fruit"]);
System.Console.WriteLine(it["color"]);
34 / 82
11장. 고급 C# 프로그래밍
2. 인덱스
인덱서의 사용 예제(3/5)
 다음 예제는 좋아하는 과일과 색을 해시 테이블에 저장하고, 인자로는 항목을 넘겨주어
해당 항목에 저장된 인덱서의 값을 보여주는 예이다.
1. namespace Indexer1
2. { using System;
3.
using System.Collections;
프로그램 실행 순서
(13행) IndexerTest 클래스형 인스턴스 it를 생성
(14,15행) ‘it[“항목”] = 실제 값’ 명령을 통해 fruit
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
c#
public class IndexerTest
항목에는 apple을 color 항목에는 blue를 대입
{ private Hashtable myFavorite
= new Hashtable();
public string this[string kind]
위 과정은 6~8행에 정의된 인덱스의 set 접근자
{ get { return (string)myFavorite[kind]; }
를 호출하고, (5행)myFavorite 해시 테이블에는 다
set { myFavorite[kind] = value; }
음과 같이 저장된다.
}
}
public class Test
myFavorite[“fruit”] = “apple” ;
{ public static void Main(string[] args)
myFavorite[“color”] = “blue” ;
{ IndexerTest it = new IndexerTest();
it["fruit"] = "apple";
it["color"] = "blue";
System.Console.WriteLine(it["fruit"]);
System.Console.WriteLine(it["color"]);
35 / 82
11장. 고급 C# 프로그래밍
2. 인덱스
인덱서의 사용 예제(4/5)
 다음 예제는 좋아하는 과일과 색을 해시 테이블에 저장하고, 인자로는 항목을 넘겨주어
해당 항목에 저장된 인덱서의 값을 보여주는 예이다.
1. namespace Indexer1
2. { using System;
3.
using System.Collections;
프로그램 실행 순서
(16,17행) fruit, blue 항목에 대한 값을 출력
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
c#
public class IndexerTest
{ private Hashtable myFavorite
= new Hashtable();
public string this[string kind]
{ get { return (string)myFavorite[kind]; }
set { myFavorite[kind] = value; }
}
}
public class Test
{ public static void Main(string[] args)
{ IndexerTest it = new IndexerTest();
it["fruit"] = "apple";
it["color"] = "blue";
System.Console.WriteLine(it["fruit"]);
System.Console.WriteLine(it["color"]);
이 과정에서 인덱서의 get 접근자를
호출해서 apple과 blue가 각각 출력된다.
36 / 82
11장. 고급 C# 프로그래밍
2. 인덱스
인덱서의 사용 예제(5/5)
 다음 예제는 좋아하는 과일과 색을 해시 테이블에 저장하고, 인자로는 항목을 넘겨주어
해당 항목에 저장된 인덱서의 값을 보여주는 예이다.
1. namespace Indexer1
2. { using System;
3.
using System.Collections;
유의할 사항 : 인덱서를 정의할 때 속성과는 다르
게 (6행)과 같이 this 키워드를 사용,
또한 속성은 클래스 내부의 특정 값을 가져오거나
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
c#
public class IndexerTest
저장할 때 get, set 접근자를 사용해서 변수 값 하
{ private Hashtable myFavorite
나를 가져오거나 저장 하지만, 인덱서는 예제와 같
= new Hashtable();
이 배열 형식의 변수를 사용할 수 있다.
public string this[string kind]
{ get { return (string)myFavorite[kind]; }
set { myFavorite[kind] = value; }
}
}
public class Test
{ public static void Main(string[] args)
{ IndexerTest it = new IndexerTest();
it["fruit"] = "apple";
it["color"] = "blue";
System.Console.WriteLine(it["fruit"]);
System.Console.WriteLine(it["color"]);
37 / 82
11장. 고급 C# 프로그래밍
3. 위임
위임
위임이란 말의 원래 의미는 대리자,대신하는 사람을 의미
C#에서 이벤트가 발생하였을 때 내부적으로 이벤트를 처리하기 위한 기술
위임의 특징
• 위임의 구조는 함수의 포인터(주소)를 저장하는 구조이다.
• 저장되는 함수의 원형과 위임 함수의 원형은 반드시 같아야 한다.
• 객체지향의 속성 중에 다형성과 비슷한 작업을 수행할 수 있다.
• 프로그램의 실행 시에 생성된다.
c#
38 / 82
11장. 고급 C# 프로그래밍
위임 코드의 도식화
위임함수(onClick) 선언
위임 실행 클래스 선언
위임 메소드(마우스 클릭) 선언
위임 메소드(키보드 클릭) 선언
위임 호출 클래스 선언
위임 메소드(마우스 클릭) 호출
위임 메소드(키보드 클릭) 호출
c#
39 / 82
11장. 고급 C# 프로그래밍
위임 사용 예제(1/5)
1. namespace DelegateSample
2. { using System;
(3행)위임 하나를 선언하고, 사용자가 마우스나 키 보드를 클
릭 했을 때 위임을 사용해서 적절한 함수를 실행시키는 과정을
가정한 예
3.
delegate void onClick(string what);
4.
public class TestDelegate
5.
{ public void MouseClick(string what)
위임 문법
delegate 리턴형값 메소드(인자목록)
6.
{ System.Console.WriteLine("마우스의 {0} 버튼이 클릭 되었습니다.", what); }
7.
public void KeyBoardClick(string what)
8.
{ System.Console.WriteLine("키보드의 {0} 버튼이 클릭 되었습니다.", what); }
9.
}
10.
public class UseDelegate
11.
{ public static void Main(string[] args)
12.
c#
3. 위임
{ TestDelegate td = new TestDelegate();
13.
onClick deleMethod = new onClick(td.MouseClick);
14.
deleMethod("왼쪽");
15.
deleMethod = new onClick(td.KeyBoardClick);
16.
deleMethod("스페이스");
17.
}
40 / 82
11장. 고급 C# 프로그래밍
위임 사용 예제(2/5)
1. namespace DelegateSample
2. { using System;
3.
delegate void onClick(string what);
4.
public class TestDelegate
5.
{ public void MouseClick(string what)
(4~8행) TestDelegate는 위임이 실제로 실행하는 클래스
(10~16행) UseDelegate는 이벤트가 발생했을 때 위임을
호출해서 이벤트에 알맞은 함수를 실행 해주는 클래스
6.
{ System.Console.WriteLine("마우스의 {0} 버튼이 클릭 되었습니다.", what); }
7.
public void KeyBoardClick(string what)
8.
{ System.Console.WriteLine("키보드의 {0} 버튼이 클릭 되었습니다.", what); }
9.
}
10.
public class UseDelegate
11.
{ public static void Main(string[] args)
12.
c#
3. 위임
{ TestDelegate td = new TestDelegate();
13.
onClick deleMethod = new onClick(td.MouseClick);
14.
deleMethod("왼쪽");
15.
deleMethod = new onClick(td.KeyBoardClick);
16.
deleMethod("스페이스");
17.
}
41 / 82
11장. 고급 C# 프로그래밍
위임 사용 예제(3/5)
1. namespace DelegateSample
3. 위임
(3행) delegate 키워드를 통해 위임 함수 onClick() 선언
(문자열 형 what 인자 포함)
2. { using System;
3.
delegate void onClick(string what);
4.
public class TestDelegate
5.
{ public void MouseClick(string what)
6.
{ System.Console.WriteLine("마우스의 {0} 버튼이 클릭 되었습니다.", what); }
7.
public void KeyBoardClick(string what)
8.
{ System.Console.WriteLine("키보드의 {0} 버튼이 클릭 되었습니다.", what); }
9.
}
10.
public class UseDelegate
11.
{ public static void Main(string[] args)
12.
c#
(5행,7행) 위임이 실행해야 할 함수
- MouseClick(string what)
- KeyBoardClick(string what)
 마우스를 클릭하거나 키보드를 누를 때 위임에 의해
이 함수가 실행된다고 가정함
{ TestDelegate td = new TestDelegate();
13.
onClick deleMethod = new onClick(td.MouseClick);
14.
deleMethod("왼쪽");
15.
deleMethod = new onClick(td.KeyBoardClick);
16.
deleMethod("스페이스");
17.
}
42 / 82
11장. 고급 C# 프로그래밍
3. 위임
위임 사용 예제(4/5)
1. namespace DelegateSample
2. { using System;
3.
delegate void onClick(string what);
4.
public class TestDelegate
5.
{ public void MouseClick(string what)
6.
{ System.Console.WriteLine("마우스의 {0} 버튼이 클릭 되었습니다.", what); }
7.
public void KeyBoardClick(string what)
8.
{ System.Console.WriteLine("키보드의 {0} 버튼이 클릭 되었습니다.", what); }
9.
}
10.
public class UseDelegate
11.
{ public static void Main(string[] args)
12.
(3행)에서 위임 선언됨
{ TestDelegate td = new TestDelegate();
13.
onClick deleMethod = new onClick(td.MouseClick);
14.
deleMethod("왼쪽");
15.
deleMethod = new onClick(td.KeyBoardClick);
16.
deleMethod("스페이스");
17.
c#
}
(13행)에서 deleMethod 란 이름으로 위임의 인스
턴스가 생성되는데, 이때 인자로는 위임이 실제로
실행할 함수명을 입력 받는다.
(14행)에서 생성된 위임을 실행하자 MouseClick()
함수가 실행됨
(15행)에서 deleMethod를 재정의해서 (16행)에서
실행했다.
이러한 원리로, 위임은 계속 재정의되면서 발생하
는 이벤트에 맞는 함수를 실행해 준다.
43 / 82
11장. 고급 C# 프로그래밍
3. 위임
위임 사용 예제(4/5)
1. namespace DelegateSample
2. { using System;
3.
delegate void onClick(string what);
4.
public class TestDelegate
5.
{ public void MouseClick(string what)
6.
{ System.Console.WriteLine("마우스의 {0} 버튼이 클릭 되었습니다.", what); }
7.
public void KeyBoardClick(string what)
8.
{ System.Console.WriteLine("키보드의 {0} 버튼이 클릭 되었습니다.", what); }
9.
}
10.
public class UseDelegate
11.
{ public static void Main(string[] args)
12.
{ TestDelegate td = new TestDelegate();
13.
onClick deleMethod = new onClick(td.MouseClick);
14.
deleMethod("왼쪽");
15.
deleMethod = new onClick(td.KeyBoardClick);
16.
deleMethod("스페이스");
17.
c#
}
44 / 82
11장. 고급 C# 프로그래밍
4. 이벤트
4. 이벤트
이벤트란, 어떤 일이나 특별한 행위를 발생시키는 역할을 한다.
예) 인터넷 익스플로러 실행 시
<뒤로>버튼 클릭 하면
 이벤트가 발생하고,
웹페이지가 이전에 보았던 페이지로 이동하는 기능이 있는 함수를 호출
c#
45 / 82
11장. 고급 C# 프로그래밍
4. 이벤트
4. 이벤트
이벤트 발생
<뒤로>버튼 클릭
익스플로러의 내부 움직임
<뒤로>버튼 객체
신호전달
뒤로 가기 기능
사용자가 원하는 기능을 실행시키면, 프로그램은 이벤트를 통해 전달받아 해
당 기능을 실행시켜준다.
즉, 이벤트는 프로그램에서 상태가 변하거나 사건이 발생했을 때 이를 객체
에게 알려주는 구조를 말한다.
c#
46 / 82
11장. 고급 C# 프로그래밍
4. 이벤트
이벤트(event)란?
프로그램에서 어떠한 상태,사건이 발생하였을 때,
이 상태를 객체에게 알려주는 구조
이벤트의 특징
• 위임의 집합 형태로 표현이 된다.
• += , -= 의 연산을 사용하여 이벤트를 추가,삭제 한다.
• 이벤트의 발생을 알려주는 Sender와 Event를 원하는 Subscriber가 존재한다.
• 일반함수를 호출하듯이 사용한다.
c#
47 / 82
11장. 고급 C# 프로그래밍
4. 이벤트
위임 문법
delegate 리턴형값 메소드(인자목록)
delegate void onClick(string what);
이벤트의 변수 선언 형식
[속성][변경자]
public
c#
event
이벤트형식
onClick
이벤트변수명
myClick;
48 / 82
11장. 고급 C# 프로그래밍
4. 이벤트
이벤트(event)사용 예제- 앞의 예제에서 이벤트 추가
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
namespace EventSample
{ using System;
public delegate void onClick( string what);
public class TestDelegate
{
public void MouseClick( string what)
{ System.Console.WriteLine
("마우스의 {0} 버튼이 클릭 되었습니다.", what); }
public void KeyBoardClick( string what)
{ System.Console.WriteLine
("키보드의 {0} 버튼이 클릭 되었습니다.", what); }
}
이벤트의 변수 선언 형식
public class UseDelegate
[속성][변경자] 이벤트형식
{
public event
onClick myClick; //1. 이벤트 선언
15.
16.
17.
18.
19.
20.
21.
22.
23. c#
이벤트변수명
(13행) 이벤트 변수 선언
public static void Main( string[] args)
(변수의 형식 : onClick)
{
UseDelegate ud = new UseDelegate();
 myClick 이벤트가 발생 시
TestDelegate td = new TestDelegate();
onClick 위임을 호출함
onClick deleMethod = new onClick(td.MouseClick);
ud.myClick += deleMethod; //2. 이벤트 추가
deleMethod =
new onClick(td.KeyBoardClick);
ud.myClick
+= deleMethod; //2. 이벤트 추가
ud.myClick("어떤"); //3. 이벤트에 등록된 모든 위임 실행
}
49 / 82
11장. 고급 C# 프로그래밍
4. 이벤트
이벤트(event)사용 예제
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
namespace EventSample
{ using System;
public delegate void onClick( string what);
public class TestDelegate
{
public void MouseClick( string what)
{ System.Console.WriteLine
("마우스의 {0} 버튼이 클릭 되었습니다.", what); }
public void KeyBoardClick( string what)
{ System.Console.WriteLine
("키보드의 {0} 버튼이 클릭 되었습니다.", what); }
}
public class UseDelegate
{
public event
onClick myClick; //1. 이벤트 선언 (19, 21행) : 선언한 이벤트를 위임 형식
의 변수 deleMethod 에 추가함
15.
16.
17.
18.
19.
20.
21.
22.
23. c#
public static void Main( string[] args)
(22행) : 이벤트가 실행될 때 까지 해당 이
{
벤트에 등록된(MouseClick(),
UseDelegate ud = new UseDelegate();
KeyBoardClick()) 모든 위임이 실행됨
TestDelegate td = new TestDelegate();
onClick deleMethod = new onClick(td.MouseClick);
ud.myClick += deleMethod; //2. 이벤트 추가
이벤트의 추가는 += 연산자 사용한다.
deleMethod =
new onClick(td.KeyBoardClick);
이벤트 += 위임 ;
ud.myClick
+= deleMethod; //2. 이벤트 추가
ud.myClick("어떤"); "); //3. 이벤트에 등록된 모든 위임 실행
}
50 / 82
11장. 고급 C# 프로그래밍
4. 이벤트
이벤트(event)사용 예제
1.
2.
3.
4.
5.
6.
7.
namespace EventSample
{ using System;
public delegate void onClick( string what);
public class TestDelegate
{
public void MouseClick( string what)
{ System.Console.WriteLine
("마우스의 {0} 버튼이 클릭 되었습니다.", what); }
8.
public void KeyBoardClick( string what)
9.
{ System.Console.WriteLine
("키보드의 {0} 버튼이 클릭 되었습니다.", what); }
10.
}
예제를 실행하면 이벤트에 등록된 MouseClick(),
11.
public class UseDelegate
KeyBoardClick() 메소드가 모두 수행된다.
12.
{
(22행)에서
13.
public event
onClick myClick; //1. 이벤트
선언 이벤트를 실행할 때 넘겨주는 값인 “어떤”
이란 문자열을 포함하게 된다.
14.
public static void Main( string[] args)
15.
{
16.
UseDelegate ud = new UseDelegate();
17.
TestDelegate td = new TestDelegate();
18.
onClick deleMethod = new onClick(td.MouseClick);
19.
ud.myClick += deleMethod; //2. 이벤트 추가
20.
deleMethod =
new onClick(td.KeyBoardClick);
21.
ud.myClick
+= deleMethod; //2. 이벤트 추가
22.
ud.myClick("어떤"); //3. 이벤트에 등록된 모든 위임 실행
23. c#
}
51 / 82
11장. 고급 C# 프로그래밍
4. 이벤트
이벤트(event)사용 예제
public static void Main(string[] args)
{
UseDelegate
ud = new UseDelegate();
TestDelegate
td = new TestDelegate();
onClick
deleMethod = new
ud.myClick
+=
deleMethod
=
ud.myClick
+=
onClick(td.MouseClick);
deleMethod;
new
onClick(td.KeyBoardClick);
deleMethod;
ud.myClick("어떤");
}
c#
52 / 82
11장. 고급 C# 프로그래밍
5. 네임스페이스
네임스페이스
큰 프로그램 하나를 여러 사람이 동시에 나눠서 개발할 때 각자 개발한 클
래스명이 중복될 수 있는데, 이런 경우에 누구의 클래스인지 구분할 수 있
는 기능이 필요하다. 바로 이럴 때 사용하는 것이 네임스페이스
(Namespace)이다.
또한 자주 사용되는 기능을 클래스 하나에 정의하고 네임스페이스를 사용
해서 이 클래스를 다른 클래스에서 불러서 손쉽게 사용할 수 있다.
c#
53 / 82
11장. 고급 C# 프로그래밍
5. 네임스페이스
네임스페이스
namespace 철수 {
public class ClassTest {
……
}
}
같은 ClassTest 명칭이 2곳에서 사용
namespace 영희 {
public class ClassTest {
……
}
}
위의 예제에서 ClassTest 클래스를 사용할 때는, 네임스페이스명.클래스명으로 구분한다.
철수.ClassTest,
c#
영희.ClassTest
54 / 82
11장. 고급 C# 프로그래밍
5. 네임스페이스
네임스페이스의 개념이 없었을 경우
다른 한 사람의 클래스명을 바꾼다
처음부터 클래스명을 길게 만들어 중복될 가능성을 줄인다
클래스명 앞에 만든 사람이나 단체명을 붙인다
위와 같이 하면 프로그램이 복잡해진다.
네임스페이스를 사용하면 프로그램을 좀 더 유용하게 작성할 수 있다.
c#
55 / 82
11장. 고급 C# 프로그래밍
5. 네임스페이스
네임스페이스의 범위
C#에서 클래스 하나는 오직 파일 하나에서만 만들 수 있다.
네임스페이스는 여러 파일에서 동일한 네임스페이스를 사용할 수 있다.
네임스페이스는 또 다른 네임스페이스 안에 존재할 수 있다.
네임스페이스 사용 방법
namespace 철수
{
namespace 영희
{
public class ClassTest
{
}
}
}
(중첩 가능)
namespace 철수.영희
{
public class ClassTest
{
}
}
점(.)연산자 이용
(큰규모 네임스페이스. 작은규모네임스페이스)
* 네임스페이스는 public 접근자로 자동 생성됨
c#
56 / 82
11장. 고급 C# 프로그래밍
5. 네임스페이스
다른 네임스페이스 내에 있는 클래스 사용하기
1. using System;
2. namespace NameTest
3. {
4.
public class TestA
5.
{
6.
public void type()
7.
{
8.
Console.WriteLine("여기는 NameTest 네임스페이스 입니다.");
9.
}
10.
}
네임스페이스 사용 방법
11. }
네임스페이스.클래스명 인스턴스명
=
new 네임스페이스.클래스명();
12. public class TestB
13. {
14.
public static void Main(string[] args)
15.
{
16.
//TestA TA = new TestA(); //오류발생
17.
NameTest.TestA TA = new NameTest.TestA();
18.
TA.type();
19.
}
20. }
c#
//정상실행
57 / 82
11장. 고급 C# 프로그래밍
5. 네임스페이스
다른 네임스페이스 내에 있는 클래스 사용하기
1. using System;
2. namespace NameTest
16행과 같이 네임스페이스 생략 시 오류 발생
3. {
4.
public class TestA
5.
{
6.
public void type()
7.
{
8.
Console.WriteLine("여기는 NameTest 네임스페이스 입니다.");
9.
}
10.
}
11. }
12. public class TestB
13. {
14.
public static void Main(string[] args)
15.
{
16.
TestA TA = new TestA(); //오류발생
17.
//NameTest.TestA TA = new NameTest.TestA();
18.
TA.type();
19.
}
20. }
c#
//정상실행
58 / 82
11장. 고급 C# 프로그래밍
5. 네임스페이스
같은 네임스페이스 내에 있는 클래스 사용하기
using System;
namespace NameTest
{
public class TestA
{
public void type()
{
Console.WriteLine("여기는 NameTest 네임스페이스 입니다.");
}
}
}
c#
namespace NameTest
{
public class TestB
{
public static void Main(string[] args)
{
TestA TA = new TestA() ; //같은네임스페이스  클래스명만 사용 가능
TA.type();
}
}
59 / 82
}
11장. 고급 C# 프로그래밍
5. 네임스페이스
using 지시자 사용하기
네임스페이스가 다른 경우는
인스턴시 생성시
‘네임스페이스명.클래스명’ 과 같이 네임스페이스 경로까지 지정 필요
 프로그램의 소스가 길어지고 읽기도 복잡해짐
위의 단점 보안하기 위해서 using 사용
c#
60 / 82
11장. 고급 C# 프로그래밍
5. 네임스페이스
using 지시자의 사용
using 지시자를 통해서 사용할 네임스페이스를 한번만 지정해주면, 일일이 네임스페이스 경로를
지정할 필요가 없다
• using 지시자의 뒤에는 단지, 네임스페이스명만 올 수 있다.
• using 지시자의 뒤에 클래스는 지정할 수 없다.
• 프로그램의 가장 첫 부분에 선언하여 준다.
• 지역선언으로서, namespace의 가장 첫 줄에 선언하여도 된다.
c#
61 / 82
11장. 고급 C# 프로그래밍
5. 네임스페이스
using 지시자 예제
1.
2.
using
using
System;
NameTest;
3. namespace NameTest
4. { public class TestA
5.
{
6.
public void type()
7.
{
8.
Console.WriteLine("여기는 NameTest 네임스페이스 입니다.");
9.
}
(1행) using System; 은
10.
}
9 행의 Console.WriteLine 메소드가
11. }
System 네임스페이스 내에서 선언되었기 때문
만약 using 생략 시
System.Console.WriteLine() 이라고 모든 경로 작성 필요
12. public class TestB
13. {
14.
public static void Main(string[] args)
15.
{
16.
TestA TA = new TestA(); //정상실행
17.
TA.type();
18.
}
19. }
(2행) using NameTest;
사용으로
16행에서 네임스페이스 없이 TestA 로 사용 가능
c#
62 / 82
11장. 고급 C# 프로그래밍
6. 어셈블리
어셈블리(assembly)의 정의
프로그램 실행 : 확장자 .exe 인 파일 더블 클릭( .exe파일이 실행파일임)
C#에서도 확장자가 .exe 인 실행 파일 생성 가능하고, 다른 프로그램의 한 부
분으로 사용할 수 있는 .dll 파일 생성가능
프로그램의 실행단위를 어셈블리(assembly)라고 함.
앞에서 예로 든 파일들은 모두 확장자가 .cs 이다.
.cs 파일을 C#에서는 csc 명령을 이용하여 컴파일 가능
csc 명령은 .exe 파일과 .dll 파일로 컴파일 할 수 있다.
.exe 파일은 자신이 직접 실행되는 파일이고, .dll파일은 다름 프로그램의 한
부분으로 사용할 수 있도록 프로그램을 부품화 할 때 사용한다.
c#
63 / 82
11장. 고급 C# 프로그래밍
6. 어셈블리
어셈블리(assembly)의 정의
예) 전자계산기 역할을 하는 프로그램
 .exe 로 만들 시 : 프로그램 자체가 전자계산기 프로그램 임
 .dll로 만들 시 : 전자계산기 역할이 필요한 프로그램에서 .dll을
가져다 사용할 수 있다.
•프로그램의 기능을 부품처럼 개발해서, 다른 프로그램에서 사용할 수 있도록
설계한 프로그램을 컴포넌트(component)라고 한다.
•C#으로 개발한 .dll 파일 자체가 작은 컴포넌트라 할 수 있다.
c#
64 / 82
11장. 고급 C# 프로그래밍
6. 어셈블리
어셈블리(assembly)의 구조
어셈블리는 자체적으로 실행 가능한 실행 코드가 있고,
어셈블리에는 메타 데이터가 있다.
메타 데이터 : 다른 프로그램이 어셈블리 안에 정의되어 있는 객체의
클래스, 메소드, 속성 등을 참조할 때 필요한 정보를 담고 있는 것
메타 데이터를 통해서, .dll파일이 다른 프로그램에 쓰일 때 어떤 클래스가
어떤 일을 하는지, 해당 프로그램에게 정보를 넘겨 주는 것이다.
이러한 메타 데이터를 다른말로 매니페스트(manifest)라고도 한다.
매니페스트는 어셈블리에 포함된 객체들과 더불어 어셈블리가 사용하는 또
다른 어셈블리가 존재한다면 이러한 어셈블리의 몇몇 정보도 포함하고 있다.
c#
65 / 82
11장. 고급 C# 프로그래밍
6. 어셈블리
어셈블리(assembly)의 구조
어셈블리의 또 다른 구성요소는 형식 메타 데이터로, 이는 어셈블리 안에 존재
하는 클래스, 속성, 메소드, 변수 등에 대한 데이터 형식에 대한 정보를 포함
한다.
그 다음으로 각 형식에 대한 실제 실행 파일인 MSIL(Microsoft Intermediate
Language)이 있으며, 마지막으로 해당 어셈블리가 사용하는 리소스가 있다.
리소스에는 해당 프로그램이 사용하는 이미지나 아이콘 등이 존재한다.
c#
66 / 82
11장. 고급 C# 프로그래밍
6. 어셈블리
어셈블리(assembly)란?
.exe , .dll과 같은 프로그램의 제일 작은 실행 단위
c#
67 / 82
11장. 고급 C# 프로그래밍
6. 어셈블리
어셈블리의 구성
* 메니페스트 – 다른 어셈블리를 참조한다면 그 정보를 가지고 있다.
* 형식 메타 데이터 – 어셈블리안에 존재하는 클래스,속성,메소드,변수등에 대한 정보
* MSIL(Microsoft Intermediate Language) – 실제 실행 파일
* 리소스 – 어셈블리가 사용하는 리소스이며, 해당 프로그램의 이미지나 아이콘이 존재
ILDASM도구의 파일 확장자
.assembly :
.class : 해당 어셈블리 내에 존재하는 클래스 파일의 정보를 보여준다.
.method : 해당 어셈블리 내에 존재하는 메소드의 정보를 보여준다.
.ctor : constructor 파일의 약자로, 생성자를 의미한다.
c#
68 / 82
11장. 고급 C# 프로그래밍
6. 어셈블리
어셈블리 작성하기
프로젝트 클릭
c#
69 / 82
11장. 고급 C# 프로그래밍
6. 어셈블리
어셈블리 작성하기
1.
2.
3.
4.
5.
c#
Visual C# 선택
클래스 라이브러리 선택(템플릿)
이름 : Calc 입력
위치 : C\Csharp\Chap11
확인 클릭
70 / 82
11장. 고급 C# 프로그래밍
6. 어셈블리
어셈블리 작성하기
using System;
namespace Calc
{
public class Calc
{
public int Add(int a, int b)
{
return a + b;
}
•사칙연산 수행
•Main() 메소드가 없음
• .dll 로 만든 후, 필요한 프로그램에서 호출해서 사용
public int Sub(int a, int b)
{
return a - b;
}
public int Mult(int a, int b)
{
return a * b;
}
public int Div(int a, int b)
{
return a / b;
}
c#
}
71 / 82
11장. 고급 C# 프로그래밍
6. 어셈블리
어셈블리 작성하기
Calc 빌드 클릭(.dll 만들기)
c#
72 / 82
11장. 고급 C# 프로그래밍
6. 어셈블리
어셈블리 작성하기
C:\Csharp\Chap11\Calc\obj\Debug
만들어진 Calc.dll 확인
c#
73 / 82
11장. 고급 C# 프로그래밍
6. 어셈블리
어셈블리의 내용 살펴보기
각 어셈블리는 자신의 정보를 메타데이터에 담아 간직한다.
.dll 정보 조회 가능
 어셈블리의 내용을 살펴 볼 때는 닷넷 프로임워크 ILDASM(.NET
Framework Intermediate Language DisASseMbler) 도구 사용
(비주얼 스튜디오 닷넷 설치시 자동으로 설치됨)
사용 방법 : 외부도구로 추가한 다음 사용 가능
c#
74 / 82
11장. 고급 C# 프로그래밍
6. 어셈블리
어셈블리의 내용 살펴보기
외부도구 클릭
c#
75 / 82
11장. 고급 C# 프로그래밍
6. 어셈블리
어셈블리의 내용 살펴보기
추가 클릭
c#
76 / 82
11장. 고급 C# 프로그래밍
6. 어셈블리
어셈블리의 내용 살펴보기
c#
77 / 82
11장. 고급 C# 프로그래밍
어셈블리의 내용 살펴보기
c#
6. 어셈블리
1. 제목 : ILDASM 입력
2. 명령 : … 클릭
78 / 82
11장. 고급 C# 프로그래밍
6. 어셈블리
어셈블리의 내용 살펴보기
C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin\ildasm.exe
1. ildasm.exe 선택
2. 확인 클릭
c#
79 / 82
11장. 고급 C# 프로그래밍
6. 어셈블리
어셈블리의 내용 살펴보기
ILDASM 클릭
c#
80 / 82
11장. 고급 C# 프로그래밍
6. 어셈블리
어셈블리의 내용 살펴보기
열기 클릭
c#
81 / 82
11장. 고급 C# 프로그래밍
6. 어셈블리
어셈블리의 내용 살펴보기
Calc.dll 선택 후 열기 클릭
c#
82 / 82
11장. 고급 C# 프로그래밍
6. 어셈블리
어셈블리의 내용 살펴보기
1.
2.
c#
소스에서 정의한 메소드 모두 보임
MANIFEST 더블 클릭
83 / 82
11장. 고급 C# 프로그래밍
6. 어셈블리
어셈블리의 내용 살펴보기
해당 클래스의 메타데이터 정보를 포함하고 있음
c#
84 / 82
11장. 고급 C# 프로그래밍
어셈블리 활용하기
c#
6. 어셈블리
프로젝트 클릭
85 / 82
11장. 고급 C# 프로그래밍
6. 어셈블리
어셈블리 활용하기
1.
2.
3.
4.
c#
Visual C# 클릭
콘솔 응용 프로그램 선택
이름 : UsingCalc.cs 입력
확인 클릭
86 / 82
11장. 고급 C# 프로그래밍
6. 어셈블리
어셈블리 활용하기
솔루션 탐색기 클릭(탐색기 창 보기)
c#
87 / 82
11장. 고급 C# 프로그래밍
6. 어셈블리
어셈블리 활용하기
참조 추가 클릭
c#
88 / 82
11장. 고급 C# 프로그래밍
어셈블리 활용하기
c#
6. 어셈블리
1. Calc.dll 클릭
2. 확인 클릭
89 / 82
11장. 고급 C# 프로그래밍
어셈블리 활용하기
6. 어셈블리
Calc.dll 이 정상적으로 참조가 됨
1. Program.cs 더블 클릭
c#
90 / 82
11장. 고급 C# 프로그래밍
6. 어셈블리
어셈블리 활용하기
코딩 할 내용(다음 페이지)
c#
91 / 82
11장. 고급 C# 프로그래밍
어셈블리 활용하기
using
using
using
6. 어셈블리
아래 내용 코딩(Program.cs)
System;
System.Collections.Generic;
System.Text;
namespace UsingCalc.cs
{
class Program
{
static void Main(string[] args)
{
{
Calc.Calc myCalc = new Calc.Calc();
Console.WriteLine("연산을 원하는 두 개의 정수를 입력 하세요");
int
int
a=
b=
int.Parse(Console.ReadLine());
int.Parse(Console.ReadLine());
Console.WriteLine("{0}+{1} = {2}", a, b, myCalc.Add(a, b));
Console.WriteLine("{0}-{1} = {2}", a, b, myCalc.Sub(a, b));
Console.WriteLine("{0}*{1} = {2}", a, b, myCalc.Mult(a, b));
Console.WriteLine("{0}/{1} = {2}", a, b, myCalc.Div(a, b));
}
c#
}
92 / 82
11장. 고급 C# 프로그래밍
어셈블리 활용하기
using
using
using
6. 어셈블리
실행 후 결과 확인
System;
System.Collections.Generic;
System.Text;
namespace UsingCalc.cs
{
class Program
{
static void Main(string[] args)
{
{
Calc.Calc myCalc = new Calc.Calc();
Console.WriteLine("연산을 원하는 두개의 정수를 입력 하세요");
int
int
a=
b=
int.Parse(Console.ReadLine());
int.Parse(Console.ReadLine());
Console.WriteLine("{0}+{1} = {2}", a, b, myCalc.Add(a, b));
Console.WriteLine("{0}-{1} = {2}", a, b, myCalc.Sub(a, b));
Console.WriteLine("{0}*{1} = {2}", a, b, myCalc.Mult(a, b));
Console.WriteLine("{0}/{1} = {2}", a, b, myCalc.Div(a, b));
}
c#
}
93 / 82
11장. 고급 C# 프로그래밍
요약
• 속성이란 클래스를 함수적 동작에 의해서, 표현하는 구
성요소이다.
• 인덱스는 내부적으로 객체를 배열처럼 사용할 수 있게
해주는 일종의 연산자와 같다.
• 위임은 함수의 포인터를 사용해서 호출을 다른 함수로
넘길 수 있는 구조를 포함하고 있다.
c#
94 / 82
11장. 고급 C# 프로그래밍
요약
• 이벤트란 프로그램에서 어떠한 상태, 사건이 발생했을
때 이를 객체에게 알려주는 구조를 말하는 것이다.
• 네임스페이스는 중복 가능성이 있거나, 자주 사용되는
클래스에 명칭을 부여함으로써, 해당 클래스의 중복을
막고, 다른 클래스에서도 손쉽게 호출해서 사용할 수 있
게 해준다.
• using 지시자를 통해서 사용할 네임스페이스를 한 번만
지정해주면, 일일이 네임스페이스 경로를 지정할 필요가
없다.
c#
95 / 82
11장. 고급 C# 프로그래밍
요약
• 어셈블리는 매니페스트, 형식메타데이터, MSIL, 리소스
로 구성되어 있다.
• 비ㅈ주얼 스튜디오 닷넷에서 클래스 라이브러리로 개발
한 .dll 파일은 그 기능이 필요한 프로그램을 작성할 때
참조 명령을 통해서 사용될 수 있다.
• 비주얼 스튜디오 닷넷에서 ILDASM 도구를 사용해서 어
셈블리 파일인 .dll 파일의 구조를 자세히 관찰할 수 있다
.
c#
96 / 82