[Java 강좌] IO(Input/Output)란

공부/Java  2015.05.26 22:04


안녕하세요. 명월입니다.
이번 포스팅에서는 IO에 대해서 알아보도록 하겠습니다.

IO란 Input/Output의 줄임말로써 파일 입출력 처리를 IO라고 표현합니다.
파일 입출력은 자바 뿐만 아니라 모든 언어에서 제대로 알면 ‘프로그램 공부는 끝났다’ 라고도 표현을 할 정도로 중요한 부분입니다. 그러나 솔직한 제 생각으로는 이 파일입출력(IO)을 제대로 알면 ‘100%까지는 아니더라고 30%정도는 정복했다’ 라고 생각됩니다... (나머지는 GUI, Socket이라고 생각됩니다. 이제는 그래픽과 통신도 무시 못하는 한 영역이기 때문입니다.)

그럼 ‘왜 이렇게 중요한가?’에 대해서 생각을 하면 우리가 프로그램을 사용할 때 그 사용 목적에 대해서 생각해보겠습니다. 우리가 프로그램을 가장 많이 사용 할 때는 업무적인 용도가 가장 많겠고, 게임이라던가, 인터넷 서핑을 위해서 컴퓨터를 사용하는 경우가 있겠습니다… 그럼 우리가 가장 많이 사용하는 업무적인 용도라고 하면 당연히 문서를 써야 하니 파일을 작성하고 수정하고 출력을 하겠지요.
그럼 게임은 어떨까요? 게임은 GUI(그래픽)과 온라인 게임인 경우는(Socket)이 더 중요한 부분을 담당하겠지만, 이런저런의 환경설정, 통신을 할 필요없는 데이터(그래픽 정보)등은 로컬에서 파일을 읽고, 필요에 의하면 작성도 하겠네요. 웹서핑은 어떨까요?
역시 마찬가지라고 생각됩니다..
위와 같이 생각한다면 이 파일 입출력은 매우 중요한 파트라고 생각을 할 수 있겠습니다.

C와 C++에서는 이 파일 입출력을 파일을 Open하고(FileConnection)하고 바이너리 데이터 위치에 맞게(Seek) 읽거나, 쓰고 최종적으로는 Close(FileDisconnection)을 처리하는 형태로 사용합니다.
그러나 자바에서는 Stream을 이용하여 이 파일 입출력을 하고 있습니다. 이전 C처럼 각 하나하나의 Binary 객체가 아닌 연속된 문자열의 집합으로 읽어드려서 byte 배열을 이용하여 데이터를 처리한다는 의미(?)이라고는 하는데… 솔직히 저는 그 차이를 크게 못 느끼겠습니다…

그리고 파일 입출력을 하는 데 있어서 Byte형식의 배열로 데이터를 주고 받습니다.
그 이유는 하드웨어이 있는 모든 파일들은 일단 Byte단위로 이루어져 있습니다. 이 파일을 읽어드리는 것은 역시 Byte로 읽어드리겠습니다.

설명이 어렵네요. 예제를 통해서 조금 쉽게 알아보도록 하겠습니다.


위 예제 파일은 제가 메모장으로 abc라는 글을 써서 a.txt라는 파일로 c:\test 라는 경로에 저장을 시킨 화면입니다.


위 예제 소스를 보시면 일단 결과는 abc가 나왔습니다. 파일을 읽어드림에 있어서는 FileInputStream 이라는 클래스를 사용했네요..FileInputStream로 파일을 읽어 드리기 위해서는 파일 경로의 값이 필요하겠네요. 그래서 File클래스로 선언한 모습입니다.
File클래스는 파일의 정보를 취득 함수로써 파일과 관계된 작업을 할 때 매우 유용한 클래스 이니 API 정도는 미리 한번 확인 해 보시는게 좋을 듯 싶습니다.

-File API - https://docs.oracle.com/javase/7/docs/api/java/io/FileInputStream.html
-FileInputStream API - https://docs.oracle.com/javase/7/docs/api/java/io/FileInputStream.html

그럼 설명을 이어가서 File클래스로 부터 파일의 사이즈를 취득해 오고 배열을 선언했습니다. 그리고 스트림으로 처음부터 끝까지 다 취득해 오네요..
그런뒤 byte[]를 String으로 변환 시킨 뒤에 출력을 하는 형태로 만들어 졌습니다.

마지막으로 스트림부터는 Connection의 형태이기에 꼭 사용 후 에는 Connection을 종료하는 close를 함수를 꼭 호출 해야 합니다. 이 Connection에 대해선 조금 후에 다시 설명하고 이번에는 Stream을 이용하여 파일을 생성하는 것을 작성해 보겠습니다.


이번에는 반대로 저장시킬 경로를 File클래스에 넣고 FileOutputStream에 선언 하였습니다.

- FileOutputStream API - http://docs.oracle.com/javase/7/docs/api/java/io/FileOutputStream.html

그리고 그 String을 byte[]로 변환 시킨 후에 write로 작성을 하네요.

결과를 보니 String에 넣었던 Hello World 값이 만들어 집니다.
여기까지가 FileStream의 대한 설명입니다.

추가적으로 스트림 Connection에 대해 설명을 하겠습니다..
스트림은 잠깐 설명했지만 데이터의 연속성 입출력을 스트림이라고 설명했습니다.
데이터를 컵안의 음료수라고 가정했을 때 빨대가 스트림이지요. 그런데 여기에는 특이한 조건이 하나 있습니다. 이 컵은 빨대를 한개 밖에 꼽지 못한다는 것입니다. 그러나 Read할 때는 크게 문제가 되지 않는데 이유는 파일로 직접 Connection 하는 것이 아니고 DataPool이라는 장소(메모리)에 파일 데이터가 복제가 되어서 그 영역으로 Connection이 되기 때문입니다.그러나 write을 할 때는 Datapool로 처리가 되는 것이 아니고 직접 파일 Connection이 이루어 진다는 것 입니다.즉 이 Connection이 연결되어 있으면 다른 프로그램에서 그 파일로의 접근이 불가능(Write만) 하고 Connection 중에는 시스템의 속도가 파일 작성속도로 맞추어지기 때문에 시스템 저하가 발생할 수 있습니다.
그렇기 때문에 이 스트림을 사용할때는 Connection 관리가 중요하겠습니다.
자바의 경우는 new와 동시에 Open이 되는 형식이기 때문에 따로 Open메소드가 없습니다.

여기까지가 IO였습니다. 



댓글 0개가 달렸습니다.
댓글쓰기