System.in / out ํ…Œ์ŠคํŠธ

Java์˜ ํ‘œ์ค€ ์ž…์ถœ๋ ฅ

  • System.in / out

  • System.err / setErr()

  • System.setIn() / Out()

System.In


์˜ˆ์ œ

public String inputCarNames() {
    String input = Console.readLine();
    checkEmptyAndBlank(input);
    return input;
}

private void checkEmptyAndBlank(String input) {
    inputValidator.validateInputEmpty(input);
    inputValidator.validateInputBlank(input);
}

๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฉ”์†Œ๋“œ๋ฅผ ํ…Œ์ŠคํŠธ ํ•˜๋ ค๊ณ ํ•œ๋‹ค. Console.readLine()์€ Scanner์˜ readLine()๊ณผ ๋™์ผํ•˜๋‹ค.

โ“ ํ…Œ์ŠคํŠธ๋Š” input(๋ฌธ์ž์—ด์„ ์ž…๋ ฅ๋ฐ›๋Š” ์ƒํ™ฉ)์„ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ• ๊นŒ?

ByteArrayInputStream๊ณผ ByteArrayOutputStream์€ ๋ฉ”๋ชจ๋ฆฌ, ์ฆ‰ ๋ฐ”์ดํŠธ ๋ฐฐ์—ด์— ๋ฐ์ดํ„ฐ๋ฅผ ์ž…์ถœ๋ ฅํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋˜๋Š” ์ŠคํŠธ๋ฆผ์ด๋‹ค. ์ฃผ๋กœ ๋‹ค๋ฅธ๊ณณ์— ์ž…์ถœ๋ ฅํ•˜๊ธฐ ์ „์— ๋ฐ์ดํ„ฐ๋ฅผ ์ž„์‹œ๋กœ ๋ฐ”์ดํŠธ ๋ฐฐ์—ด์— ๋‹ด์•„์„œ ๋ณ€ํ™˜๋“ฑ์˜ ์ž‘์—…์„ ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋œ๋‹ค. ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” byte[] ๋ฐฐ์—ด์„ ์ธ์ž๋กœ ๋„˜๊ฒจ์ค˜์•ผ ํ•œ๋‹ค.

  • getBytes()๋Š” byte arrary๋กœ ๋ณ€ํ™˜ํ•ด์„œ ๋ฐ˜ํ™˜ํ•ด์ค€๋‹ค.

  • ByteArrayInputStream์€ InputStream์„ ์ƒ์†๋ฐ›๊ธฐ ๋•Œ๋ฌธ์— ํƒ€์ž…์€ InputStream์„ ์‚ฌ์šฉํ•ด๋„ ๋œ๋‹ค.

System.setIn(InputStream in) :

  • ํ‘œ์ค€ ์ž…๋ ฅ์„ ํ‚ค๋ณด๋“œ, ํŒŒ์ผ, ๋‹ค๋ฅธ ์†Œ์Šค์—์„œ ์ž…๋ ฅ ๋ฐ›๊ณ ๋ก ์„ค์ •ํ•œ๋‹ค.

  • ํ‘œ์ค€ ์ž…๋ ฅ ์ŠคํŠธ๋ฆผ(System.in)์„ ์žฌ์ง€์ •ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋œ๋‹ค. ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ์ค‘ ์ž…๋ ฅ ์ŠคํŠธ๋ฆผ์„ ์›ํ•˜๋Š” ์ž…๋ ฅ ๋ฐ์ดํ„ฐ๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค.

  • System.setIn()์„ ์‚ฌ์šฉํ•ด์„œ System.in์„ empty, blank์˜ byte arrary๋กœ ์„ค์ •ํ–ˆ๋‹ค. ์ด๊ฒƒ์€ readLine()๊ณผ ๋™์ผํ•œ ๊ธฐ๋Šฅ์„ ํ•œ๋‹ค.

triangle-exclamation

ํ”„๋ฆฌ์ฝ”์Šค์˜ Console.readLine()

์šฐํ…Œ์ฝ” ํ”„๋ฆฌ์ฝ”์Šค์—์„œ๋Š” Console์ด๋ผ๋Š” ๋ชจ๋“ˆ์„ ์ œ๊ณตํ•ด์„œ ์ด๊ฒƒ์œผ๋กœ ์ž…๋ ฅ์„ ๋ฐ›๋Š”๋‹ค.

์ฝ˜์†”์˜ ๋‚ด๋ถ€ ๊ตฌํ˜„์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

์ž…๋ ฅ๋ฐ›๋Š” ํ…Œ์ŠคํŠธ๋ฅผ ํ•œ๋ฒˆ์— ์—ฌ๋Ÿฌ๊ฐœ ์‹คํ–‰ํ•˜๋ฉด NoSuchElementException ์„ ๋ฑ‰์–ด๋ฒ„๋ฆฌ๋Š”๋ฐ, ๊ทธ ์ด์œ ๋Š” getInstance().nextLine()์— ์žˆ๋‹ค.

์ฝ˜์†”์˜ Scanner๋Š” stacic์œผ๋กœ ์„ ์–ธ๋˜์–ด ์žˆ๊ณ , ์ฒซ ๋ฒˆ์งธ ํ…Œ์ŠคํŠธ์—์„œ System.in์— "blank" ๊ฐ’์„ ๋„ฃ๋Š”๋‹ค.

  • ํ…Œ์ŠคํŠธ์—์„œ๋Š” Console.readLine()์œผ๋กœ ์ž…๋ ฅ์„ ๋„ฃ๋Š” ์ฝ”๋“œ๊ฐ€ ์กด์žฌํ•œ๋‹ค.

๊ทธ๋Ÿฌ๋ฉด Scanner๊ฐ€ ์ƒ์„ฑ๋˜๋ฉด์„œ "blank"๋ฅผ ์Šค์บ”ํ•œ๋‹ค. ๊ทธ ๋‹ค์Œ ๋‘ ๋ฒˆ์จฐ ํ…Œ์ŠคํŠธ์—์„œ ๋˜ Console.readLine()์„ ํ˜ธ์ถœํ•œ๋‹ค. ์—ฌ๊ธฐ์„œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ด๋ฒ„๋ฆฐ๋‹ค. getInstance()๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ Scanner๋Š” ์ด๋ฏธ ๋งŒ๋“ค์–ด์ง„ ์ƒํƒœ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋‘ ๋ฒˆ์งธ์—์„œ Console.read()์„ ํ˜ธ์ถœํ•˜๋ฉด ์ด๋ฏธ ์ƒ์„ฑ๋œ Scanner๋ฅผ ๋ฐ˜ํ™˜ ํ•ด๋ฒ„๋ฆฐ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

๊ฒฐ๊ตญ, ์ฒซ ๋ฒˆ์งธ ํ…Œ์ŠคํŠธ์—์„œ Scanner๊ฐ€ ์ƒ์„ฑ๋˜๊ณ  ๊ฐ’์„ ํ• ๋‹นํ•œ๋‹ค. ๋‘ ๋ฒˆ์งธ ํ…Œ์ŠคํŠธ์—์„œ Console.reaLine()์„ ํƒ€๊ฒŒ ๋˜๋ฉด ์ด๋ฏธ System.in์— ์ฒซ ๋ฒˆ์งธ input๊ฐ’์ด ํ• ๋‹น ๋˜์–ด์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ๋‘ ๋ฒˆ์จฐ ํ…Œ์ŠคํŠธ์—์„œ๋Š” ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค.

์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ•˜๋‚˜?

@AfterEach ์–ด๋…ธํ…Œ์ด์…˜์„ ์ ์šฉ์‹œ์ผœ์„œ ๋ฉ”์†Œ๋“œ๊ฐ€ ์‹คํ–‰๋˜๊ณ  ๋‚œ ํ›„, static ์˜์—ญ์— ์กด์žฌํ•˜๋Š” Scanner๋ฅผ null๋กœ ๋ฐ”๊ฟ”์•ผํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๋‹ค์Œ ํ…Œ์ŠคํŠธ๋„ ์ž˜ ์ˆ˜ํ–‰๋œ๋‹ค.

System.out


System.in์€ InputStream์„ ์‚ฌ์šฉํ•ด์„œ System.in์„ ์Šค์บ”ํ•˜๋ฉฐ ํ…Œ์ŠคํŠธ ํ–ˆ๋‹ค.

System.out์€ ์ถœ๋ ฅ๋  ๋ฌธ๊ตฌ๋ฅผ PrintStream์— ๋‹ด๋Š”๋‹ค.

outputView.method()์—๋Š” System.out.print()๋ฉ”์†Œ๋“œ๊ฐ€ ๋‹ด๊ฒจ์žˆ๋‹ค. ๋ฉ”์†Œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด OutputStream output์— byte๋กœ ์ €์žฅ๋œ๋‹ค. ์›ํ•˜๋Š” ์ถœ๋ ฅ ๋ฌธ๊ตฌ์™€ output.toString()์œผ๋กœ ์ถœ๋ ฅ ๋ฌธ๊ตฌ๋ฅผ ๋น„๊ตํ•œ๋‹ค.

๋‘ ๊ฐœ ์ด์ƒ์˜ ๋ฉ”์†Œ๋“œ๋ฅผ ์—ฐ์†์œผ๋กœ ํ…Œ์ŠคํŠธ ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” @AfterEach๋ฅผ ์„ค์ •ํ•˜์ž.

  • replaceAll("\n", "")์„ ์ž‘์„ฑํ•˜๋ฉด output.toString() ๊ฒฐ๊ณผ์—์„œ ๊ฐœํ–‰์ด ์‚ฌ๋ผ์ง„๋‹ค.

  • strip()์€ ๋ฌธ์ž์—ด์˜ ์‹œ์ž‘๊ณผ ๋์—์„œ ๊ณต๋ฐฑ์„ ์ œ๊ฑฐํ•˜๋Š” ๋ฉ”์„œ๋“œ์ด๋‹ค.

  • @CsvSourece์— ์˜ต์…˜์„ ์ถ”๊ฐ€ํ•˜๋ฉด, ์ขŒ์šฐ ๊ณต๋ฐฑ์„ ์ž๋™์œผ๋กœ ์‚ญ์ œํ•˜์ง€ ์•Š๋Š”๋‹ค. ignoreLeadingAndTrailingWhitespace = false

output.toString()์œผ๋กœ๋Š” ์›ํ•˜๋Š” ๊ฒฐ๊ณผ๊ฐ€ ๋น„๊ต๋˜์ง€ ์•Š์•„์„œ ๋‘ ๋ฉ”์†Œ๋“œ๋ฅผ ํ™œ์šฉํ•ด์„œ ๋น„๊ตํ•œ๋‹ค.

Last updated