반응형

C# 추천 19

[C#] 10. .NET 어셈블리 - 모듈 작성

10. .NET 어셈블리 10.6 모듈 작성 이번에는 .NET 어셈블리의 부속이 될 수 있는 모듈을 작성하는 방법울 알아봅시다. 그리고 모듈을 포함하는 .NET 어셈블리도 만들어 봅시다. 모듈은 Visual Studio 명령 프롬프트에서 csc 명령어를 이용하여 컴파일해야 합니다. 먼저 간단한 소스 코드를 편집한 후에 모듈을 만듭시다. ▶ 모듈로 만들 코드(Foo.cs) namespace DemoModule { public class Foo { public string Name { get; private set; } public Foo(string name) { Name = name; } public override string ToString() { return Name; } } } 그리고 Visual..

[C#] 10. .NET 어셈블리 - XML 문서 파일

10. .NET 어셈블리 10.5 XML 문서 파일 이번에는 라이브러리를 만들 때 사용하는 곳에서 Microsoft Visual Studio의 인텔리센스 기능을 활용할 수 있게 해 봅시다. 프로젝트 속성 창에서 빌드 탭을 선택하여 XML 문서 파일을 체크하세요. [그림 56] XML 문서 파일 출력 설정 그리고 빌드하면 공개된 멤버 형식에 주석이 없다는 경고 메시지가 나타납니다. XML 문서 파일 출력을 설정하면 가시성이 public인 형식과 멤버에 대한 세 줄 주석으로 XML 양식에 맞는 설명이 없으면 경고 메시지가 뜹니다. 다음과 같이 코드를 약간 변경한 후에 주석을 달아봅시다. ▶ XML 양식에 맞게 세 줄 주석 달기 DemoLib 데모 클래스 Foo 메서드 첫 번째 인자 두 번째 인자 첫 번째 인..

[C#] 10. .NET 어셈블리 - 공용 어셈블리

10. .NET 어셈블리 10.4 공용 어셈블리 공용 어셈블리는 전역 어셈블리 캐시(윈도우즈 설치 폴더의 하위 폴더명이 Assembly인 폴더를 말함)에 있는 어셈블리를 말합니다. 전역 어셈블리 캐시에는 파일명과 확장자가 같더라도 어셈블리의 강력한 이름이 다르다면 배포할 수 있습니다. [그림 50] 전역 어셈블리 캐쉬*운영체제 버전에 따라 전역 어셈블리 캐쉬 폴더가 다릅니다.* 강력한 이름은 어셈블리 이름, 버전 번호, 문화권, 어셈블리 ID, 공개 키, 디지털 서명 등으로 구성됩니다. 이처럼 전역 어셈블리 캐시에는 같은 이름의 DLL도 강력한 이름이 다르면 배포할 수 있습니다. 이로써 서로 다른 버전을 사용하는 응용 프로그램들이 자신에게 맞는 어셈블리를 사용할 수 있는 것입니다. 이를 병행(Side b..

[C#] 10. .NET 어셈블리 - 전용 어셈블리

10. .NET 어셈블리 10.3 전용 어셈블리 이번에는 앞에서 만든 어셈블리를 전용으로 사용하는 방법에 대해 살펴보기로 합시다. 전용 어셈블리는 사용하는 응용 프로그램과 함께 어셈블리를 배포하여 해당 응용 프로그램에 의해서만 이용되는 어셈블리를 말합니다. 배포하는 위치는 응용 프로그램과 같은 디렉토리이거나 하위 디렉토리가 됩니다. 그리고 .NET에서 어셈블리 배포 방법은 기본으로 전용으로 되어 있어서 통합 개발 환경인 Microsoft Visual Studio를 가지고 개발할 때 특정 어셈블리를 참조하고 컴파일하면 자동으로 참조하는 어셈블리를 출력 폴더로 복사해 주어 개발자에게 편의성을 제공하고 있습니다. 솔루션 탐색기에서 참조 폴더에 마우스 우측 버튼을 클릭하여 나오는 컨텍스트 메뉴에서 참조 추가를 ..

[C#] 10. .NET 어셈블리 - 어셈블리 만들기

10. .NET 어셈블리 10.2 어셈블리 만들기 여기서는 .NET 어셈블리를 만들어 보기로 합시다. .NET 어셈블리 중에 실행 파일을 만드는 것은 이미 알고 있으므로 라이브러리를 만드는 것을 하겠습니다. 그리고 다중 파일 어셈블리의 부속이 되는 모듈도 만들어 보기로 합시다. 10.2.1 라이브러리 제작 .NET에서 라이브러리는 쉽게 제작할 수 있습니다. 코드를 작성하는 부분에서 다른 어셈블리에서 사용할 수 있는 형식을 정의할 때 public 키워드를 명시하기만 하면 됩니다. 멤버도 마찬가지로 다른 어셈블리에서 접근을 허용하게 하려면 접근 지정을 public으로 하면 됩니다. 즉, 다른 어셈블리에 정의된 형식이나 멤버 중에 사용할 수 있는 형식과 멤버는 접근 지정이 public으로 되어 있다는 것 말고..

[C#] 9. 대리자와 이벤트 - 이벤트

9. 대리자와 이벤트 9.2 이벤트 이벤트는 특정 사건이 발생하는 것을 감시하는 개체가 이를 처리하는 개체에게 이벤트가 발생하였을 때 필요한 인자들과 함께 발생 사실을 통보하기 위한 특별한 멤버입니다. 이벤트를 감시하여 다른 개체에게 발생한 사실을 통보하는 개체를 이벤트 게시자라고 하며 이벤트가 발생하였을 때 이벤트 게시자로부터 통보받아 처리하는 개체를 이벤트 구독자라고 합니다. C#에서 이벤트는 대리자 멤버를 캡슐화할 때 event 키워드를 명시하면 됩니다. 그리고 이벤트로 만들기 위해 정의한 대리자는 이벤트를 통보한 개체와 이벤트 처리에 필요한 인자를 포함하여 시그니쳐를 정의하도록 가이드하고 있습니다. ▶ 이벤트를 위한 대리자 정의 class AddMemberEventArgs:EventArgs { p..

[C#] 9. 대리자와 이벤트 - 대리자

9. 대리자와 이벤트 대리자는 메서드의 시그니쳐를 정의하는 형식으로 콜백 처리 등에서 자주 사용됩니다. 그리고 event 키워드를 명시하여 캡슐화한 대리자를 이벤트라 말합니다. 이벤트는 특정 상황이 발생하였는지를 감시하는 개체가 다른 개체에게 발생한 사실을 통보하여 처리하기 위해 캡슐화한 대리자(event 키워드를 명시한 대리자)를 말합니다. 결국 이벤트는 대리자라고 볼 수 있습니다. 9.1 대리자 대리자는 알고리즘을 개체화하여 인자로 전달할 때 사용되는 형식입니다. 이에 대리자를 정의할 때는 알고리즘에 필요한 인자와 리턴 형식을 명시하여 정의합니다. delegate [리턴 형식] [대리자 형식 이름] ( [입력 인자 리스트] ); 개발자가 대리자 형식을 정의하면 컴파일러는 MulticastDelegat..

[C#] 8.2 컬렉션 - IDictionary 인터페이스

8.2 컬렉션 8.2.4 IDictionary 인터페이스 IDictionary 인터페이스는 키와 값을 쌍으로 보관하는 컬렉션들의 기반 형식입니다. 그리고 IList 인터페이스처럼 IDictionary 인터페이스도 ICollection 인터페이스를 기반으로 정의한 형식입니다. IDictionary 인터페이스에는 키와 값을 쌍으로 보관할 때 사용하는 Add 메서드를 제공하고 있으며 내부 규칙에 따라 보관될 위치를 결정하게 됩니다. 따라서 IList 인터페이스와 다르게 특정 위치에 보관하는 Insert 메서드는 제공하지 않습니다. 그리고 IDictionary 인터페이스에는 같은 키를 가진 요소를 보관할 수 없습니다. 만약, Add 메서드를 이용하여 같은 키를 가진 요소를 보관하려고 시도하면 예외가 발생합니다...

[C#] 8.2 컬렉션 - IList 인터페이스

8.2 컬렉션 8.2.3 IList인터페이스 IList 인터페이스는 배열과 ArrayList의 기반 인터페이스입니다. IList 인터페이스에는 인덱서로 요소를 참조할 수 있는 멤버들을 약속하고 있습니다. 그리고 IList는 ICollection 인터페이스 기반의 형식이므로 앞에서 살펴본 ICollection에 약속한 멤버들에 대한 약속을 포함하게 됩니다. 여기에서는 새롭게 추가된 약속들에 대해서만 다룰게요. ICollection 인터페이스에서는 요소를 추가할 때 사용하기 위해 Add 메서드와 Insert 메서드를 제공하고 있습니다. Add 메서드는 차례대로 보관할 때 사용하고 Insert 메서드는 원하는 인덱스 위치에 보관할 때 사용합니다. int Add(object value); //요소를 추가하는 메..

[C#] 7.4 프로젝트 구현 - 초점이 도서관 (책 읽기, 세미나)

7.4 프로젝트 구현 초점이 도서관 (책 읽기, 세미나) [그림] 세미나 시퀀스 다이어그램 [그림] 책 읽기 시퀀스 다이어그램 이번에는 초점이 도서관에 왔을 때 수행하는 세미나와 책 읽기에 대한 부분을 구현하기로 합시다. 앞에서 초점이 강의실에 왔을 때 수행하는 부분과 구현하는 방법이 크게 다르지 않겠지요. class Library:Place { ... 중략 ... internal override void DoIt(int cmd) { switch (cmd) { case GameRule.CMD_LI_Seminar: StartSeminar(); break; default: return; } } private void StartSeminar() { int cnt = GetStuCount(); Student s..

반응형