반응형

C# 소스 코드 57

[C#] 12. 직렬화와 리플렉션 - 선별적 직렬화

12.1.1 선별적 직렬화 C#에서는 형식 내부의 멤버 필드 중에서 직렬화와 역직렬화에 포함하지 않게 선별적 직렬화를 제공합니다. 선별적 직렬화는 멤버 필드에만 적용할 수 있는데 직렬화 대상에서 빼고 싶은 멤버 위에 NonSerialized 어튜리뷰트를 지정합니다. 예를 들어 사용자가 로그인하여 게임을 진행할 때 공부한 시간이 5이면 아이큐를 증가한다고 가정합시다. 만약 사용자가 로그아웃하면 공부한 시간은 사라지고 다시 로그인 하면 다시 0부터 시작하게 합시다. 직렬화와 역직렬화를 이용한다면 공부한 시간을 직렬화 대상에서 배제합니다. [Serializable] class Unit { [NonSerialized] int scnt;//공부한 횟수 internal string Name { get; privat..

[C#] 12. 직렬화 및 리플렉션 - 직렬화

12. 직렬화 및 리플렉션 직렬화란 프로세스의 개체 정보를 선형적(연속적인 선의 형태)으로 다른 매체에 기록 혹은 전송하는 것을 말합니다. 그리고 다른 매체의 정보를 읽어나 수신하여 프로세스의 개체를 만드는 것을 역직렬화라 부릅니다. 이번 장에서는 C#에서 제공하는 직렬화와 역직렬화를 사용하여 파일 입출력하는 예를 살펴볼게요. 그리고 리플렉션은 형식 정보를 이용하여 개체를 생성하거나 메서드 등을 사용하는 것을 말합니다. 특히 프로그램 동작 중에 명시적으로 라이브러리를 로딩하여 사용할 때 리플렉션을 사용합니다. 12.1 직렬화 C#에서는 ISerializable 어튜리뷰트를 제공하고 있으며 이를 사용하면 별다른 작업없이 직렬화할 수 있습니다. 직렬화하려면 어느 개체 정보를 직렬화할 것인지 어느 매체에 직렬..

[소프트웨어 접근성] 초점 제어기 만들기 실습

[소프트웨어 접근성] 초점 제어기 만들기 실습 이번에는 SetFocus 메서드를 이용하여 원하는 자동화 요소로 초점을 옮기는 프로그램을 작성합시다. [그림] 초점 제어기 실행화면 초점 제어기를 만들기 전에 타겟 데모 응용 프로그램을 만들기로 합시다. 타겟 데모 응용 프로그램은 12개의 버튼이 있고 1개의 Label이 있습니다. 이 프로그램은 버튼에 초점이 오면 어느 버튼에 초점이 왔는지 Label에 표시하는 응용 프로그램입니다. 먼저 Windows Forms 응용 프로젝트를 생성하세요. 그리고 Form1에 버튼 12개와 Label 1개를 배치하세요. 그리고 Label의 이름 속성을 lb_focus로 설정합니다. Fom1의 FormLoad 이벤트 핸들러를 추가하여 각 버튼에 초점이 왔을 때 lb_focus..

[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#] 9. 대리자와 이벤트 - 이벤트

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

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

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

[C#] 8.2 컬렉션 - IComparable 인터페이스와 IComparer 인터페이스

8.2 컬렉션 8.2.5 IComparable 인터페이스와 IComparer 인터페이스 IComarable 인터페이스와 IComparer 인터페이스는 개체의 값 비교를 제공하기 위해 정의되었습니다. C#의 컬렉션은 대부분 Sort 메서드를 제공하는데 IComparable 인터페이스 기반의 요소를 보관하고 있을 때 정상적으로 동작하고 그렇지 않으면 예외를 발생합니다. 그리고 IComparer 개체를 입력 인자로 받는 Sort 메서드가 중복 정의되어 있는데 정렬하는 과정에서 입력 인자로 받은 IComparer 개체를 이용합니다. 또한, C#의 System에 정의되어 있는 기본 형식들은 ICompable 인터페이스를 기반으로 정의되어 있어서 기본 형식을 보관한 컬렉션은 Sort 메서드를 이용하여 정렬할 수 있..

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

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

반응형