본문 바로가기

WINK-(Web & App)/JAVA 스터디

Java[2024-2 Java 스터디] 이민형 #5주차 6장

반응형

자바를 "자바라" (Java "java")

 

 

 

 

 

 

6. 자바의 입력과 출력


 

 

 

콘솔 입출력

 

 

자바에서 사용자가 입력한 문자열, 즉 콘솔 입력한 문자열을 얻기 위해서는 System.in을 사용한다.

import java.io.IOException;
import java.io.InputStream;

public class Sample {
    public static void main(String[] args) throws IOException {
        InputStream in = System.in;

        int a;
        a = in.read();

        System.out.println(a);
    }
}
여기서 InputStream을 사용하기 위해선 그 도구를 import해준다.

 

 

 

InputStream은 바이트(byte) 단위의 데이터를 읽어 들일 때 사용하는 내장 클래스이다. 

 

InputStream의 read 메서드는 1byte만 읽는다.

3byte를 전달해도 1byte만 읽을 수 있다.

 

이때 전달한 데이터를 입력스트림이라고한다.

 

 

 

그럼 3byte를 입력했을 때 3byte 전부를 읽게 하고 싶다면 이렇게 하면 된다.

import java.io.IOException;
import java.io.InputStream;

public class Sample {
    public static void main(String[] args) throws IOException {
        InputStream in = System.in;

        int a;
        int b;
        int c;

        a = in.read();
        b = in.read();
        c = in.read();

        System.out.println(a);
        System.out.println(b);
        System.out.println(c);
    }
}

 

 

이렇게 a,b,c 각각 따로 읽어서 모두 3byte를 읽을 수 있다.

 

 

 

근데 사실 이렇게 하면 우리가 입력한 값들을 아스키코드로 밖에 받아 볼 수가 없다.

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

public class Sample {
    public static void main(String[] args) throws IOException {
        InputStream in = System.in;
        InputStreamReader reader = new InputStreamReader(in);
        char[] a = new char[3];
        reader.read(a);

        System.out.println(a);
    }
}

 

그럴 땐 이 처럼 InputStreamReader를 사용해주면 된다.

여기서 abc를 입력하면 그대로 abc가 출력된다.

 

 

 

근데 앞선 코드들의 문제 점은 길이를 3으로 지정해주었기 때문에 지정한 길이만큼의 byte밖에 읽지 못한다.

이를 해결하기 위해 BufferedReader를 사용하고자 한다.

import java.io.IOException;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;

public class Sample {
    public static void main(String[] args) throws IOException {
        InputStream in = System.in;
        InputStreamReader reader = new InputStreamReader(in);
        BufferedReader br = new BufferedReader(reader);

        String a = br.readLine();
        System.out.println(a);
    }
}

 

이런 식으로 하면 길이에 제한을 두지 않고 문자열 전체를 읽을 수 있게 된다.

 

 

 

근데 역시 가장 익숙한건 Scanner가 아니겠냐 하면서...

import java.util.Scanner;

public class Sample {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println(sc.next());
    }
}

Scanner 객체의 next() 메서드는 한 개의 토큰(token)을 읽어 들인다. Scanner 클래스에는 토큰 뿐만 아니라 숫자, 문자열 등을 읽어 들일 수 있는 여러 메서드들이 있다.

 

  • next: 토큰을 읽어 들일 수 있다.
  • nextLine: 라인을 읽어 들일 수 있다.
  • nextInt: 정수를 읽어 들일 수 있다.

 

우리는 System.out.println 메서드를 계속해서 사용해 왔다. 

System.out은 PrintStream 클래스의 객체이다.

PrintStream은 콘솔에 값을 출력할 때 사용되는 클래스이다.

 

보통 System.out.println은 콘솔에 문자열을 출력할 때나 디버깅할 때 많이 사용한다.

 

 

파일 입출력

 

 

 

import java.io.FileOutputStream;
import java.io.IOException;

public class Sample {
    public static void main(String[] args) throws IOException {
        FileOutputStream output = new FileOutputStream("c:/out.txt");
        output.close();
    }
}

 

 

이 코드를 실행하면 c:/ 디렉터리 바로 밑에 새로운 파일인 out.txt가 생성되는 것을 확인할 수 있다.

FileOutputStream 클래스를 사용하면 이와 같이 파일을 생성할 수 있다.

 

 

문자열을 파일에 쓸 때에는 FileOutputStream이 조금 불편하다. String을 byte 배열로 변환해야 하기 때문이다.

그럼 좀 더 편리한 방법은 없을까? 

 

import java.io.FileWriter;
import java.io.IOException;

public class Sample {
    public static void main(String[] args) throws IOException {
        FileWriter fw = new FileWriter("c:/out.txt");
        for(int i=1; i<11; i++) {
            String data = i+" 번째 줄입니다.\r\n";
            fw.write(data);
        }
        fw.close();
    }
}

 

FileOutputStream 대신에 FileWriter를 이용하면 byte 배열 대신 문자열을 사용할 수 있어 편리하다.

 

 

 

import java.io.FileInputStream;
import java.io.IOException;

public class Sample {
    public static void main(String[] args) throws IOException {
        byte[] b = new byte[1024];
        FileInputStream input = new FileInputStream("c:/out.txt");
        input.read(b);
        System.out.println(new String(b));  // byte 배열을 문자열로 변경하여 출력
        input.close();
    }
}

 

파일을 읽기 위해서는 FileInputStream 클래스를 이용한다.

 

파일을 한 줄(라인) 단위로 읽어 들일 수 있다면 훨씬 편리할 것이다.

FileInputStream 대신 FileReader와 BufferedReader의 조합을 사용하면 한 줄 단위로 파일을 읽을 수 있다.

 

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class Sample {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new FileReader("c:/out.txt"));
        while(true) {
            String line = br.readLine();
            if (line==null) break;  // 더 이상 읽을 라인이 없을 경우 while 문을 빠져나간다.
            System.out.println(line);
        }
        br.close();
    }
}
 

 

 

Quiz

1. Java에서 표준 출력에 사용되는 클래스는 무엇인가요?

답 : B) 

 

2. System.out.println()에서 println의 역할은 무엇인가요?

답 : B) 

 

3. Java의 입출력 클래스 중 버퍼를 사용하여 효율적인 입출력을 제공하는 클래스는 무엇인가요?

답 : B) 

 

4. 파일에 텍스트를 쓰기 위해 가장 많이 사용되는 클래스는?

답 : B) 

 

5. Java의 Scanner 클래스는 어떤 패키지에 속해있나요?

답 : B) 

 

6. 다음 중 System.out.println()에서 out의 역할은 무엇인가요?

답 : B) 

 

7. 파일에서 데이터를 읽어오는 대표적인 클래스는 무엇인가요?

답 : A) 

 

8. Java의 BufferedWriter 클래스는 어떤 기능을 제공하나요?

답 : D) 

 

9. InputStream클래스의 역할은 무엇인가요?

답 : B) 

 

10. FileReader와 FileWriter의 차이점은 무엇인가요?

답 : B) 

 

 

 

반응형