6장 - BCL - 2

2014. 12. 8. 00:28IT Books/시작하세요 C# 프로그래밍

System.String


문자열 비교시 대소문자 구분용 오버로드 함수

EndsWith, IndexOf, StartsWith이 메서드들에 StringComparison.OrdinalIgnoreCase를 전달하면 구분없이 비교.


System.Text.StringBuilder

닷넷에서 string은 불변객체이다.

때문에 string에 관련된 모든 변환은 새로운 메모리 할당을 발생시킨다.


StringBuilder는 내부에 일정한 양의 메모리를 미리 할당하고

추가되는 문자열이 할당해 놓은 양보다 많아지면 새롭게 여유분을 할당한다.

ToString을 호출하면 연속적으로 연결된 하나의 문자열로 반환한다.


System.Text.Encoding

우리가 컴퓨터화면에서 보는 문자는 단지 특정 기호나 숫자의 대체품일뿐.

국가별, 기능별 어떤 약속에 의해서든 규약에 의해서든 바뀔 수 있다.

이런 복잡한 언어코드를 위해 BCL에서는 Encoding 타입을 제공.


직렬화

프로그램에 쓰이는 데이터는 엄밀히 말해 byte 데이터.

좁은 의미로 일련의 바이트 배열로 변환하는 작업을 직렬화 (Serialization).

바이트배열로부터 원래의 데이터로 복원하는 과정을 역직렬화 (Deserialization)


System.BitConverter

문자열은 인코딩 방식에 따라 같은 문자열이라도 직렬화를 거치면 결과가 달라질 수 있다.

그러나 기본 타입은 변환 방법이 고정되어 있다.


리틀 엔디안, 빅 엔디안


System.IO.MemoryStream




위 코드에서 보듯이 내부 Positjon값에 따라 직렬화를 할 수 있고 이것이 Stream의 특징.

Stream을 상속받은 모든 타입의 기본 동작이 같다.


System.IO.StreamWriter / System.IO.StreamReader


스트림에 문자열 데이터를 쓰려면 반드시 Encoding타입을 이용해 바이트 배열로 변환해야함.



이런 식의 변환은 번거로우므로 BCL에는 StreamWriter가 있음.




생성자에 인코딩 방식을 정하면 나머지는 자동으로 진행하며
문자열이 아니어도 ToString()을 호출하여 변환한 문자열을 써 준다.

Flush가 있는 이유는

매번 Stream에 데이터를 쓰는 것이 비효율적이므로 내부적으로 속도 향상을 위한

바이트 배열을 유지하는데 일정 양을 넘어야 스트림에 기록한다.

이를 수동으로 스트림에 쓰게 하는 역할을 하기 때문이다.



System.IO.BinaryWriter / System.IO.BinaryReader


2진 데이터로 입출력하며 문자열에 대해서는 무조건 UTF-8로 처리한다.



System.Runtime.Serialization.Formatters.Binary.BinaryFormatter


class와 같은 사용자 정의형은 별도의 직렬화 클래스를 제공한다.

BinaryFormatter인데 사용자 측에서 해당 클래스에 [Serializable] 특성을 지정해야 한다.




특성이 지정되면 모든 필드를 대상으로 직렬화함.

특정 필드만 제외하고 싶을 땐 그 필드에다가

[NonSerialized] 특성을 지정하면 제외됨


단점은 닷넷이 아닌 다른  언어 플랫폼에서는 역직렬화 할 방법이 없기 때문에 상호운영성이 없다는 점.

다만 다른 직렬화 방법에 비해 속도 빠르고 용량 작음.



System.Xml.Serialization.XmlSerializer


XmlSerializer는 클래스의 내용을 문자열로 직렬화 하며, 다음의 제한을 가진다.

- public 클래스여야 함

- 기본 생성자 있어야 함

- public 적용된 필드만 직렬화 / 역직렬화 함




출력결과는 기본적인 XML 스키마로 기록되어 나온다.


따라서 이종 언어가 통신에도 편리하다.

다만 xml형식이기 때문에 쓸데없이 용량 낭비도 심하다.


보통

다른 언어와의 통신에는 XmlSerializer를 쓰며

닷넷 응용 프로그램간에는 BinaryFormatter를 사용한다.



System.Runtime, Serialization.Json.DataContractJsonSerializer


Json은 Javascript Object Notaion의 약어이며 현재 널리 쓰이고 있는 데이터 포맷이다.

다만 System.Runtime.Serialization.dll에 포함되어 있으므로 참조관리자에서 추가해 주어야 한다.




Json형식은 xml에 비해 무척이나 간결하므로 최근에는 객체직렬화에서 많이 선호된다.

'IT Books > 시작하세요 C# 프로그래밍' 카테고리의 다른 글

6장 - 쓰레드, 네트워크, 데이터베이스  (0) 2014.12.21
6장 - 3 (컬렉션)  (0) 2014.12.20
6장 - BCL - 1  (0) 2014.12.07
5장 - 5  (0) 2014.12.02
5장 - 4  (0) 2014.11.27