๐ŸŒŠ Input / Output

๋ฐฐํšจ๋ฆผยท2023๋…„ 4์›” 11์ผ
0

์Šคํ„ฐ๋””

๋ชฉ๋ก ๋ณด๊ธฐ
2/3

โœ” I/O : Input, Output ์„ ๋” ๋น ๋ฅด๊ฒŒ, ์ ์ ˆํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฌธ์ œ

์ฝ”๋”ฉํ…Œ์ŠคํŠธ์—์„œ ํ•จ์ˆ˜๋ฅผ ๊ตฌํ˜„ํ•˜๋ผ๊ณ  ์ง€์‹œ๋ฐ›์„ ๋•Œ๋„ ๋งŽ์ง€๋งŒ, ์ง์ ‘ ์ฃผ์–ด์ง„ ๋ฐ์ดํ„ฐ๋ฅผ ์ž…๋ ฅํ•˜์—ฌ ๋ฌธ์ œ์—์„œ ์ง€์ •๋œ ํ˜•ํƒœ์˜ ๊ฐ’์„ ์ถœ๋ ฅํ•˜๋ผ๊ณ  ์š”๊ตฌ๋ฐ›๋Š” ๋•Œ๋„ ๋งŽ๋‹ค. ๊ฐœ์ธ์ ์œผ๋กœ Scanner์˜ readline ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ๋ฏธ๋‹ˆ ๊ณผ์ œ๋ฅผ ์ „๋ถ€ ํ•ด๊ฒฐํ•˜์—ฌ, ์ฝ”๋”ฉํ…Œ์ŠคํŠธ์—์„œ๋„ ์ด๋ฅผ ์ฒ˜์Œ์— ์‚ฌ์šฉํ•˜์˜€์ง€๋งŒ, ๋” ์ž‘์€ ์ˆ˜ํ–‰์‹œ๊ฐ„์„ ๊ฐ€์ง„ ์ฝ”๋“œ๋“ค์€ Scanner๊ฐ€ ์•„๋‹Œ InputStreamReader๋ฅผ ํ†ตํ•ด ๋Œ€๋žต ์ด๋Ÿฐ์‹์œผ๋กœ ์ธํ’‹์„ ๋ฐ›๋Š” ๊ฒƒ์„ ํ™•์ธํ–ˆ๋‹ค:

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int someInput = Integer.parseInt(br.readLine());

๊ทธ ๋’ค๋กœ๋Š” ๋งค๋ฒˆ ์ด๋ ‡๊ฒŒ ์ž…๋ ฅ์„ ์ฒ˜๋ฆฌํ–ˆ์ง€๋งŒ, ์‹ค์ œ๋กœ ๋ฌด์—‡์ด ๋‹ค๋ฅธ์ง€ ๋ชฐ๋ž๊ธฐ์—, ์ด ๋ฌธ์„œ์—์„œ ํ•ด๋‹น ๋ถ€๋ถ„์„ ์•Œ์•„๋ณธ๋‹ค.

๐ŸŒŠ Stream : ๋ฐ์ดํ„ฐ๋ฅผ ์šด๋ฐ˜ํ•˜๋Š” ์—ฐ๊ฒฐ ํ†ต๋กœ

์ž…์ถœ๋ ฅ์ด๋ž€ ์ปดํ“จํ„ฐ ๋‚ด์™ธ๋ถ€ ์žฅ์น˜์™€ ํ”„๋กœ๊ทธ๋žจ๊ฐ„์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ  ๋ฐ›๋Š” ์ผ์ด๊ณ , Stream ์ด๋ž€ ์ด ๊ณผ์ •์—์„œ ๋‘ ๋Œ€์ƒ์„ ์—ฐ๊ฒฐํ•˜๊ณ , ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•˜๋Š” ํ†ต๋กœ์ด๋‹ค.

์ฃผ์š” ํŠน์ง•์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค :

  • ๋‹จ๋ฐฉํ–ฅ ํ†ต์‹  - ์ž…๋ ฅ๊ณผ ์ถœ๋ ฅ ๋™์‹œ์— ์ฒ˜๋ฆฌ X
  • FIFO - ๋จผ์ € ๋ณด๋‚ธ ๋ฐ์ดํ„ฐ๋ฅผ ๋จผ์ € ๋ฐ›๊ฒŒ ๋œ๋‹ค
  • ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฐ”์ดํŠธ ๋‹จ์œ„๋กœ ๋ฐ์ดํ„ฐ ์ „์†ก
  • ์ž…์ถœ๋ ฅ ๋Œ€์ƒ์— ๋”ฐ๋ผ ๋‹ค์–‘ํ•œ ์ข…๋ฅ˜๊ฐ€ ์žˆ๋‹ค

๐ŸŒŠ ๋ฐ”์ดํŠธ ๊ธฐ๋ฐ˜ ์ŠคํŠธ๋ฆผ

๋ชจ๋“  ๋ฐ”์ดํŠธ ๊ธฐ๋ฐ˜ ์ŠคํŠธ๋ฆผ์€ InputStream ๊ณผ OutputStream ์˜ ์ž์†์ด๋ฉฐ ์ž…์ถœ๋ ฅ ๋Œ€์ƒ์˜ ์ข…๋ฅ˜์— ๋”ฐ๋ผ ํŒŒ์ƒ๋˜์—ˆ๋‹ค. ์˜ˆ๋กœ ๋“ค์–ด, ํŒŒ์ผ์— ๋Œ€ํ•ด ์ž…์ถœ๋ ฅ์„ ํ•˜๋Š” Stream Class ๋Š” FileInputStream, FileOutputStream ์ด๋‹ค. ์ด์ฒ˜๋Ÿผ ์—ฌ๋Ÿฌ ์ข…๋ฅ˜์˜ I/O Stream ์ด ์กด์žฌํ•˜์ง€๋งŒ, ์ž…์ถœ๋ ฅ์— ๊ด€ํ•œ ์ฃผ์š” ๋ฉ”์„œ๋“œ๋“ค์„ ์กฐ์ƒ์ธ InputStream, OutputStream ์˜ ์ถ”์ƒ ๋ฉ”์„œ๋“œ๋“ค์„ override ํ•˜์—ฌ ๊ตฌํ˜„ํ•˜์˜€๊ธฐ ๋•Œ๋ฌธ์— ๋‹คํ–‰์Šค๋Ÿฝ๊ฒŒ๋„ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ•˜๊ธฐ์— ํŽธ๋ฆฌํ•˜๋‹ค.

abstract int read(); // why int not byte ? ์ฝ์„์ˆ˜ ์—†์Œ์„ -1  ๋กœ ํ‘œํ˜„ํ•˜๊ธฐ ๋•Œ๋ฌธ
abstract void write(byte[] b);

int read(byte[] b, int off, int len);
void write(byte[] b , int off, int len);

์ฃผ์š” ๋ฉ”์„œ๋“œ๋“ค์„ ์กฐ๊ธˆ ์‚ดํŽด๋ณด๋ฉด,

  • int available() : ์ŠคํŠธ๋ฆผ์œผ๋กœ๋ถ€ํ„ฐ ๋ธ”๋ฝํ‚น (blocking) ์—†์ด ์ฝ์–ด์˜ฌ ์ˆ˜ ์žˆ๋Š” ๋ฐ์ดํ„ฐ์˜ ํฌ๊ธฐ
  • void mark(int readlimit) : ํ˜„์žฌ ์œ„์น˜ ํ‘œ์‹œ, reset์— ์˜ํ•ด ๋Œ์•„๊ฐˆ ์ˆ˜ ์žˆ๋‹ค. markSupported() == true์ผ ๋•Œ๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅ. mark ๋กœ ๋ถ€ํ„ฐ readlimit ๋ณด๋‹ค ๋” ์ฝ์–ด ๋“ค์ด๋ฉด save X
  • long skip(long n) : n ๋งŒํผ skipํ•œ๋‹ค.
  • void flush() : ์ŠคํŠธ๋ฆผ ๋ฒ„ํผ์— ์žˆ๋Š” ๋ชจ๋“  ๋‚ด์šฉ์„ ์ถœ๋ ฅ์— ์“ด๋‹ค
  • void close() : ์ŠคํŠธ๋ฆผ์„ ๋‹ซ๊ณ , ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋˜ ์ž์›์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

๐ŸŒŠ ๋ณด์กฐ ์ŠคํŠธ๋ฆผ

๋ณด์กฐ ์ŠคํŠธ๋ฆผ์€ ์‹ค์ œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ  ๋ฐ›๋Š” ๊ฒƒ์— ์‚ฌ์šฉ๋˜์ง€ ์•Š๊ณ , ๊ธฐ๋ณธ ์ŠคํŠธ๋ฆผ์˜ ๊ธฐ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ค๊ฑฐ๋‚˜ ์ถ”๊ฐ€ํ•  ๋•Œ ์“ฐ์ธ๋‹ค. ๋”ฐ๋ผ์„œ, ์ŠคํŠธ๋ฆผ์„ ๋จผ์ € ์ƒ์„ฑํ•œ ์ดํ›„ ๋ณด์กฐ์ŠคํŠธ๋ฆผ์„ ์ƒ์„ฑํ•œ๋‹ค. ์˜ˆ๋กœ ๋“ค์–ด, ์•„๊นŒ File์— ๋Œ€ํ•œ ์ž…์ถœ๋ ฅ์„ FileInput/OutputStream ์—์„œ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ–ˆ๋Š”๋ฐ, ์ž…๋ ฅ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ค๊ธฐ ์œ„ํ•ด์„œ BufferedInputStream์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด๋ฆ„์—์„œ ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด, FileInputStream์˜ read()๋Š” 1 byte ์”ฉ ํŒŒ์ผ์—์„œ ์ฝ์–ด์˜ค๋Š” ๋ฐ˜๋ฉด, BufferedInputStream ์€ ๋‚ด๋ถ€์ ์œผ๋กœ Buffer array ๋ฅผ ์ƒ์„ฑํ•ด ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ํ•ด๋‹น ๋ฒ„ํผ์—์„œ ์ฝ์–ด์˜ค๊ณ , File ์—์„œ ํ•„์š”ํ•œ ๋ถ€๋ถ„๋งŒํผ Buffer๋ฅผ ๋‹ค์‹œ ์ฑ„์šด๋‹ค. ๋งŒ์•ฝ ํ•œ ํŒŒ์ผ์—์„œ 256 Byte๋ฅผ ์ฝ์–ด์™€์•ผํ•œ๋‹ค๋ฉด, FileInputStream์€ ํ•ด๋‹น File ์„ ์ „๋ถ€ ์ฝ์–ด๋“ค์ด๊ธฐ ์œ„ํ•ด 256๋ฒˆ read call ์„ ๋งŒ๋“ค ๊ฒƒ์ด์ง€๋งŒ, BufferedReader๋Š” ํ•œ๋ฒˆ์— ๋” ๋งŽ์ด ์ฝ์–ด ๋“ค์—ฌ 1-2๋ฒˆ์˜ call ๋กœ ํ•ด๊ฒฐํ•œ๋‹ค. ๋ณดํ†ต ํŒŒ์ผ์˜ ๊ฒฝ์šฐ 8K์ •๋„์˜ ํฌ๊ธฐ๋กœ ๋ฒ„ํผ๋ฅผ ์„ค์ •ํ•œ๋‹ค๊ณ  ํ•œ๋‹ค.

์กฐ๊ธˆ ์ฃผ์˜ํ•ด์•ผ ํ•  ์ ์€, ์ถœ๋ ฅ์˜ ๊ฒฝ์šฐ, ๋ฒ„ํผ๊ฐ€ ๊ฐ€๋“ ์ฐผ์„ ๋•Œ๋งŒ ์ถœ๋ ฅ ์†Œ์Šค์— ์ถœ๋ ฅ์„ ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๋งˆ์ง€๋ง‰ ๋ถ€๋ถ„์ด ๋ฒ„ํผ์— ๋‚จ์•„ ์žˆ๋Š” ์ฑ„๋กœ ํ”„๋กœ๊ทธ๋žจ์ด ์ข…๋ฃŒ ๋  ์ˆ˜ ์žˆ๋‹ค. ์ด ๋•Œ๋Š” ๋ชจ๋‘ ์ถœ๋ ฅ ๋  ์ˆ˜ ์žˆ๋„๋ก close ๋‚˜ flush ํ•จ์ˆ˜๋ฅผ ์จ์ฃผ๋„๋ก ํ•˜์ž.

์‹ค์ œ๋กœ ์–ผ๋งˆ๋‚˜ ์ฐจ์ด๊ฐ€ ๋‚˜๋Š”์ง€ ์‹คํ—˜์„ ํ•ด๋ณด์•˜๋‹ค. ์•ฝ 8693 KB ์˜ ํŒŒ์ผ์„ ์ฝ์–ด๋“ค์ด๋Š” ๋ฐ ๊ฑธ๋ฆฌ๋Š” ์†๋„๋ฅผ ์ธก์ •ํ•œ ๊ฒƒ์ด์—ˆ๋Š”๋ฐ, ๊ฒฐ๊ณผ๋Š” ์ถฉ๊ฒฉ์ ์ด์—ˆ๋‹ค. FileInputSystem์œผ๋กœ๋Š” ์•ฝ 26ms์˜ ์‹œ๊ฐ„์ด ๊ฑธ๋ ธ์ง€๋งŒ, BufferedInputSystem์œผ๋กœ๋Š” 0.00005ms ๋ฏธ๋งŒ์ด ๊ฑธ๋ ธ๋‹ค..!

import java.io.*;

public class Main {
    public static void main(String[] args) throws FileNotFoundException {
        long beforeTime = System.currentTimeMillis();

        FileInputStream fis = null;
        try {
            // 8683 KB ํŒŒ์ผ ํ…Œ์ŠคํŠธ 
            File file = new File("D:\\test.txt");
            fis = new FileInputStream(file);
            // BufferedInputStream bis = new BufferedInputStream(fis);
            int i = 0;
            while ((i = bis.read()) != -1) {
                System.out.write(i);
            }
        } catch (IOException e) {
            System.out.println(e);
        } finally {
            try {
                fis.close();
            } catch (IOException io) {
            }


            long afterTime = System.currentTimeMillis();
            long secDiffTime = (afterTime - beforeTime) / 1000;
            System.out.println("์‹œ๊ฐ„์ฐจ์ด(m) : " + secDiffTime);
        }
    }
}

์œ„์—์„œ ํ…Œ์ŠคํŠธํ•œ BufferedInputStream ์™ธ์—๋„ ์•„๋ž˜์™€ ๊ฐ™์€ ๋„์›€์ด ๋˜๋Š” ๋ณด์กฐ ์ŠคํŠธ๋ฆผ์ด ์žˆ์œผ๋‹ˆ, ์•Œ์•„๋‘๋ฉด ์ฝ”๋“œ ์„ฑ๋Šฅ ํ–ฅ์ƒ๋„ ๋˜๊ณ  ํŽธ๋ฆฌ์„ฑ๋„ ๊ฐ–์ถ”์–ด ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค:

  • DataInputStream : primitive type์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ธฐ๋Šฅ (writeInt, writeShort...)
  • LineNumberReader : ์ฝ์–ด์˜จ ๋ฐ์ดํ„ฐ์˜ ๋ผ์ธ ๋ฒˆํ˜ธ๋ฅผ ์นด์šดํŠธ
  • SequenceInputStream : 2๊ฐœ ์ด์ƒ์˜ ์ŠคํŠธ๋ฆผ์„ ์—ฐ์†์ ์œผ๋กœ ์—ฐ๊ฒฐ (ํ•œ๋ฒˆ์—๋Š” ์•ˆ๋˜๊ณ  ์ •ํ•ด์ง„ ์ˆœ์„œ๋Œ€๋กœ)

โœ” Reader / Writer : Byte ์ŠคํŠธ๋ฆผ์œผ๋กœ ๋ฌธ์ž์—ด์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฌธ์ œ

charํ˜•์ด 1๋ฐ”์ดํŠธ๊ฐ€ ์•„๋‹Œ 2๋ฐ”์ดํŠธ์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ์กด์— ์–ธ๊ธ‰ํ•œ ๋ฐ”์ดํŠธ ๊ธฐ๋ฐ˜์œผ๋กœ๋Š” ๋ฌธ์ž๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐ์— ์–ด๋ ค์›€์ด ์žˆ๋‹ค. ์ด๋Ÿด ๋•Œ๋Š” ๋ฐ”์ดํŠธ๊ธฐ๋ฐ˜ ์ŠคํŠธ๋ฆผ์„ ์“ฐ์ง€๋ง๊ณ , ๋ฌธ์ž ๊ธฐ๋ฐ˜ ์ŠคํŠธ๋ฆผ์„ ์“ฐ์ž. InputStream/ OutputStream ๋Œ€์‹ ์— Reader/Writer suffix ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ์ค‘์š” ์ถ”์ƒ ๋ฉ”์„œ๋“œ read / write๋ฅผ ๋จผ์ € ์‚ดํŽด๋ณด๋ฉด, ์•„๋ž˜๊ฐ™์€ ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค.

abstract int read(char[] cbuf, int off, int len)
void write(char[] cbuf)

๊ทธ๋ฆฌ๊ณ  ๋‹จ์ˆœํžˆ 2 byte๋กœ ์ž…์ถœ๋ ฅ์„ ํ•˜๋Š” ๊ฒƒ์—์„œ ๋๋‚˜์ง€ ์•Š๊ณ , ์—ฌ๋Ÿฌ ์ข…๋ฅ˜์˜ ์ธ์ฝ”๋”ฉ๊ณผ ์ž๋ฐ”์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์œ ๋‹ˆ์ฝ”๋“œ๊ฐ„์˜ ๋ณ€ํ™˜์„ ์ž๋™์œผ๋กœ ์ฒ˜๋ฆฌํ•ด์ค€๋‹ค. ์ง€์ •๋œ ์ธ์ฝ”๋”ฉ์„ ์‚ฌ์šฉํ•˜๋Š” Reader๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜๋„ ์žˆ๊ณ , ํ˜„์žฌ ์ธ์ฝ”๋”ฉ์„ ์•Œ๋ ค์ฃผ๊ธฐ๋„ ํ•œ๋‹ค. ์•„๋ž˜ ์˜ˆ์ œ ์ฝ”๋“œ์˜ ์ถœ๋ ฅ์„ ์‚ดํŽด๋ณด๋ฉด,

import java.io.*;

public class Main {
    public static void main(String[] args) throws FileNotFoundException {

        try
        {
            FileInputStream fis = new FileInputStream("D:\\test.txt");
            FileReader fr = new FileReader("D:\\test.txt");

            int data = 0;
            while( (data = fis.read()) != -1) {
                System.out.print((char) data);
            }

            fis.close();

            System.out.println();
            while((data = fr.read())!= -1)
            {
                System.out.print((char)data);
            }

            fr.close();

        }catch (IOException e)
        {
            e.printStackTrace();
        }


    }

}

์ถœ๋ ฅ :
รฏยปยฟรฌยยดรชยฒยƒรฌยย€ รญย…ยŒรฌยŠยครญยŠยธ
๏ปฟ์ด๊ฒƒ์€ ํ…Œ์ŠคํŠธ

์ด๋ ‡๊ฒŒ ๊ธฐ๋ณธ FileInputStream์„ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ๋Š” ํ•œ๊ธ€์ด ๊นจ์ ธ์„œ ๋‚˜์˜ค๋Š”๊ฑธ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ๋‹ค๋งŒ, ์ด๋ฏธ์ง€์™€ ์‚ฌ์šด๋“œ ๊ฐ™์€ ๋ฐ”์ด๋„ˆ๋ฆฌ ํŒŒ์ผ๋“ค์„ ์ฒ˜๋ฆฌํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋ฉด ์ œ๋Œ€๋กœ ๋˜์ง€ ์•Š์œผ๋‹ˆ, ์“ฐ์ž„์ƒˆ๋ฅผ ๊ผญ ํŒŒ์•…ํ•˜๊ณ  ์ ์ ˆํ•œ Stream ์„ ์“ฐ๋„๋ก ํ•˜์ž.

โ” ๋‹ค์‹œ ๋Œ์•„์™€์„œ, ๊ทธ๋Ÿผ BufferedReader / Writer ๋Š”?

๋ฒ„ํผ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž…์ถœ๋ ฅ์˜ ํšจ์œจ์„ ๋Š˜๋ฆฌ๋Š” ๋ฌธ์ž๊ธฐ๋ฐ˜์˜ ๋ณด์กฐ ์ŠคํŠธ๋ฆผ์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๊ฒ ๋‹ค.

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int someInput = Integer.parseInt(br.readLine());

๊ทธ๋ฆฌ๊ณ  Scanner๋ณด๋‹ค ๋นจ๋ž๋˜ ์ด์œ ๋Š” Buffer ํฌ๊ธฐ ์‚ฌ์ด์ฆˆ ๋•Œ๋ฌธ์ด๋‹ค. Scanner ๋Š” 1KB ํฌ๊ธฐ์˜ ๋ฒ„ํผ๋ฅผ ๊ฐ–์ง€๋งŒ, BufferedReader๋Š” ๊ทธ๊ฒƒ๋ณด๋‹ค ํฐ ๋ฒ„ํผ๋ฅผ ๊ฐ€์ ธ, ํ•œ๋ฒˆ์— ์ „์†กํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋น ๋ฅด๋‹ค. ์ถ”๊ฐ€์ ์œผ๋กœ๋Š”, Scanner๋Š” Parsing ๊ณผ์ •์„ ๊ฑฐ์น˜๊ธฐ ๋•Œ๋ฌธ์— ํŽธ๋ฆฌํ•œ ๋ถ€๋ถ„์ด ๋ถ„๋ช… ์žˆ์ง€๋งŒ ์‹œ๊ฐ„์ด ์†Œ์š”๋˜๊ธฐ ๋•Œ๋ฌธ์— ํ‰๊ท  ์•ฝ 8๋ฐฐ ์ •๋„ ์ž…์ถœ๋ ฅ์— ๋Œ€ํ•ด BufferedReader ๊ฐ€ ๋น ๋ฅด๋‹ค.

์ด์ œ ๋‚˜๋จธ์ง€ ๋ถ€๋ถ„์€ System. in ์ด ๋ถ€๋ถ„์ธ๋ฐ, ํ‘œ์ค€ ์ž…์ถœ๋ ฅ ์‹œ์Šคํ…œ (Standard I/O)์ด๋‹ค. ๋”ฐ๋กœ ์ƒ์„ฑํ•˜์ง€ ์•Š์•„๋„, ์ž๋ฐ” ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•˜๋ฉด ์ž๋™์œผ๋กœ 3๊ฐ€์ง€, in, out, err ๊ฐ€ ์ƒ์„ฑ๋˜์–ด ์ œ๊ณต๋œ๋‹ค. ๋‚ด๋ถ€๋ฅผ ์กฐ๊ธˆ ๋” ์‚ดํŽด๋ณด๋ฉด, ์ด๋ ‡๊ฒŒ ์„ ์–ธ๋˜์–ด ์žˆ๋‹ค :

public final static InputStream in = null;
public final static PrintStream out = null;
public final static PrintStream err = null;

in, out, err ๋Š” System ํด๋ž˜์Šค์— ์„ ์–ธ๋œ static ๋ณ€์ˆ˜์ด๋ฉฐ, ํƒ€์ž…์€ InputStream/PrintStream์ด์ง€๋งŒ ์‹ค์ œ๋กœ๋Š” BufferedInputStream/BufferedPrintStream์˜ ์ธ์Šคํ„ด์Šค๋กœ ์‚ฌ์šฉ๋œ๋‹ค. ๋ฌผ๋ก , setIn(), setOut(), setErr() ๋“ฑ์˜ ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด ์ฝ˜์†” ์ด์™ธ์— ๋‹ค๋ฅธ ์ž…์ถœ๋ ฅ ๋Œ€์ƒ์œผ๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค.

profile
ํ•ญ์ƒ ์œ„๋ฅผ ๋ฐ”๋ผ๋ณด๋Š” ํ”„๋กœ๊ทธ๋ž˜๋จธ

0๊ฐœ์˜ ๋Œ“๊ธ€