안녕하세요 삽잡이입니다.
.NET Framework의 System.IO 네임스페이스는
파일 및 메모리 기반의 입출력 서비스를 제공하는
기본 클래스 라이브러리 영역입니다.
해당 네임스페이스에는
'Directory, DirectoryInfo, File, FileInfo, FileStream' 등이 있습니다.
Type Class에 대해서 기억이 나십니까?
Method에 대한 Info 배열, Property에 대한 Info배열 등등을 구할 수 있었습니다.
일반적으로, Info는 '인스턴스화' 될 수 있는 객체이 붙입니다.
따라서, 정리를 해보자면...
Directory는 정적 메서드들을 사용하는 타입 클래스입니다.
그리고, DirectoryInfo는 인스턴스로 new 연산자로 디렉터리를 사용하는 것입니다.
즉, 정적 기능을 하는 녀석들, 인스턴스로 만들어 조작하는 녀석들도 있다 이겁니다.
이렇게 두가지의 버전이 제공된다는 사실을 알려드리고 싶었습니다.
위와 같이 FileInfo 객체를 통해 Stream 객체를 얻을 수도,
아래와 같이 정적으로 Stream 객체를 얻어올 수 있습니다.
즉, 정적 수준과 인스턴스 수준에 의해 stream을 얻어올 수 있다 이겁니다.
Create()를 사용하게 되면
읽고 쓸 수 있는 stream 객체를 얻을 수 있습니다.
그리고 다 사용하게 될 경우 close를 할 수 있게 되지요.
stream 객체를 얻게 될 때 주의해야할 점이 있습니다.
바로, 파일은 닷넷의 리소스가 아니기 때문에
using 키워드를 통해 컴파일러가 자원을 해제할 수 있도록 해야한다는 것입니다.
using 블럭은 자동으로 dispose() 메서드를 호출해줍니다.
dispose는 우리말로 '해제'를 말하고, closes는 우리말로 '닫기'입니다.
파일은 닫는다가 맞지 않습니까?
따라서, 사실 약속은 dispose로 해놨지만...
즉, 파일을 마무리하는 작업은 dispose()에 구현이 되있는데
파일을 dispose()라고 쓰기에는 어색하기 때문에 close()라는 별칭을 만들었습니다.
close()를 해도 닫기가 된다는 것이지요.
파일은 OS가 관리하게 됩니다.
아무 곳에서나 dispose()가 구현되어있다는 것이 아니라는 소리지요.
따라서, 파일을 자동으로 닫기 위해서 using 블럭을 사용합니다.
그런데, Stream 스트림 거리는데 , 대체 Stream이 뭘까요?
기본적인 개념은 '흐름'입니다.
여기에는 '연속된', '끊기지 않는'이라는 의미가 또한 들어가있습니다.
물론, 컴퓨터 용어로는 '데이터의 흐름'을 뜻합니다.
즉, 데이터의 연속을 뜻하는 것이지요.
그렇다면, 파일 입출력에서 stream은 어떤 의미를 가지고 있을까요?
어플리케이션과 파일이 있다고 해봅시다.
추가적으로, 어플리케이션에서 "삽질!"이라는 데이터를 파일에 쓰고 싶다고 해봅시다.
이때 stream이 없다면 '삽질!'을 파일에 쓰도록 구현을 해야겠지요.
그런데 만약, 네트워크 DB 등에도 해당 문자열을 쓰고 싶다고 해봅시다.
어플리케이션이 파일, 네트워크, DB등에 쓰는 코드가 모두 다 다를 것입니다.
왜냐? 방식이 다르기 때문이지요!
따라서, 모든 소스 코드를 고쳐야하는 불상사가 발생하게 됩니다.
장치들이 늘어날 때마다 코드 수정이 불가피해지는
비효율적인 문제가 발생한다 이겁니다.
따라서, 중간 인터페이스로써 'Stream'을 추가합니다.
APP의 데이터와 stream과만이 이야기를 하는 것입니다.
이 stream이 파일과 연결되어있다면 파일에 쓰이고,
네트워크에 연결이 되어있다면 네트워크에 써지는 것입니다.
그러면 APP을 바꿀 필요가 없어집니다.
APP은 stream에게 문자만 써주면 되기 때문이지요.
stream이 어디에 연결되어있느냐에 따라서
어차피 stream이 넘겨주기 때문에 아주 편해집니다.
이때의 stream을 '논리적인 입출력 장치'라고 부릅니다.
또한 바이오 장치, 인터페이스 장치라고도 부르지요.
즉, 데이터의 흐름이 되는 것입니다.
쓸때나 읽어들일 때나 모두 같습니다.
기본적으로 I/O Stream의 개념이 이렇습니다.
어차피 어떤 데이터든지 장치에 물리적으로 쓰이려면,
바이트 흐름, 바이트 배열을 만들어내야합니다.
그리고, 그 흐름이라는 것은 순서가 있다는 것을 의미하지요.
쓰였다가 읽혀지는 것이 같아야하는데,
따라서 해석을 할줄 알아야한다는 것입니다.
그래서 stream이라는 단어가 사용되는 것이지요.
논리적인 I/O 단위! 이를 Stream이라고 부릅니다.
따라서, 파일 입출력을 할 때에는 무조건 stream을 만들어냅니다.
파일 스트림은 기본적으로 Write(), Read() 메서드를 제공해줍니다.
stream이 기본적으로 읽고 쓰는 메서드가 바로 Write/Read라는 것이지요.
닷넷에서는 무조건 내용물을 바이트 배열로써 만들어냅니다.
즉, 내장 형식들은 모두 다 바이트 배열로 만들 수 있지요.
뭐... 닷넷에서 바이트 배열을 제공해주기 때문에 당연히 그러는 것입니다.
내가 원하는 형태의 데이터를 만들어내는 작업
즉, 가공하는 작업을 'Encoding'이라고 하고,
Encoding 된 즉, 가공된 데이터를 원래의 데이터로 만들어내는 작업을
Decoding이라고 부릅니다.
닷넷에서 엔코딩은 형식을 뜻합니다.
Encoding 형식의 default는
'내 운영체제 내에서 기본적으로 선택되어있는'이라는 뜻입니다.
여기에는 여러가지의 엔코딩 방식들을 제공해주지요.
엔코딩의 형식은 중요합니다.
이는 문자열을 다룰 때 사용하지요.
stream에서 Write() 메서드는 이와 같은 인수를 사용하여 쓰이게 됩니다.
아무튼... 헷갈리실 수 있으니,
디코딩과 인코딩에 대한 예제 코드를 보여드리도록 하겠습니다.
이번시간은 여기까지 하도록 하겠습니다.
이상 삽잡이였습니다!
'삽질의 현장 > - .NET' 카테고리의 다른 글
#083_닷넷(.NET)_ ADO.NET - ADO.NET Intro (0) | 2015.11.16 |
---|---|
#082_닷넷(.NET)_.Net Framework 기본 - 객체 직렬화 (0) | 2015.11.16 |
#080_닷넷(.NET)_.Net Framework 기본 - Thread Pool &TPL (0) | 2015.11.15 |
#079_닷넷(.NET)_.Net Framework 기본 - Thread 생성 & 동기화 (0) | 2015.11.15 |
#078_닷넷(.NET)_.Net Framework 기본 - 비동기 대리자(delegate) & 멀티 쓰레드(Multi Thread) (0) | 2015.11.15 |