[JAVA]객체지향(15): IO

ho's·2022년 5월 1일
1

위 글은 김성박선생님의 자바 강의를 바탕으로 쓰여졌습니다.
더 자세한 내용은 아래 링크를 통해 알아보실 수 있습니다.

부부개발단 유투브


IO란?

  • Input & OutPut
  • 입출력
  • 입력은 키보드, 네트워크, 파일등으로 부터 받을 수 있다.
  • 출력은 화면, 네트워크, 파일등에 할 수 있다.

java IO도 객체다.

  • Java IO에서 사용되는 객체는 자바 세상에서 사용되는 객체이다.
  • Java IO가 제공하는 객체는 어떤 대상으로 부터 읽어들여, 어떤 대상에게 쓰는 일을 한다.

  • 마름모 꼴로 나타내어 있는것은 Decorator은 Component를 가질 수 있다.
    즉, Component를 가질 수 있다는 것은 Component를 상속받고 있는 것들도 가질 수 있다.

주인공과 자식을 구분할 수 있어야 한다.

  • 장식은 InputStream, OutputStream, Reader, Writer를 생성자에서 받아 들인다.
  • 주인공은 어떤 대상에게서 읽어들일지, 쓸지를 결정한다.
  • 주인공은 1byte or byte[] 단위로 읽고 쓰는 메소드를 가진다.
  • 주인공은 1char or char[] 단위로 읽고 쓰는 메소드를 가진다.
  • 장식은 다양한 방식으로 읽고 쓰는 메소드를 가진다.

Java IO의 특수한 객체

System.in : 표준 입력(InputStream)
System.out : 표준 출력(PrintStream)
System.err : 표준 에러 출력(PrintStream)

Java IO 클래스는 생성자가 중요하다.

  • 장식은 InputStream, OutputStream, Reader, Writer를 생성자에서 받아들인다.

API를 읽어보자!

https://docs.oracle.com/javase/7/docs/api/java/io/package-summary.html

InputStream, WriterStream, Reader, Writer 가 생성자에 들어가면 장식이다!

문제1. StringWriter은 주인공일까 장식일까

  • Writter를 상속 받고 있다.
  • 생성자에 InputStream, WriterStream, Reader, Writer가 들어가지 않는다.

따라서 주인공이다.
주인공은 어떤 대상으로부터 읽어들이고 쓸것인지 결정한다.
String에다가 문자열로 써주는 역할을 한다.

문제2. PrintStream은 주인공일까 장식일까?

  • 생성자에서 InputStream, WriterStream, Reader, Writer 를 받아들인다.
    따라서 장식이다.

문제3. FileInputStream은 장식일까?

  • 생성자에서 InputStream, WriterStream, Reader, Writer 를 받아들이지 않는다.
    따라서 주인공이다.

문제4. FileReader는 주인공일까? 장식일까?

생성자에 InputStream,OutputStream, Reader, Writer가 들어오지 않으므로 주인공

문제5. PipedInputStream는 주인공일까 장식일까?

  1. JAVA IO 객체는 InputStream, OutputStream, Reader, Writer를 상속 받아야 한다.

  1. 생성자에 InputStream,OutputStream, Reader, Writer가 들어오지 않으므로 주인공

하지만 pipedOutPutStream 자체가 inputStream의 자식이기 때문에, 장식역할도 한다!

JAVA IO 클래스는 생성자가 중요하다.

  • 장식은 InputStream, OutputStream, Reader, Writer를 생성자에서 받아 들인다.

JAVA IO를 잘하려면 API를 잘 읽어야 한다.

연습문제) 키보드로 부터 한 줄 씩 입력받아 한줄씩 출력해라.

  • 키보드로부터 한줄씩 입력받고, 한줄씩 화면에 출력해라
  • 키보드: System.in;
  • 화면에 출력 : System.out;
  • 키보드로 입력받는다는건 문자를 입력받는 것: char단위 입출력
  • 한줄 읽기 : BufferedReader라는 클래스는 readLine이라는 메소드를 가지고 있다.
  • 한줄 쓰기 : PrintStream, PrintWriter

1단계

모든 예외처리는 JVM에 떠넘기도록 하자. 예외처리를 넘긴다.

2단계

한줄씩 읽는 코드를 작성하자.

BufferedReader br = new BufferedReader();
br.readLine();

readLine()메소드는 읽어들일게 없다면 null을 반환한다. (End Of File, EOF라고 한다)

String line = null;
while((line=br.readLine()) != null) {
	System.out.println("읽어들인 값: " + line);
}

코드를 작성했지만, 오류가 발생한다.

BufferedReader는 장식이기 때문에 주인공이 있어야 한다.

API를 살펴보자

BufferedReader는 생성자에 Reader가 들어온다.

Reader에 대해 알아보자

리더는 추상클래스이기 때문에, Reader를 받겠다는 것이 아니라 Reader의 자식중 하나를 받겠다는 얘기이다.

Reader자식의 후보를 살펴보자.

1. BufferdReader

  • 우리는 BufferedReader객체를 만들기 때문에 사용할 수 없다.

2. CharArrayReader

생성자를 보면 char[] 이다.
즉, 문자로 읽어들이기 때문에 안된다.
(우리는 키보드로 읽어 들이기를 원한다)

3. FilterReader

  • 생성자에서 Reader를 또 받기 때문에 안된다.

4. InputStreamReader

  • InputStreamReader은 장식이고, System.in 을 사용할 수 있다.
    따라서 다음과 같이 작성이 가능하다.
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

profile
그래야만 한다

1개의 댓글

comment-user-thumbnail
2023년 1월 28일

감사합니다~

답글 달기