본문 바로가기

취미로 하는 게임코딩_gameCodingAsHobby/유니티unity로 게임 만들기

유니티38_C#_23_FileStream 파일스트림

스크립트에서 변수에 저장하는 데이터는 프로그램을 종료하면 사라진다.

컴퓨터의 메모리에 임시로 저장했기 때문이다.

전원이 꺼지더라도 데이터를 유지하려면 파일(file) 형태로 하드디스크 등에 저장하면 된다.

 

게임을 하다가 자신의 기록이 저장되는 경우나 게임 도중에 저장(save)했다가 저장했던 내용을 다시 불러오는(load) 과정도 모두 변수에 저장했던 내용을 파일로 변환해서 디스크에 저장해 두었기 때문에 가능하다.

 

C#에서는 이런 작업을 위해 FileStream이라는 클래스를 만들었다.

*stream : 흐름

 

클래스 FileStream은 네임스페이스 System.IO 안에 있다.

 

디스크에 파일 생성하기

 

FileStream클래스를 이용하여 파일을 생성한다.

바탕화면에 test.txt 파일을 만들어 본다.

2번 줄에서 FileStream클래스를 사용하기 위해 using키워드로 네임스페이스명을 적어준다.

8번 줄에서 FileStream타입의 변수 test를 만들고 FileStream으로 인스턴스(객체)를 초기화해서 저장한다.

 

FileStream으로 파일을 만들려면 2개의 인수를 전달해야 한다.

하나는 파일을 만들 path(경로)를 문자열로 작성하고, 또 하나는 FileMode(파일모드)이다.

 

path(경로)는 파일을 만들 위치를 나타낸다.

운영체제가 윈도우즈인 경우 C:\Users\(사용자 이름)\Desktop 으로 경로를 적는다.

운영체제가 mcaOS인 경우 /Users/(사용자 이름)/Desktop 으로 표시하는데 윈도우즈에서도 위와 같이 / 를 사용해도 상관없다.

경로 마지막에 만들 파일이름과 확장자를 적어준다.

 

FileMode는 enum타입(열거형)으로 만들어져 있으며 Create, Open 등의 필드가 있다.

파일을 만들 때 FileMode는 Create(생성)으로 한다.

 

스크립트를 저장한 후 유니티에서 실행하면 바탕화면에 test.txt라는 텍스트 파일이 만들어진 것을 확인할 수 있다.

 

txt 파일은 메모장과 연결되어 있기 때문에 파일을 더블클릭하면 메모장으로 텍스트 파일을 열게된다.

 

 

1. txt 파일 쓰기, 읽기

바탕화면에 만든 텍스트 파일은 현재 아무 내용도 없는 상태이므로 이 파일에 데이터를 입력해보자.

 

 

데이터를 쓰기 위해서는 StreamWriter클래스를 사용한다.

*write : (글을) 쓰다, 적다

*writer : 쓰는 사람, 쓰는 도구

 

10번 줄에서 StreamWriter 타입의 변수 testStreamWriter를 만들고 여기에 StreamWriter 인스턴스(객체)를 생성해서 저장한다. 전달할 인수는 FileStream 객체가 담겨있는 변수 test이다.

이 말은 FileStream으로 만든 객체에 StreamWriter로 데이터를 쓰겠다고 선언하는 것이다. 

 

11번 줄에서 Write( ) 메서드로 텍스트(문자열)을 인수로 전달한다.

12번 줄에서 쓰기가 완료되면 마지막에 Close( )메서드를 호출해서 쓰기 작업을 닫아야 한다.

*close : 닫다, 종료하다.

 

스크립트를 저장한 후 유니티로 실행한다.

 

 바탕화면의 텍스트 파일을 확인하면 데이터가 전달된 것을 확인할 수 있다.

 

이제 파일의 데이터를 읽어보자.

파일의 데이터를 읽기 위해서는 StreamReader 클래스를 사용한다.

*read : 읽다

*reader : 읽는 사람, 읽는 도구

 

 

14번 줄: 데이터를 읽기 위해서는 닫혀있는 것을 먼저 열어야 한다.

앞에서 만든 변수 test에 FileStream으로 파일 모드를 Open으로 초기화해서 저장한다.

15번 줄에서 StreamReader 타입의 변수를 만들고 test변수를 인수로 전달하는 StreamReader객체를 저장한다.

16번 줄에서 ReadLine( )메서드는 한 줄의 문자를 읽어서 문자열로 반환한다.

반환한 문자열을 Debug.Log( )로 콘솔에 출력한다.

17번 줄에서 읽기가 끝나면 닫는다.

 

스크립트를 저장한 후 유니티로 실행한다.

 

 

2. binary 파일 쓰기, 읽기

바이너리(binary)는 '이진법'이라는 뜻으로 컴퓨터가 데이터를 처리하거나 저장할 때 사용하는 형태이다.

 

저장하는 파일의 형태는 사람이 읽을 수 있는 텍스트(Text) 파일과 컴퓨터가 읽을 수 있는 바이너리(Binary) 파일로 나눌 수 있다.

텍스트 파일은 인코딩(encoing)과정을 거쳐 문자의 연속으로 저장한다.

바이너리(이진) 파일은 이진수(0, 1)를 바이트(byte) 단위로 프로그램, 이미지, 소리, 숫자 등 모든 것(텍스트 파일 제외)을 저장한다.

즉, 텍스트와 숫자는 저장하는 방식이 다르다는 것을 알 수 있다.

 

바이너리 파일의 읽기, 쓰기도 같은 방법이지만 사용하는 클래스와 메서드가 다르다.

 

 

8번 줄에서 binarytest.data라는 바이너리 파일을 바탕화면(Desktop)에 생성한다.

9번 줄에서 바이너리 데이터를 쓰기 위해서 BinaryWriter클래스를 사용하여 객체를 생성한다.

10번, 11번 줄에 Write 메서드로 문자열과 숫자를 파일에 쓰기한다.

 

바탕화면에 만들어진 binarytest.data을 더블클릭해 보면 위와 같이 내용을 열어볼 프로그램이 없다는 것을 알 수 있다.

메모장에서 '열기'메뉴로 열어보면 다음과 같이 나타날 것이다.

 

쓰기 작업으로 입력했던 white crow는 나타나는데 105는 없고 i 만 나타나있다.

서로 다른 방식으로 저장한 데이터를 메모장에서 105를 텍스트로 인식해서 변환한 것이다.

참고로 i 는 이진수로 01101001 이며, 십진수로는 105 이다.

 

15번 줄에서 바이너리 파일을 읽을 때는 BinaryReader 클래스를 사용한다.

16, 17번 줄에서 텍스트 문자열과 숫자를 각기 ReadString( ), ReadInt32( )메서드로 읽어서 콘솔창에 출력한다.

 

 

3. 객체를 파일로 저장하기

 

C# 프로그램에서 데이터는 주로 인스턴스(객체) 형태로 존재하는데 이 객체를 파일로 저장하는 방법을 알아본다.

 

객체를 파일로 저장하려면 저장하고 전송한 후 다시 재구성할 수 있는 형식(Format)으로 변환해서 저장해야 한다.

이것을 Serialization(시리얼라이제이션 ; 직렬화)라고 부른다.

반대로 저장된 파일을 다시 객체로 만드는 과정은 deserialization(디시리얼라이제이션 ; 역 직렬화)라고 부른다.

*serialize : (시리즈로) 연재하다

 

Serialization을 하려면 BinaryFormatter 클래스를 사용한다.

이 클래스는 네임스페이스 System.Runtime.Serialization.Formatters.Binary 안에 들어있다.

 

 

3번 줄에서 using키워드로 네임스페이스명을 불러올 수 있도록 표시한다.

14번 줄에서 객체 생성에 이용할 클래스를 만들고 그 안에 필드 2개도 만든다. 

이 클래스는 직렬화할 것이므로 13번 줄과 같이 System.Serializable 속성을 추가해야 한다.

*serializable : serialize(시리얼라이즈) + able(할 수 있는)

 

 

9번줄에서 testData클래스를 이용해서 객체를 생성하여 변수 data에 저장한다.

10,11번 줄에서 객체의 필드에 접근하여 값을 저장한다.

 

 

13번 줄에서 FileStream을 이용해서 바탕화면에 test_object.dat 라는 바이너리 파일을 만든다.

14번 줄에서 BinaryFormatter로 객체를 만들어 바이너리로 포맷할 것을 선언한다.

15번 줄에서 BinaryFormatter 객체가 저장된 변수를 Serialize( ) 메서드로 직렬화한다.

전달할 인수는 ( 전송될 파일, 직렬화할 객체 )이다.

16번 줄에서 파일을 닫는다.

 

 

바이너리 파일을 다시 불러와서 객체로 역직렬화를 하려면 Deserialize( )메서드를 이용한다.

18번 줄에서 다시 불러올 파일을 연다.

19번 줄에서 Deserialize메서드에 역직렬화할 파일을 담은 객체의 변수를 전달하여 객체로 다시 되돌린다.

20,21번 줄에서 필드 값을 출력한다.

 

 

 

끝.

Wraven...