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