96
C# 11 장 . 장장 C# 장장장장장

11 장 . 고급 C# 프로그래밍

  • Upload
    kimo

  • View
    175

  • Download
    5

Embed Size (px)

DESCRIPTION

C#. 11 장 . 고급 C# 프로그래밍. 학습 목표. 속성과 인덱서를 배우고 각각을 비교해 본다 위임과 이벤트의 관계를 이해한다 네임스페이스를 사용하여 프로그램을 간결하게 만들 수 있다 어셈블리를 통하여 .dll 파일을 작성한다 ILDASM 도구를 사용하여 어셈블리의 구성을 파악한다. 목차. 속성 인덱스 위임 이벤트 네임스페이스 어셈블리. 1. 프로퍼티 ( 속성 ). 클래스는 엑세스 지정자라는 것을 통해 중요한 멤버를 외부로부터 보호 할 수 있다. 1. 프로퍼티 ( 속성 ). - PowerPoint PPT Presentation

Citation preview

Page 1: 11 장 .  고급  C#  프로그래밍

C#

11 장 . 고급 C# 프로그래밍

Page 2: 11 장 .  고급  C#  프로그래밍

c#

11 장 . 고급 C# 프로그래밍

2 / 82

속성과 인덱서를 배우고 각각을 비교해 본다

위임과 이벤트의 관계를 이해한다

네임스페이스를 사용하여 프로그램을 간결하게 만들 수 있다

어셈블리를 통하여 .dll 파일을 작성한다

ILDASM 도구를 사용하여 어셈블리의 구성을 파악한다

학습 목표학습 목표

Page 3: 11 장 .  고급  C#  프로그래밍

c#

11 장 . 고급 C# 프로그래밍

3 / 82

목차• 속성• 인덱스• 위임• 이벤트• 네임스페이스• 어셈블리

Page 4: 11 장 .  고급  C#  프로그래밍

c#

11 장 . 고급 C# 프로그래밍

4 / 82

1. 프로퍼티 ( 속성 )

클래스는 엑세스 지정자라는 것을 통해 중요한 멤버를 외부로부터 보호

할 수 있다 .

Page 5: 11 장 .  고급  C#  프로그래밍

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(); }}

Page 6: 11 장 .  고급  C#  프로그래밍

c#

11 장 . 고급 C# 프로그래밍

6 / 82

1. 프로퍼티 ( 속성 )

• 메서드는 외부로 공개되더라도 전달된 인수를 점검하여 원하는 값만 선택적으로 대입할 수 있다 .

• 앞의 예에서 Set 메서드는 입력값이 일정 기준과 다를 경우 대입을 거절한다 . 앞의 예에 대한 객체는 안전함

• 클래스의 이런 기능을 정보 은폐라 한다 .

• 멤버 변수를 보호하려면 멤버 함수를 같이 만들어야 한다 . 필드 하나당 두 개씩의 메서드를 일일이 만드는 것은 불편하다 .

• C# 은 Get/Set 메서드의 쌍을 컴파일러가 대신 생성하는 프로퍼티라는 새로운 멤버를 제공한다 .

Page 7: 11 장 .  고급  C#  프로그래밍

c#

11 장 . 고급 C# 프로그래밍

7 / 82

1. 프로퍼티 ( 속성 )

프로퍼티를 선언하는 기본 형식• 필드를 선언하는 방법과 유사• {} 블록 안에 get, set 접근자

블록을 추가로 가진다 .

• get 블록 : 프로퍼티 값을 읽어서 리턴• set 블록 : 값을 변경하는 코드를 작성

• 컴파일러는 프로퍼티 참조문에 대해 get,set 블록을 자동으로 호출한다 .▫ 프로퍼티 읽는 경우 : get 접근자를 호출▫ 프로퍼티를 쓰는 경우 : set 접근자를 호출

• 프로퍼티는 메서드에 적용 가능한 지정자 사용 가능(static, virtual, protected, public, …)

지정자 타입 이름{

get { return 값 ;}set { 값 변경 ;}}

Page 8: 11 장 .  고급  C#  프로그래밍

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. 프로퍼티가 숨겨진 필드의 값을 대신 엑세스

하고 , 조건에 맞는 값만 인정한다 . 객체의 무결성 유지

Page 9: 11 장 .  고급  C#  프로그래밍

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();

}

}

Page 10: 11 장 .  고급  C#  프로그래밍

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 ; }

호출

호출

리턴

전달

Page 11: 11 장 .  고급  C#  프로그래밍

c#

11 장 . 고급 C# 프로그래밍

11 / 82

1. 프로퍼티 ( 속성 )

• Now.SetHour(55) ; 와 Now.Hour = 55 는 차이는 별로 없으며 실제 실행되는 코드도 같다 .

• 프로퍼티는 Get/Set 메서드를 쓰는 것보다는 확실히 더 진보된 방법이다 .

Page 12: 11 장 .  고급  C#  프로그래밍

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 더해 대입 한다 .

Page 13: 11 장 .  고급  C#  프로그래밍

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 ; }

}

Page 14: 11 장 .  고급  C#  프로그래밍

c#

11 장 . 고급 C# 프로그래밍

14 / 82

1. 프로퍼티 ( 속성 )

프로퍼티의 장점• 프로퍼티는 Get/Set 메서드보다 더 빠르게 동작한다 . Get/Set 메서드는

메서드 이므로 호출에 따른 부담이 있다 .• 짧은 접근자의 프로퍼티는 컴파일러에 의해 인라인 처리 되기 때문에 호출

과정은 없다 . 단 , 가상으로 선언되었거나 본 체의 코드가 너무 길 때는 인라인화 되지 않는다 .

• 프로퍼티는 필드처럼 보이지만 실제로는 메서드이며 내부적으로도 메서드로 구현된다 . 그러므로 메서드가 할 수 있는 거의 모든 동작을 할 수 있다 .( 가상으로 선언할 수도 있고 , 재정의도 가능하고 , 추상으로 선언할 수도 있다 . 또한 다형성도 성립한다 .)

• 프로퍼티가 필드처럼 보이지만 실제로 기억 장소가 할당되어 있는 필드는 아니다 . 그러므로 프로퍼티를 메서드의 출력용 인수나 참조용 인수로 전달하는 것은 불가능하다 .

Page 15: 11 장 .  고급  C#  프로그래밍

c#

11 장 . 고급 C# 프로그래밍

15 / 82

1. 속성

속성 (property) 은 클래스의 내부에 존재하는 정보를 의미

C# 에서는 속성에 접근해서 값을 가져오거나 혹은 새로 값을 부여할 때

set 과 get 명령을 사용한다 .

Page 16: 11 장 .  고급  C#  프로그래밍

c#

11 장 . 고급 C# 프로그래밍

16 / 82

1. 속성

속성 (property) 이란 ?

클래스의 속성을 함수적 동작에 의하여 , 표현하는 구성요소다

• 필드처럼 보이지만 실제로는 메소드처럼 동작한다 .

• get,set 접근자에 의하여 표현이 된다 .

• 클래스의 내부구조를 추상적으로 표현하여 보호한다 .

• 내부적으로 메모리가 배정되지 않는다 .

• 메소드처럼 동작하므로 , virtual, static, abstract, override 키워드

사용이 가능하다 .

Page 17: 11 장 .  고급  C#  프로그래밍

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 출력

Page 18: 11 장 .  고급  C#  프로그래밍

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 접근자에게 전달되는 인자 값

Page 19: 11 장 .  고급  C#  프로그래밍

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 명령을 통해 멤버 필드 값을 읽거나 쓸 수 있는 기능을 제공한다 .

다른 클래스에서 멤버필드 변수를 읽거나 쓰려고 요청이 들어 왔을 때만 속성을 사용할 수 있다 .

Page 20: 11 장 .  고급  C#  프로그래밍

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) 접근

Page 21: 11 장 .  고급  C#  프로그래밍

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 필드에 저장된다 .

Page 22: 11 장 .  고급  C#  프로그래밍

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 에 저장되어 출력된다 .

Page 23: 11 장 .  고급  C#  프로그래밍

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 을 각각 한번씩

호출해서 사용했다 .

Page 24: 11 장 .  고급  C#  프로그래밍

c#

11 장 . 고급 C# 프로그래밍

24 / 82

1. 속성

속성의 형식

속성은 get 접근자를 통해 필드 값을 돌려주고 , set 접근자를 통해 인자를 받아 필드 값을

변경하기도 하는데 , 경우에 따라 get 접근자를 사용하거나 set 접근자만을 사용하는

속성이 존재 할 수도 있다 .

기능적으로 속성을 크게 네가지로 나눌 수 있다 .

Page 25: 11 장 .  고급  C#  프로그래밍

c#

11 장 . 고급 C# 프로그래밍

25 / 82

1. 속성

속성의 종류

• Read-Write Property : get,set 두 개의 접근자 모두를 사용 하며 프로퍼티의 가장 일반적인 모습이다 .

• Read-Only Property : get 접근자만 프로퍼티 내 존재하여 ,

읽을 수만 있는 읽기전용 프로퍼티 .

• Write-Only Property : set 접근자만 사용하며 , 멤버 값을 쓰기 만 할 수 있는 프로퍼티 .

• Static Property : 클래스 레벨에 존재하는 프로퍼티로서 , 개체 를 만들지 않고도 사용이 가능하며 , this 키워드 사용이 불가능하 다 .

Page 26: 11 장 .  고급  C#  프로그래밍

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);

}}

Page 27: 11 장 .  고급  C#  프로그래밍

c#

11 장 . 고급 C# 프로그래밍

27 / 82

인덱서• 인덱서 (Indexer) 는 객체를 마치 배열인 것처럼 사용할

수 있는 특별한 메서드이다 .

•순서가 있는 여러 개의 필드들이 있을 때 , 또는 순서가 있는 어떤 값을 계산해 내는 기능이 있을 때 인덱서를 사용하면 첨자로 원하는 값을 편리하게 액세스 할 수 있다 .

Page 28: 11 장 .  고급  C#  프로그래밍

c#

11 장 . 고급 C# 프로그래밍

28 / 82

인덱서• 형식

지정자 타입 this[ 인수 ]{

get { return 값 ;}set { 값 변경 ; }

}

내부에 값을 읽고 쓰는 get, set 접근자 블록을 가지므로 프로퍼티와 유사하다 .

이름이 this 로 고정

액세스 대상인 첨자를 {}괄호 안의 인수로 전달한다 .

Page 29: 11 장 .  고급  C#  프로그래밍

c#

11 장 . 고급 C# 프로그래밍

29 / 82

2. 인덱스 인덱서 (indexer) 란 ?

인덱서의 특징

내부적으로 객체를 배열처럼 사용할 수 있게 해주는 일종의 연산자 이다 .

속성 (property) 과 마찬가지로 모습은 필드이지만 실제로는 메소드로 동작한다 .

• 필드처럼 보이지만 실제 동작은 메소드이다 .

• get , set 접근자에 의하여 표현된다

• this 키워드를 반드시 사용한다 .

• 배열에 접근 하는 것 처럼 [] 기호를 사용한다 .

Page 30: 11 장 .  고급  C#  프로그래밍

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 행 ) 이 실행된다 .

Page 31: 11 장 .  고급  C#  프로그래밍

c#

11 장 . 고급 C# 프로그래밍

31 / 82

2. 인덱스

인덱서의 사용

인덱서는 속성과는 다르게 this 키워드를 사용해서 구현한다 .

인덱서는 배열을 사용하는데 , 원래의 배열에서는 정수형 요소만 사용할 수 있으나 ,

인덱서에서 사용하는 배열의 요소는 구분이 가능한 자료형이라면 무엇이든지 가능하다 .

또한 인덱서는 오버라이딩이 가능하므로 여러 형식의 인덱서가 존재할 수 있다 .

Page 32: 11 장 .  고급  C#  프로그래밍

c#

11 장 . 고급 C# 프로그래밍

32 / 82

2. 인덱스

인덱서 사용 예제의 도식화

종류 (kind) 내용fruit apple

color blue

myFavorite( 해쉬 테이블 )

this( 메소드 )

입력 기능 명령어

출력 기능 명령어

IndexerTest( 클래스 )

Page 33: 11 장 .  고급  C#  프로그래밍

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 접근자 호출

Page 34: 11 장 .  고급  C#  프로그래밍

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 실행

Page 35: 11 장 .  고급  C#  프로그래밍

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” ;

Page 36: 11 장 .  고급  C#  프로그래밍

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 가 각각 출력된다 .

Page 37: 11 장 .  고급  C#  프로그래밍

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 접근자를 사용해서 변수 값

하나를 가져오거나 저장 하지만 , 인덱서는

예제와 같이 배열 형식의 변수를 사용할 수 있다 .

Page 38: 11 장 .  고급  C#  프로그래밍

c#

11 장 . 고급 C# 프로그래밍

38 / 82

3. 위임

위임

위임의 특징

위임이란 말의 원래 의미는 대리자 , 대신하는 사람을 의미

C# 에서 이벤트가 발생하였을 때 내부적으로 이벤트를 처리하기 위한 기술

• 위임의 구조는 함수의 포인터 ( 주소 ) 를 저장하는 구조이다 .

• 저장되는 함수의 원형과 위임 함수의 원형은 반드시 같아야 한다 .

• 객체지향의 속성 중에 다형성과 비슷한 작업을 수행할 수 있다 .

• 프로그램의 실행 시에 생성된다 .

Page 39: 11 장 .  고급  C#  프로그래밍

c#

11 장 . 고급 C# 프로그래밍

39 / 82

위임함수 (onClick) 선언

위임 실행 클래스 선언

위임 메소드 ( 마우스 클릭 ) 선언

위임 메소드 ( 키보드 클릭 ) 선언

위임 호출 클래스 선언

위임 메소드 ( 마우스 클릭 ) 호출

위임 메소드 ( 키보드 클릭 ) 호출

위임 코드의 도식화

Page 40: 11 장 .  고급  C#  프로그래밍

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 리턴형값 메소드 ( 인자목록 )

Page 41: 11 장 .  고급  C#  프로그래밍

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 는 이벤트가 발생했을 때 위임을 호출해서 이벤트에 알맞은 함수를 실행 해주는 클래스

Page 42: 11 장 .  고급  C#  프로그래밍

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)

마우스를 클릭하거나 키보드를 누를 때 위임에 의해 이 함수가 실행된다고 가정함

Page 43: 11 장 .  고급  C#  프로그래밍

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행 ) 에서 실행했다 .

이러한 원리로 , 위임은 계속 재정의되면서 발생하는 이벤트에 맞는 함수를 실행해 준다 .

Page 44: 11 장 .  고급  C#  프로그래밍

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.}

Page 45: 11 장 .  고급  C#  프로그래밍

c#

11 장 . 고급 C# 프로그래밍

45 / 82

4. 이벤트

4. 이벤트이벤트란 , 어떤 일이나 특별한 행위를 발생시키는 역할을 한다 .

예 ) 인터넷 익스플로러 실행 시

<뒤로 > 버튼 클릭 하면

이벤트가 발생하고 ,

웹페이지가 이전에 보았던 페이지로 이동하는 기능이 있는 함수를 호출

Page 46: 11 장 .  고급  C#  프로그래밍

c#

11 장 . 고급 C# 프로그래밍

46 / 82

4. 이벤트

4. 이벤트

<뒤로 > 버튼 객체

뒤로 가기 기능신호전달

익스플로러의 내부 움직임

<뒤로 > 버튼 클릭

이벤트 발생

사용자가 원하는 기능을 실행시키면 , 프로그램은 이벤트를 통해 전달받아 해당 기능을 실행시켜준다 .

즉 , 이벤트는 프로그램에서 상태가 변하거나 사건이 발생했을 때 이를 객체에게 알려주는 구조를 말한다 .

Page 47: 11 장 .  고급  C#  프로그래밍

c#

11 장 . 고급 C# 프로그래밍

47 / 82

4. 이벤트

이벤트 (event) 란 ?

이벤트의 특징

프로그램에서 어떠한 상태 , 사건이 발생하였을 때 ,

이 상태를 객체에게 알려주는 구조

• 위임의 집합 형태로 표현이 된다 .

• += , -= 의 연산을 사용하여 이벤트를 추가 ,삭제 한다 .

• 이벤트의 발생을 알려주는 Sender 와 Event 를 원하는 Subscriber 가 존재한다 .

• 일반함수를 호출하듯이 사용한다 .

Page 48: 11 장 .  고급  C#  프로그래밍

c#

11 장 . 고급 C# 프로그래밍

48 / 82

4. 이벤트

이벤트의 변수 선언 형식

[ 속성 ][ 변경자 ] 이벤트형식 이벤트변수명

public event onClick myClick;

위임 문법

delegate 리턴형값 메소드 (인자목록 )

delegate void onClick(string what);

Page 49: 11 장 .  고급  C#  프로그래밍

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 위임을 호출함

Page 50: 11 장 .  고급  C#  프로그래밍

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()) 모든 위임이 실행됨

이벤트의 추가는 += 연산자 사용한다 .이벤트 += 위임 ;

Page 51: 11 장 .  고급  C#  프로그래밍

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 행 ) 에서 이벤트를 실행할 때 넘겨주는 값인 “어떤”이란 문자열을 포함하게 된다 .

Page 52: 11 장 .  고급  C#  프로그래밍

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(" 어떤 ");

}

Page 53: 11 장 .  고급  C#  프로그래밍

c#

11 장 . 고급 C# 프로그래밍

53 / 82

5. 네임스페이스

네임스페이스

큰 프로그램 하나를 여러 사람이 동시에 나눠서 개발할 때 각자 개발한

클래스명이 중복될 수 있는데 , 이런 경우에 누구의 클래스인지 구분할 수

있는 기능이 필요하다 . 바로 이럴 때 사용하는 것이 네임스페이스

(Namespace) 이다 .

또한 자주 사용되는 기능을 클래스 하나에 정의하고 네임스페이스를

사용해서 이 클래스를 다른 클래스에서 불러서 손쉽게 사용할 수 있다 .

Page 54: 11 장 .  고급  C#  프로그래밍

c#

11 장 . 고급 C# 프로그래밍

54 / 82

5. 네임스페이스

네임스페이스

namespace 철수 {         public class ClassTest {         ……         } }

namespace 영희 {         public class ClassTest {         ……         } }

위의 예제에서 ClassTest 클래스를 사용할 때는 , 네임스페이스명 . 클래스명으로

구분한다 .

철수 .ClassTest, 영희 .ClassTest

같은 ClassTest 명칭이 2곳에서 사용

Page 55: 11 장 .  고급  C#  프로그래밍

c#

11 장 . 고급 C# 프로그래밍

55 / 82

5. 네임스페이스

네임스페이스의 개념이 없었을 경우

다른 한 사람의 클래스명을 바꾼다

처음부터 클래스명을 길게 만들어 중복될 가능성을 줄인다

클래스명 앞에 만든 사람이나 단체명을 붙인다

위와 같이 하면 프로그램이 복잡해진다 . 네임스페이스를 사용하면 프로그램을 좀 더 유용하게 작성할 수 있다 .

Page 56: 11 장 .  고급  C#  프로그래밍

c#

11 장 . 고급 C# 프로그래밍

56 / 82

5. 네임스페이스

네임스페이스의 범위

C# 에서 클래스 하나는 오직 파일 하나에서만 만들 수 있다 .

네임스페이스는 여러 파일에서 동일한 네임스페이스를 사용할 수 있다 .

네임스페이스는 또 다른 네임스페이스 안에 존재할 수 있다 .

namespace 철수{ namespace 영희 { public class ClassTest { } }}

namespace 철수 .영희{ public class ClassTest { }}

네임스페이스 사용 방법

( 중첩 가능 )

점 (.)연산자 이용(큰규모 네임스페이스 . 작은규모네임스페이스 )

* 네임스페이스는 public 접근자로 자동 생성됨

Page 57: 11 장 .  고급  C#  프로그래밍

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 네임스페이스 . 클래스명 ();

Page 58: 11 장 .  고급  C#  프로그래밍

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 행과 같이 네임스페이스 생략 시 오류 발생

Page 59: 11 장 .  고급  C#  프로그래밍

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(); } }}

Page 60: 11 장 .  고급  C#  프로그래밍

c#

11 장 . 고급 C# 프로그래밍

60 / 82

5. 네임스페이스

using 지시자 사용하기

네임스페이스가 다른 경우는

인스턴시 생성시

‘네임스페이스명 . 클래스명’ 과 같이 네임스페이스 경로까지 지정 필요

프로그램의 소스가 길어지고 읽기도 복잡해짐

위의 단점 보안하기 위해서 using 사용

Page 61: 11 장 .  고급  C#  프로그래밍

c#

11 장 . 고급 C# 프로그래밍

61 / 82

5. 네임스페이스

using 지시자의 사용

using 지시자를 통해서 사용할 네임스페이스를 한번만 지정해주면 , 일일이 네임스페이스 경로를

지정할 필요가 없다

• using 지시자의 뒤에는 단지 , 네임스페이스명만 올 수 있다 .

• using 지시자의 뒤에 클래스는 지정할 수 없다 .

• 프로그램의 가장 첫 부분에 선언하여 준다 .

• 지역선언으로서 , namespace 의 가장 첫 줄에 선언하여도 된다 .

Page 62: 11 장 .  고급  C#  프로그래밍

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 로 사용 가능

Page 63: 11 장 .  고급  C#  프로그래밍

c#

11 장 . 고급 C# 프로그래밍

63 / 82

6. 어셈블리

어셈블리 (assembly) 의 정의

프로그램 실행 : 확장자 .exe 인 파일 더블 클릭 ( .exe 파일이 실행파일

임 )

C# 에서도 확장자가 .exe 인 실행 파일 생성 가능하고 , 다른 프로그램의 한

부분으로 사용할 수 있는 .dll 파일 생성가능

프로그램의 실행단위를 어셈블리 (assembly) 라고 함 .

앞에서 예로 든 파일들은 모두 확장자가 .cs 이다 .

.cs 파일을 C# 에서는 csc 명령을 이용하여 컴파일 가능

csc 명령은 .exe 파일과 .dll 파일로 컴파일 할 수 있다 .

.exe 파일은 자신이 직접 실행되는 파일이고 , .dll 파일은 다름 프로그램의 한

부분으로 사용할 수 있도록 프로그램을 부품화 할 때 사용한다 .

Page 64: 11 장 .  고급  C#  프로그래밍

c#

11 장 . 고급 C# 프로그래밍

64 / 82

6. 어셈블리

어셈블리 (assembly) 의 정의

예 ) 전자계산기 역할을 하는 프로그램

.exe 로 만들 시 : 프로그램 자체가 전자계산기 프로그램 임

.dll 로 만들 시 : 전자계산기 역할이 필요한 프로그램에서 .dll 을

가져다 사용할 수 있다 .

• 프로그램의 기능을 부품처럼 개발해서 , 다른 프로그램에서 사용할 수

있도록 설계한 프로그램을 컴포넌트 (component) 라고 한다 .

• C# 으로 개발한 .dll 파일 자체가 작은 컴포넌트라 할 수 있다 .

Page 65: 11 장 .  고급  C#  프로그래밍

c#

11 장 . 고급 C# 프로그래밍

65 / 82

6. 어셈블리

어셈블리 (assembly) 의 구조

어셈블리는 자체적으로 실행 가능한 실행 코드가 있고 ,

어셈블리에는 메타 데이터가 있다 .

메타 데이터 : 다른 프로그램이 어셈블리 안에 정의되어 있는 객체의

클래스 , 메소드 , 속성 등을 참조할 때 필요한 정보를 담고 있는 것

메타 데이터를 통해서 , .dll 파일이 다른 프로그램에 쓰일 때 어떤 클래스가

어떤 일을 하는지 , 해당 프로그램에게 정보를 넘겨 주는 것이다 .

이러한 메타 데이터를 다른말로 매니페스트 (manifest) 라고도 한다 .

매니페스트는 어셈블리에 포함된 객체들과 더불어 어셈블리가 사용하는 또

다른 어셈블리가 존재한다면 이러한 어셈블리의 몇몇 정보도 포함하고 있다 .

Page 66: 11 장 .  고급  C#  프로그래밍

c#

11 장 . 고급 C# 프로그래밍

66 / 82

6. 어셈블리

어셈블리 (assembly) 의 구조

어셈블리의 또 다른 구성요소는 형식 메타 데이터로 , 이는 어셈블리 안에

존재하는 클래스 , 속성 , 메소드 , 변수 등에 대한 데이터 형식에 대한 정보를

포함한다 .

그 다음으로 각 형식에 대한 실제 실행 파일인 MSIL(Microsoft Intermedi-

ate Language) 이 있으며 , 마지막으로 해당 어셈블리가 사용하는 리소스가

있다 . 리소스에는 해당 프로그램이 사용하는 이미지나 아이콘 등이 존재한

다 .

Page 67: 11 장 .  고급  C#  프로그래밍

c#

11 장 . 고급 C# 프로그래밍

67 / 82

6. 어셈블리

어셈블리 (assembly) 란 ?

.exe , .dll 과 같은 프로그램의 제일 작은 실행 단위

Page 68: 11 장 .  고급  C#  프로그래밍

c#

11 장 . 고급 C# 프로그래밍

68 / 82

6. 어셈블리

어셈블리의 구성

ILDASM 도구의 파일 확장자

* 메니페스트 – 다른 어셈블리를 참조한다면 그 정보를 가지고 있다 .

* 형식 메타 데이터 – 어셈블리안에 존재하는 클래스 , 속성 , 메소드 , 변수등에 대한 정보

* MSIL(Microsoft Intermediate Language) – 실제 실행 파일

* 리소스 – 어셈블리가 사용하는 리소스이며 , 해당 프로그램의 이미지나 아이콘이 존재

.assembly :

.class : 해당 어셈블리 내에 존재하는 클래스 파일의 정보를 보여준다 .

.method : 해당 어셈블리 내에 존재하는 메소드의 정보를 보여준다 .

.ctor : constructor 파일의 약자로 , 생성자를 의미한다 .

Page 69: 11 장 .  고급  C#  프로그래밍

c#

11 장 . 고급 C# 프로그래밍

69 / 82

6. 어셈블리

어셈블리 작성하기

프로젝트 클릭

Page 70: 11 장 .  고급  C#  프로그래밍

c#

11 장 . 고급 C# 프로그래밍

70 / 82

6. 어셈블리

어셈블리 작성하기

1. Visual C# 선택2. 클래스 라이브러리 선택 (템플릿 )3. 이름 : Calc 입력4. 위치 : C\Csharp\Chap115. 확인 클릭

Page 71: 11 장 .  고급  C#  프로그래밍

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 로 만든 후 , 필요한 프로그램에서 호출해서 사용

Page 72: 11 장 .  고급  C#  프로그래밍

c#

11 장 . 고급 C# 프로그래밍

72 / 82

6. 어셈블리

어셈블리 작성하기Calc 빌드 클릭 (.dll 만들기 )

Page 73: 11 장 .  고급  C#  프로그래밍

c#

11 장 . 고급 C# 프로그래밍

73 / 82

6. 어셈블리

어셈블리 작성하기

C:\Csharp\Chap11\Calc\obj\Debug

만들어진 Calc.dll 확인

Page 74: 11 장 .  고급  C#  프로그래밍

c#

11 장 . 고급 C# 프로그래밍

74 / 82

6. 어셈블리

어셈블리의 내용 살펴보기

각 어셈블리는 자신의 정보를 메타데이터에 담아 간직한다 ..dll 정보 조회 가능 어셈블리의 내용을 살펴 볼 때는 닷넷 프로임워크 ILDASM(.NET

Framework Intermediate Language DisASseMbler) 도구 사용( 비주얼 스튜디오 닷넷 설치시 자동으로 설치됨 )

사용 방법 : 외부도구로 추가한 다음 사용 가능

Page 75: 11 장 .  고급  C#  프로그래밍

c#

11 장 . 고급 C# 프로그래밍

75 / 82

6. 어셈블리

어셈블리의 내용 살펴보기

외부도구 클릭

Page 76: 11 장 .  고급  C#  프로그래밍

c#

11 장 . 고급 C# 프로그래밍

76 / 82

6. 어셈블리

어셈블리의 내용 살펴보기추가 클릭

Page 77: 11 장 .  고급  C#  프로그래밍

c#

11 장 . 고급 C# 프로그래밍

77 / 82

6. 어셈블리

어셈블리의 내용 살펴보기

Page 78: 11 장 .  고급  C#  프로그래밍

c#

11 장 . 고급 C# 프로그래밍

78 / 82

6. 어셈블리

어셈블리의 내용 살펴보기 1. 제목 : ILDASM 입력2. 명령 : … 클릭

Page 79: 11 장 .  고급  C#  프로그래밍

c#

11 장 . 고급 C# 프로그래밍

79 / 82

6. 어셈블리

어셈블리의 내용 살펴보기

C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin\ildasm.exe

1. ildasm.exe 선택2. 확인 클릭

Page 80: 11 장 .  고급  C#  프로그래밍

c#

11 장 . 고급 C# 프로그래밍

80 / 82

6. 어셈블리

어셈블리의 내용 살펴보기ILDASM 클릭

Page 81: 11 장 .  고급  C#  프로그래밍

c#

11 장 . 고급 C# 프로그래밍

81 / 82

6. 어셈블리

어셈블리의 내용 살펴보기

열기 클릭

Page 82: 11 장 .  고급  C#  프로그래밍

c#

11 장 . 고급 C# 프로그래밍

82 / 82

6. 어셈블리

어셈블리의 내용 살펴보기Calc.dll 선택 후 열기 클릭

Page 83: 11 장 .  고급  C#  프로그래밍

c#

11 장 . 고급 C# 프로그래밍

83 / 82

6. 어셈블리

어셈블리의 내용 살펴보기

1. 소스에서 정의한 메소드 모두 보임2. MANIFEST 더블 클릭

Page 84: 11 장 .  고급  C#  프로그래밍

c#

11 장 . 고급 C# 프로그래밍

84 / 82

6. 어셈블리

어셈블리의 내용 살펴보기

해당 클래스의 메타데이터 정보를 포함하고 있음

Page 85: 11 장 .  고급  C#  프로그래밍

c#

11 장 . 고급 C# 프로그래밍

85 / 82

6. 어셈블리

어셈블리 활용하기프로젝트 클릭

Page 86: 11 장 .  고급  C#  프로그래밍

c#

11 장 . 고급 C# 프로그래밍

86 / 82

6. 어셈블리

어셈블리 활용하기

1. Visual C# 클릭2. 콘솔 응용 프로그램 선택3. 이름 : UsingCalc.cs 입력4. 확인 클릭

Page 87: 11 장 .  고급  C#  프로그래밍

c#

11 장 . 고급 C# 프로그래밍

87 / 82

6. 어셈블리

어셈블리 활용하기

솔루션 탐색기 클릭 (탐색기 창 보기 )

Page 88: 11 장 .  고급  C#  프로그래밍

c#

11 장 . 고급 C# 프로그래밍

88 / 82

6. 어셈블리

어셈블리 활용하기

참조 추가 클릭

Page 89: 11 장 .  고급  C#  프로그래밍

c#

11 장 . 고급 C# 프로그래밍

89 / 82

6. 어셈블리

어셈블리 활용하기 1. Calc.dll 클릭2. 확인 클릭

Page 90: 11 장 .  고급  C#  프로그래밍

c#

11 장 . 고급 C# 프로그래밍

90 / 82

6. 어셈블리

어셈블리 활용하기Calc.dll 이 정상적으로 참조가 됨

1. Program.cs 더블 클릭

Page 91: 11 장 .  고급  C#  프로그래밍

c#

11 장 . 고급 C# 프로그래밍

91 / 82

6. 어셈블리

어셈블리 활용하기

코딩 할 내용 ( 다음 페이지 )

Page 92: 11 장 .  고급  C#  프로그래밍

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)

Page 93: 11 장 .  고급  C#  프로그래밍

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));

} } }}

실행 후 결과 확인

Page 94: 11 장 .  고급  C#  프로그래밍

c#

11 장 . 고급 C# 프로그래밍

94 / 82

요약• 속성이란 클래스를 함수적 동작에 의해서 , 표현하는

구성요소이다 .

• 인덱스는 내부적으로 객체를 배열처럼 사용할 수 있게 해주는 일종의 연산자와 같다 .

• 위임은 함수의 포인터를 사용해서 호출을 다른 함수로 넘길 수 있는 구조를 포함하고 있다 .

Page 95: 11 장 .  고급  C#  프로그래밍

c#

11 장 . 고급 C# 프로그래밍

95 / 82

요약• 이벤트란 프로그램에서 어떠한 상태 , 사건이 발생했을

때 이를 객체에게 알려주는 구조를 말하는 것이다 .

• 네임스페이스는 중복 가능성이 있거나 , 자주 사용되는 클래스에 명칭을 부여함으로써 , 해당 클래스의 중복을 막고 , 다른 클래스에서도 손쉽게 호출해서 사용할 수 있게 해준다 .

• using 지시자를 통해서 사용할 네임스페이스를 한 번만 지정해주면 , 일일이 네임스페이스 경로를 지정할 필요가 없다 .

Page 96: 11 장 .  고급  C#  프로그래밍

c#

11 장 . 고급 C# 프로그래밍

96 / 82

요약• 어셈블리는 매니페스트 , 형식메타데이터 , MSIL,

리소스로 구성되어 있다 .

• 비ㅈ주얼 스튜디오 닷넷에서 클래스 라이브러리로 개발한 .dll 파일은 그 기능이 필요한 프로그램을 작성할 때 참조 명령을 통해서 사용될 수 있다 .

• 비주얼 스튜디오 닷넷에서 ILDASM 도구를 사용해서 어셈블리 파일인 .dll 파일의 구조를 자세히 관찰할 수 있다 .