지난시간에 DataInputStream 클래스의 기능 을 이용 직접 데이타를 파일에 저장하는 연습을
해보았다. 하지만 루프를 이용한다해도 매번 해당 객체에 인스턴스를 호출 하여 값을
초기화하고 그값을 다시 인스턴스를 호출 하여 파일을 읽고 쓰는 방법은 인스턴스 변수
의 갯수가 많지않고 저장한파일의 원본 데이터를 외부에서 그대로 가져다 쓰기위함이 아니
라면,,, 특히 인스턴스 변수가 1000개라면... 아마도 쓸때없는 코드의 양이 엄청나게 늘어날
것이다 .
따라서 java에서 IO패키지를 살펴보면 객체 가 가지고 있는 내부적인 인스턴스를 자동으로
호출 하여 읽고 쓸수 있는 클래스가 있는데 ObjectOutputStream/ObjectInputStream 이다
말 그대로 객체를 읽고 쓰는 기능의 클래스이다. DataInputStream 클래스처럼
FileInputStream 과 FileOutputStream 객체를 parameter 로 전달받고 기능을 확장
전달받은 객체의 인스턴스에 접근하여 코드 를 바이트에배열로 전환 하여 데이타를 읽고
쓸수있다. 이때 유의할점은 실체 데이터를 읽고 쓰는 것은 ObjectInput/OutputStream 객체
가 아니라 단지 FileInputStream/FileOutputStream 의 바이트 단위로 읽고 쓰는 기능을
바이트에 배열로 바꾸어주는 역할만 하는것이므로 실제로 읽고 쓰는 기능 은
FileInputStream 과 FIleOutputStream 인 것이다.
스트림 순서를 나열해보겟다.
1. 클래스 정보 로딩 new 연산자를 통한 객체 생성
2. 저장할 파일명과 파일을 쓸 파일명을 FileOunputStream 에 파라미터로 전달
3. FileOutputStream 객체를 ObjectOutputStream 객체생성하고 parameter 로 전달
4. ObjectOutputStream 객체에서 바이트의 배열로 파일을 쓰는 메소드 writeObject()호출
5. writeObject() 에 인자로 쓸 파일을 전달한다.
6. 처음에 FileOutputStream 객체로 전달된 파일명을 가진 파일이 생성되고 그안에
5번에서 전달된 객체의 인스턴스변수값이 바이트의 배열로 전달되어 생성된다.
7. FileInputStrea 객체생성하고 읽어드릴 파일명을 파라미터로 전달
8. ObjectOutputStream 객체 생성하고 파라미터로 FileInputStream 객체 전달(기능확장)
9. 읽어드리는 정보를 받을 변수를 선언 ObjectInputStream의 객체에서 readObject()호출
(이때 읽어드리는 타입이 Object 이므로 해당 객체타입으로 다운캐스팅을 해주어야한다.
데코레이트 패턴
위 그림과 파일을 쓰는 순서가 달라보일수도 있지만 중요한것을 기억하자실제 파일을 읽고쓰는 객체는 FileInput/OutputStream 인것을 .
사실 위 그림을 실제 코딩하게 되면 문제가 생긴다. 기본적으로 파일의 보안성을 위해
java 에서는 파일에 데이터를 읽고 쓰기위해선 어떤 조건을 만족해야하는데...
그것이 바로 Serializable interface 이다.
먼저 interface 에 간단하게 설명 하자면 프로그램을 하는 있어서 어떠한 스펙을 부여하여
제한을 두는것이라 생각할수 있겠다. 예를 들자면 게임을 해야하는데 마우스로 입력을 받는
다는 제한을 두면 마우스입력이라는 기능을 가진 플레이어(객체만) 게임을 할수 있는거와
비슷하다고 생각할수있다. 위 ObjectOutputStraem와 ObjectInputStrea을 이용해
byte 배열로 파일을 외부및 데이타 베이스에 읽고쓰기위해선 Serializable 인터페이스를
반드시 구현해주어야하는데 키워드는
public static void Hello implements 인터페이스이름 {}
위와같은 방법으로 구현한다. 경우에따라 반드시 오버라이드 해줘야하는 메소드가 존재할때
도 있고 그렇지 않을때도 있다. 인테페이스에 대해선 나중에 상속과 더불어 자세히 기술하겟
다.
댓글 없음:
댓글 쓰기