안녕하세요, 코린이의 코딩 학습기 채니입니다.
Java 객체를 예습했던 내용을 정리한 포스팅입니다.
입출력
: 입출력의 대상들(키보드, 모니터, 하드디스크에 저장된 파일, 외부 메모리 장치, 네트워크로 연결된 컴퓨터, 사운드카드, 오디오카드 같은 멀티 미디어 장치, 프린터 같은 출력장치)과의 입력(input)과 출력(output)처리
: java.io 패키지의 클래스들로 지원함
단, java 5버전부터 java.util.Scanner가 추가되었음 → 값의 자료형 별 입력이 편해짐
스트림
: 입출력에는 stream(통로)이 사용됨
: stream은 단방향임(일방통행) → 입출력 동시에 하고 싶으면 입력용, 출력용과 같이 총 2개를 사용해야됨
→ 외부 자원과의 입출력이 필요할 경우, 시스템으로부터 스트림을 얻어와서 사용하고 사용이 끝나면 반드시 시스템으로 스트림을 반납해야함 (close) (표준 입출력 제외)
입출력 처리 방식
자바에서 입/출력을 하려면, 외부자원과 스트림부터 연결시키고, 그 다음에 읽거나 쓰기를 함
→ 스트림 클래스에 대한 객체 생성 : 외부자원과의 통로 만들기
→ 위에서 만든 레퍼런스.읽기용메소드() 또는 레퍼런스.쓰기용메소드() 호출
* 읽기용 메소드 : 버퍼에서 읽어내서 변수에 기록하는 메소드 공통으로 read()메소드 사용함
* 쓰기용 메소드 : 변수 값을 버퍼에 보내서 내보내는 메소드 공통으로 write()메소드 사용
자바에서의 스트림 크게 2가지 구분
* 바이트(byte)스트림 : 통로로 움직이는 데이터 크기가 1바이트임 (최상위 클래스 : InputStream / OutputStream)
* 문자(character)스트림 : 통로로 움직이는 데이터 크기가 2바이트임 (문자 1개씩 움직임)
(최상위 클래스 : Reader / Writer)
기반 스트림과 보조 스트림의 차이
* 기반 스트림 : 어떤 대상을 가지고 데이터 입출력을 할 지 선정하는 스트림 클래스 (file, System.in, System.out)* 보조 스트림 : 기반 스트림의 성능을 보완한 클래스들 (속도 향상, 기능 추가, 변환 작업 등)→ 보조 스트림들은 단독으로 사용 (객체 생성 못함)→ 기반 스트림 클래스에 대한 객체를 사용해서 객체 생성하도록 되어있음→ 하나의 기반 스트림을 대상으로 여러 개의 보조 스트림을 달 수 있음.
바이트 | 외부자원 대상 |
문자 | |
기반 스트림 | System.in / System.out FileInputStream / FileOutputStream ByteArrayInputStream / ByteArrayOutputStream PipedInputStream / PipedOutputStream StringBufferInputStream / StringBufferOutputStream |
콘솔 파일 메모리 프로세스 메모리 |
System.in / System.out FileReader / FileWriter CharArrayReader / CharArrayWriter PipedReader / PipedWriter StringReader / StringWriter |
보조 스트림 | BufferedInputStream / BufferedOutputStream DataInputStream / DataOutputStream ObjectInputStream / ObjectOutputStream |
BufferedReader / BufferWriter InputStreamReader / OutputStreamWriter |
|
최상위 클래스 | InputStream / OutputStream | Reader / Writer |
* docs 확인해보면 어떤 클래스가 기반 스트림이고 어떤 클래스가 보조 스트림인 지 알 수 있음
→ 각 클래스의 매개변수 생성자를 확인해보면..
기반 스트림, 보조 스트림 사용법
* 기반 스트림 사용법
내용 : 외부자원 → 기반 스트림 → 메모리
코드 : 기반스트림 레퍼런스 = new 기반스트림 (외부자원) ;
실 예 : FileInputStream fis = new FileInputStream(new File("test.txt")) ;
* 보조 스트림 사용법
내용 : 외부자원 → 기반 스트림 → 보조 스트림1 → 보조 스트림2 → 메모리
코드 : 보조스트림2 레퍼런스 = new 보조스트림2 (new 보조스트림1 (new 기반스트림 (외부자원)));
실 예 : BufferedReader br = new BufferedReader(new InputStreamReader(System.in));*** 보통 BufferedReader를 사용하는 이유는 BufferedReader의 readLine()메소드 때문
* 표준 입출력 (System.in, System.out, System.err)
: 콘솔(console) 을 통한 데이터의 입출력을 말함: JVM 이 시작되면서 자동적으로 생성되는 스트림 → 스트림을 열고 닫을 필요가 없음: 보통 단독으로 사용하지 않음
DataInputStream / DataOutputStream 보조 스트림
: 바이트 스트림만 제공: FileInputStream / FileOutputStream 만을 가지고 데이터를 저장하고 불러올 때는 어떤 값을 넣어도 1byte단위로 저장되고 불러옴
→ DataInput/OutputStream 보조스트림을 가지고 작업을 하게 되면 1byte단위가 아닌 기본 자료형 (8가지)과 String 참조자료형 크기 단위로 저장되고 불러올 수 있음
→ 값이 저장될 때 데이터형을 같이 저장시킴 >> 파일을 열어보면 깨지는 것을 확인할 수 있음 (인코딩이 안돼서)
→ 해당 자료형에 맞춰 write~() 메소드, read~() 메소드를 통해 저장하고 불러옴
ObjectInputStream / ObjectOutputStream 보조 스트림
: 바이트 스트림만 제공: 객체가 가진 정보를 객체 상태로 파일에 기록하거나, 파일에서 읽어와서 바로 객체에 저장할 때 사용하는 스트림: 반드시 직렬화 처리된 클래스의 객체만 사용할 수 있음: 객체 입출력에 사용되는 메소드
출력 시 >> writeObject(객체)
입력 시 >> readObject()
→ IOException 처리해야함
→ IOException ClassNotFoundException 2개를 처리해야 함
→ 반환형이 Object 이므로 해당 클래스 타입으로 형 변환 해야 함
** 직렬화
: 객체 클래스에 적용함 → 클래스가 객체 생성하고, 그 객체를 Object 입/출력에 사용할 경우,
바이트 스트림이므로 객체 상태로 그대로 스트림으로 전송할 수 없음
: 직렬화가 적용된 클래스 일 때는 바이트 스트림 크기에 맞춰서, 객체가 가진 필드들을 기록된 순서대로 바이트 단위로 길게 연속으로 나열 처리를 함 → 직렬화라고 함
: 직렬화 처리된 객체 정보가 바이트 스트림을 거쳐 전송
: 읽어 들일 때는 역 직렬화가 자동으로 처리됨 → 바이트 단위로 나열된 값들을 다시 각 자료형 벼로 필드 값으로 바꾸는 것
→ 직렬화 처리 방법 : 직렬화를 적용할 클래스 헤더에 java.io.Serializable 인터페이스 상속 처리함
public class 클래스명 implements java.io.Serializable { }
'Java > Java 예습' 카테고리의 다른 글
[Java] 자바의 객체 Part.2 실습_6 (0) | 2022.01.27 |
---|---|
[Java] 자바의 객체 Part.2 실습_5 (0) | 2022.01.27 |
[Java] 자바의 객체 Part.2 실습_4 (0) | 2022.01.27 |
[Java] 자바의 객체 Part.2 실습_3 (0) | 2022.01.26 |
[Java] 자바의 객체 Part.2 실습_2 (0) | 2022.01.26 |