반응형

언어 자료구조 알고리즘/Escort C# 68

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

12.2 리플렉션 리플렉션은 프로그램 런타임에 형식의 멤버를 반영하는 기술입니다. 이 기술은 명시적으로 라이브러리를 로딩하여 사용할 때 이용합니다. 리플렉션을 이용하여 명시적 라이브러리 로딩하여 사용하는 것을 보여주기 위해 다음의 클래스를 정의한 라이브러리를 작성합시다. 솔루션 이름을 리플렉션으로 정하고 ManLib 이름의 클래스 라이브러리 프로젝트를 추가하세요. [그림 12.2] 솔루션 생성 그리고 ManLib에 기본으로 제공하는 Class1.cs 파일명을 Man.cs로 변경하세요. Microsoft Visual Studio.NET은 자동으로 클래스 이름을 Man으로 변경합니다. 테스트를 Man 형식을 정의합시다. using System; namespace ManLib { public class Man..

[C#] 12. 직렬화와 리플렉션 - 사용자 지정 직렬화

12.1.2 사용자 지정 직렬화 C#에서는 직렬화할 때 메터데이터 부분을 개발자가 정한 이름으로 직렬화할 수 있게 사용자 지정 직렬화를 제공합니다. 사용자 지정 직렬화하려면 ISerializable 인터페이스를 기반으로 정의해야 합니다. [Serializable] class Man:ISerializable 그리고 ISerializable에 기능 약속한 GetObjectData 메서드를 정의합니다. public void GetObjectData(SerializationInfo info, StreamingContext context) { 직렬화할 대상을 SerializationInfo 개체의 AddValue 메서드를 이용하여 원하는 이름으로 값을 추가합니다. info.AddValue("이름", Name); ..

[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 어튜리뷰트를 제공하고 있으며 이를 사용하면 별다른 작업없이 직렬화할 수 있습니다. 직렬화하려면 어느 개체 정보를 직렬화할 것인지 어느 매체에 직렬..

[C#] 11. 예외 처리 - 파생 관계의 예외 잡기

11.3 파생 관계의 예외 잡기 C#의 예외 처리구문에서는 하나의 try 블록 뒤에 여러 개의 catch 블록을 지정할 수 있습니다. 그리고 catch 블록에서는 앞에 배치한 곳에서 예외를 받아서 처리하면 뒤에 있는 catch 블록은 수행하지 않습니다. 예를 들어 try 블록 뒤에 Exception 개체를 받아 처리하는 catch 블록과 SystemException 개체를 받아 처리하는 catch블록을 지정했다고 가정합시다. 기반 형식 변수로 파생 형식 개체를 참조할 수 있기 때문에 어떠한 예외가 발생해도 앞에 배치한 catch 블록에서 예외를 받아 처리하고 뒤에 배치한 catch 블록은 동작하지 않습니다. 따라서 여러 개의 catch 블록을 배치할 때 파생 형식을 처리하는 catch 블록부터 배치해야 ..

[C#] 11. 예외 처리 - 예외 클래스

11.2 예외 클래스 C#에서 throw 뒤에 올 수 있는 형식은 반드시 Exceptaion 형식 개체이거나 Exceptaion 형식을 기반으로 파생한 형식 개체여야 합니다. 이와 같은 문법적 제약은 개발자가 프로그래밍하기 어렵게 만들기 보다는 오히려 논리적 버그를 잡는데 도움을 줍니다. Exception 클래스에는 예외 발생 이유를 나타내는 메시지와 예외 발생 소스, 예외 발생한 위치의 코드를 수행하기까지의 스택 역추적 정보를 제공합니다. 따라서 개발자가 Exception 클래스를 기반으로 예외 클래스를 정의하면 기반 형식인 Exception 클래스에서 제공하는 정보를 별도의 구현없이 제공할 수 있습니다. static void Main(string[] args) { try { Demo demo = ne..

[C#] 11. 예외 처리 - 예외처리 구문

11. 예외 처리 이번에는 C#언어의 예외 처리를 알아봅시다. 프로그램이 잘못 동작하는 이유를 살펴보면 사용자가 잘못 사용하거나 개발자가 논리적 버그가 있는 코드를 작성하거나 프로그램이 동작할 수 있는 조건을 만족하지 못하는 등의 이유가 있습니다. 보통 사용자가 잘못 사용하는 것을 에러라고 말하며 개발자가 논리 전개를 잘못한 것을 버그, 프로그램이 동작할 수 없는 조건일 때 예외라고 말합니다. C#의 예외 처리는 프로그램이 더 이상 진행할 수 없는 상태에 도달했을 때 처리하는 방법입니다. 그럼에도 불구하고 C#의 예외 처리를 이용하면 사용자의 실수를 대처하기 위한 방법이나 개발자의 논리적 버그를 확인하기 위한 목적으로도 사용합니다. 11.1 예외 처리 구문 C#의 예외 처리 구문은 try-catch-fi..

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

반응형