Programming/Java

F010 - System.out.println(), Logger

osean 2021. 5. 19. 16:52
โœ๏ธ ์ฒ˜์Œ Java๋ฅผ ๊ณต๋ถ€ ํ•  ๋•Œ, "Hello World" ๋ผ๋Š” ๋ฌธ์ž์—ด์„ ์ฝ˜์†”์ฐฝ์— ์ถœ๋ ฅํ•˜๋Š” ๊ฒƒ ๋ถ€ํ„ฐ ์‹œ์ž‘ํ–ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ตœ๊ทผ๊นŒ์ง€ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•˜๋ฉด์„œ ์—ฌ๋Ÿฌ ์ •๋ณด๋ฅผ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด System.out.println() ๋ฅผ ์ž์ฃผ ์‚ฌ์šฉํ–ˆ๋‹ค.
ํ•˜์ง€๋งŒ CTO๋‹˜๊ป˜์„œ System.out.println()๋ฅผ ์ง€์–‘ํ•˜๊ณ  Log ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์จ์„œ ํ™•์ธํ•˜๋ผ๊ณ  ํ•˜์…”์„œ ๋ฌป์ง€๋„ ๋”ฐ์ง€์ง€๋„ ์•Š๊ณ  Log ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค.

์ด๋ฒˆ ์‹œ๊ฐ„์—๋Š” ์ตœ๊ทผ ๋ฉ˜ํ† ๋ง ์ค‘์— ๋ฉ˜ํ† ๋‹˜๊ป˜์„œ ์™œ ์‹ค์ œ ๊ฐœ๋ฐœ ์‹œ์— System.out.println()์„ ์‚ฌ์šฉํ•˜๋ฉด ์•ˆ๋˜๋Š”์ง€, ์™œ Log ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ด์šฉํ•ด์•ผ ํ•˜๋Š”์ง€ ์งˆ๋ฌธํ•ด์ฃผ์…จ๋Š”๋ฐ ์™œ ๊ทธ๋Ÿฐ์ง€ ์•Œ์•„๋ณด์ž!

System.out.println()

ํ•ด๋‹น ๋ช…๋ น์–ด๋Š” java.lang ํŒจํ‚ค์ง€์— ์†ํ•œ System ํด๋ž˜์Šค์˜ ํด๋ž˜์Šค ํ•„๋“œ๋กœ ์„ ์–ธ๋˜์–ด ์žˆ๋Š” PrintStream ํด๋ž˜์Šค์˜ ๋ฉ”์†Œ๋“œ์ด๋‹ค.

System.class

ํ‘œ์ค€ ์ž…๋ ฅ๊ณผ ํ‘œ์ค€ ์ถœ๋ ฅ ๊ทธ๋ฆฌ๊ณ  ์˜ค๋ฅ˜ ์ถœ๋ ฅ ์ŠคํŠธ๋ฆผ์„ ์ œ๊ณตํ•˜๋Š” ํด๋ž˜์Šค๋กœ ์ธ์Šคํ„ด์Šคํ™”๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•œ ํด๋ž˜์Šค์ด๋‹ค. ๋˜ํ•œ, ์™ธ๋ถ€์ ์œผ๋กœ ์ •์˜๋œ ์‹œ์Šคํ…œ์— ๊ด€๋ จํ•œ ์†์„ฑ์ด๋‚˜ ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ๋“ฑ์„ ์—‘์„ธ์Šค ํ•  ์ˆ˜ ์žˆ๊ณ , ํŒŒ์ผ ๋ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ฝ๋Š” ์ˆ˜๋‹จ ๊ทธ๋ฆฌ๊ณ  ๋ฐฐ์—ด์„ ๋ณต์‚ฌํ•˜๋Š” ์ˆ˜๋‹จ์œผ๋กœ ์‚ฌ์šฉ ํ•  ์ˆ˜ ์žˆ๋Š” ํด๋ž˜์Šค์ด๋‹ค.

ํด๋ž˜์Šค ํ•„๋“œ๋กœ PrintStream, InputStream ํด๋ž˜์Šค๋ฅผ ์ฐธ์กฐํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, PrintStream ํด๋ž˜์Šค๋Š” error, out ๋‘ ๊ฐœ์˜ ํด๋ž˜์Šค ๋ณ€์ˆ˜๋กœ ์„ ์–ธํ–ˆ๋‹ค.

๋Œ€ํ‘œ์ ์ธ ๋ฉ”์†Œ๋“œ ์‚ดํŽด๋ณด๊ธฐ

๐Ÿ”Ž Syetem.gc() → GC๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.

๐Ÿ”Ž System.out.println() → PrintStream ํด๋ž˜์Šค๋ฅผ ์ด์šฉํ•ด ๋ฌธ์ž์—ด์„ ์ถœ๋ ฅํ•œ๋‹ค.

๐Ÿ”Ž System.nanoTime() → ์‹คํ–‰ ์ค‘์ธ JVM์˜ ํ˜„์žฌ ๊ฐ’์„ ๋‚˜๋…ธ์ดˆ๋กœ ๋ฆฌํ„ดํ•œ๋‹ค.

PrintStream.class

FilterOutputStream ํด๋ž˜์Šค๋ฅผ ์ƒ์† ๋ฐ›๋Š” ํด๋ž˜์Šค๋กœ ๋‹ค์–‘ํ•œ ์ž…๋ ฅ๊ฐ’์„ ์ฝ˜์†”์ฐฝ์— ์ถœ๋ ฅ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋ฉฐ, ๋‹ค๋ฅธ ์ถœ๋ ฅ ์ŠคํŠธ๋ฆผ๊ณผ ๋‹ฌ๋ฆฌ IOException ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค. ํ•ด๋‹น ํด๋ž˜์Šค๋กœ ์ถœ๋ ฅ๋œ ๋ชจ๋“  ๋ฌธ์ž์—ด๋“ค์€ ํ”Œ๋žซํผ์˜ ์ธ์ฝ”๋”ฉ์„ ์ด์šฉํ•ด byte๋กœ ๋ณ€ํ™˜๋œ๋‹ค.

์™œ ์‚ฌ์šฉ์„ ์ง€์–‘ํ•˜๋Š”๊ฑธ๊นŒ?

์ง€๊ธˆ๊นŒ์ง€ ์–ด๋–ค ์ƒํ™ฉ์—์„œ System.out.println()์„ ์‚ฌ์šฉํ–ˆ์„๊นŒ? ์ฃผ๋กœ ๋ฐ์ดํ„ฐ๊ฐ€ ํ˜„์žฌ ์–ด๋–ค ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”์ง€, ๋‚ด๊ฐ€ ์˜๋„ํ•œ๋Œ€๋กœ ์กฐ๊ฑด๋ฌธ์ด ์ž‘์„ฑ๋˜์—ˆ๋Š”์ง€, for ๊ตฌ๋ฌธ์—์„œ ๋ช‡ ๋ฒˆ์งธ ๋ฃจํ”„์— ๋ฐ์ดํ„ฐ๊ฐ’์ด ๋ฌด์—‡์ธ์ง€ ๋“ฑ์˜ ์ƒํ™ฉ์—์„œ ์‚ฌ์šฉํ–ˆ์—ˆ๋‹ค.
(๋Œ€๋ถ€๋ถ„ ๋””๋ฒ„๊น…์„ ํ†ตํ•ด ํ™•์ธ ๊ฐ€๋Šฅํ•˜๋‹ค. ๋‹ค๋งŒ, ๋‚ด๊ฒ ์•„์ง ์ต์ˆ™ํ•˜์ง€ ์•Š์„ ๋ฟ๐Ÿ’ฆ)

๊ทธ๋ ‡๋‹ค๋ฉด ๋‹ค์‹œ Java๋ฅผ ์ฒ˜์Œ ๋ฐฐ์šธ ๋•Œ๋กœ ๋Œ์•„๊ฐ€์„œ, "Hello Wolrd" ๋ผ๋Š” ๋ฌธ์ž์—ด์„ System.out.println() ์œผ๋กœ ์ฝ˜์†”์— ์ถœ๋ ฅ ํ–ˆ์„ ๋•Œ ํ˜„์žฌ ์‹œ์Šคํ…œ์— ๋Œ€ํ•œ ๊ธฐ๋ณธ ์ •๋ณด๊ฐ€ ํ•จ๊ป˜ ์ถœ๋ ฅ๋˜์—ˆ๋Š”๊ฐ€? ์˜ค์ง "Hello Wolrd" ๋ผ๋Š” ๋ฌธ์ž์—ด๋งŒ ์ถœ๋ ฅ๋˜์—ˆ๋‹ค.

์ฆ‰, System.out.println()์„ ์‹ค์ œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ๋Š” ํ˜„์žฌ ์‹œ์Šคํ…œ์˜ ๊ธฐ๋ณธ ์ •๋ณด๋ฅผ ์•Œ ์ˆ˜ ์—†๋‹ค. ๋” ๋‚˜์•„๊ฐ€ ์˜ˆ์™ธ ๋ฐœ์ƒ ์‹œ, ์ฝ˜์†” ์ฐฝ์— ์ถœ๋ ฅ๋งŒ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ•ด๋‹น ๋ฉ”์„ธ์ง€๋ฅผ ๋‚˜์ค‘์— ๋‹ค์‹œ ํ™•์ธ ํ•  ์ˆ˜๊ฐ€ ์—†๋‹ค.
(๋ฌผ๋ก  ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ํ˜„์žฌ ์ƒํƒœ ๋“ฑ์„ ๋‹ด์•„ ํŒŒ์ผ๋กœ ์ €์žฅํ•˜๊ฒŒ๋” ํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ๋ฒˆ๊ฑฐ๋กœ์šธ ๋ฟ!)

์ด๋Ÿฌํ•œ ๋ฌธ์ œ์ ์œผ๋กœ ์ธํ•ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ƒํƒœ๋ฅผ ๋ถ„์„ํ•˜๊ณ  ์œ ์ง€๋ณด์ˆ˜ํ•˜๊ธฐ์— ํฐ ์–ด๋ ค์›€์ด ์žˆ๋‹ค. ๋•Œ๋ฌธ์— ์กฐ๊ธˆ ๋” ์ˆ˜์›”ํ•˜๊ฒŒ ๊ฐœ๋ฐœ ํ•  ์ˆ˜ ์žˆ๋„๋ก Log ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.


Logger

Log4j, Slf4j ๋“ฑ๊ณผ ๊ฐ™์€ ๋‹ค์–‘ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์กด์žฌํ•˜์ง€๋งŒ Java์—์„œ๋Š” Logger๋ผ๋Š” ์ž์ฒด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ง€์›ํ•œ๋‹ค. Java์˜ Logger๋Š” ์ด 7๋‹จ๊ณ„์˜ ๋ ˆ๋ฒจ๋กœ ๋‚˜๋‰˜์–ด ๋กœ๊น…์„ ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ œ๊ณตํ•œ๋‹ค.

  • SEVERE (High Level)
  • WARNING
  • INFO
  • CONFIG
  • FINE
  • FINER
  • FINEST (Low Level)

Logger ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž๋Š” protected๊ฐ€ ์„ ์–ธ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— new ์ƒ์„ฑ์ž๋ฅผ ์ด์šฉํ•ด์„œ ๋ณ€์ˆ˜ ์„ ์–ธ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค. ํ•˜์ง€๋งŒ Logger.getLogger() ๋ฉ”์†Œ๋“œ๋ฅผ ์ด์šฉํ•ด ๊ฐ์ฒด ์ƒ์„ฑ์ด ๊ฐ€๋Šฅํ•œ๋ฐ ํด๋ž˜์Šค์˜ ์ด๋ฆ„๊ณผ ํ•„์š”ํ•˜๋‹ค๋ฉด ๋ฆฌ์†Œ์Šค ์ด๋ฆ„์„ ๋งค๊ฐœ ๋ณ€์ˆ˜ ์ธ์ž๋กœ ๋„ฃ์–ด์•ผ ์ƒ์„ฑ ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ณดํ†ต ๋ฉ”์†Œ๋“œ ๋‚ด์—์„œ ํ˜ธ์ถœํ•˜๊ธฐ๋ณด๋‹ค๋Š” ํด๋ž˜์Šค ๋ณ€์ˆ˜๋กœ ๋งŒ๋“ค์–ด ์‚ฌ์šฉํ•˜๋Š”๋ฐ, ์•ž์—์„œ ์„ค๋ช…ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ํด๋ž˜์Šค์˜ ์ด๋ฆ„์„ ๋„ฃ์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ตณ์ด ๋ฉ”์†Œ๋“œ ๋ณ„๋กœ ์ง€์—ญ ๋ณ€์ˆ˜๋กœ ๋งŒ๋“ค์–ด ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

private static final Logger logger = Logger.getLogger(LoggerTest.class.getName());

์œ„์˜ ์ฝ”๋“œ์ฒ˜๋Ÿผ private, statitc, final ์ œ์–ด์ž์™€ ํ•จ๊ป˜ ์„ ์–ธํ•˜๋ฉด ํ•ด๋‹น ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›๋Š” ์ž์‹ ํด๋ž˜์Šค์—์„œ๋Š” ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ logger๋ฅผ ํ˜ธ์ถœ ํ•  ์ˆ˜ ์—†๊ณ , ์žฌ์ •์˜๋„ ๋ถˆ๊ฐ€๋Šฅํ•˜๋ฉฐ, ํ•ด๋‹น ๊ฐ์ฒด๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์— ํ• ๋‹น๋œ ํ›„ JVM์ด ์ข…๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๋ฉ”๋ชจ๋ฆฌ์— ๋‚จ์•„์žˆ๊ฒŒ ๋œ๋‹ค.

logger.info("Hello");
logger.log(Level.WARNING, "์œ„ํ—˜ํ•œ ์ƒํƒœ!");

/*
	May 19, 2021 4:29:36 PM composition.interfaceComposition.InterfaceTest main
	์ •๋ณด: hello
	May 19, 2021 4:29:36 PM composition.interfaceComposition.InterfaceTest main
	๊ฒฝ๊ณ : ์œ„ํ—˜ํ•œ ์ƒํƒœ!
*/

์œ„์˜ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด ์•Œ ์ˆ˜ ์žˆ๋“ฏ, ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ์—ฌ๋Ÿฌ ๋ ˆ๋ฒจ์˜ ๋กœ๊ทธ๋ฅผ ์ถœ๋ ฅ ํ•  ์ˆ˜ ์žˆ๋‹ค.

์™œ ๊ธฐ๋ณธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„๊นŒ?

๋จผ์ € JDK 1.4๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋” ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” log4j๊ฐ€ ์ƒ์šฉํ™›ํžˆ์–ด ์žˆ์—ˆ๊ธฐ์— ๊ตณ์ด Logger๋ฅผ ์ฐพ์•„ ์“ธ ํ•„์š”๊ฐ€ ์—†์—ˆ๋‹ค๊ณ  ํ•œ๋‹ค. ์ด๋Š” ๋‹จํŽธ์ ์ธ ์ด์œ ์ด๊ณ , ๋” ํฐ ์ด์œ ๋Š” ๋‹ค๋ฅธ Log ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋น„ํ•ด ์„ฑ๋Šฅ ์ƒ ์ด์Šˆ๊ฐ€ ๋งŽ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๐Ÿ›  ๋‹ค๋ฅธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋น„ํ•ด ํผํฌ๋จผ์Šค๊ฐ€ ๋Š๋ฆฌ๋‹ค.

๐Ÿ›  FINE, FINER, FINEST ๋กœ๊ทธ๊ฐ€ ์˜๋ฏธํ•˜๋Š” ๊ฒƒ์„ ํŒŒ์•…ํ•˜๊ธฐ ํž˜๋“ค๋‹ค.

๐Ÿ›  ๊ฐœ๋ฐœ์ž๊ฐ€ Custome Level์„ ๊ตฌํ˜„ ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, Custom Level์„ ์ด์šฉํ•ด ๋กœ๊ทธ ์ถœ๋ ฅ ์‹œ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

๐Ÿ›  ๋‹ค๋ฅธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋น„ํ•ด ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ์ด ์ ๋‹ค.

๐Ÿค” ์ตœ๊ทผ๋ถ€ํ„ฐ ๋กœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์‹œ์ž‘ํ•˜๋ฉด์„œ ์•„๋ฌด ์˜๋ฏธ๋„ ๋ชจ๋ฅธ ์ฑ„ ์‚ฌ์šฉํ•˜๊ณ , ์„ ์ž„ ๊ฐœ๋ฐœ์ž๋‹˜๋“ค๊ป˜์„œ ์„œ๋ฒ„์— ์Œ“์ธ ๋กœ๊ทธ ํ™•์ธํ•ด๋ณด๋ผ๊ณ  ํ•˜์‹ค ๋•Œ ๊ทธ ์ด์œ ๋ฅผ ์ •ํ™•ํžˆ ํŒŒ์•…ํ•˜์ง€ ๋ชปํ–ˆ๋Š”๋ฐ, ์ด๋ฒˆ ์‹œ๊ฐ„์„ ํ†ตํ•ด์„œ ์™œ ๋กœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š”์ง€ ํŒŒ์•… ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค.

๋˜ํ•œ, ์ด๋ฒˆ ์‹œ๊ฐ„์„ ํ†ตํ•ด ๊ทธ์ € ๋กœ๊ทธ๋ฅผ ์ฐ์–ด๋ณด๋ฉฐ ์ƒํƒœ๋ฅผ ํ™•์ธํ•˜๊ธฐ๋ณด๋‹จ ๋””๋ฒ„๊น…๊ณผ ํ…Œ์ŠคํŠธ ์ฃผ๋„ ๊ฐœ๋ฐœ์„ ํ†ตํ•ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐ ํ•  ์ˆ˜ ์žˆ๋Š” ์—ญ๋Ÿ‰์„ ํ‚ค์›Œ์•ผ๊ฒ ๋‹ค๊ณ  ๋Š๊ผˆ๋‹ค.

 

Java Platform SE 8

 

docs.oracle.com

 

์ž๋ฐ” java.util.logging vs log4j vs slf4j? ์–ด๋–ค ๊ฒƒ์„ ์‚ฌ์šฉํ•ด์•ผ ํ• ๊นŒ?

 

www.fwantastic.com

 

'Programming > Java' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

F012 - Annotation  (0) 2021.05.24
F011 - java.lang.ref  (0) 2021.05.19
F009 - Inheritance, Composition  (0) 2021.05.18
F008 - Garbage Collector  (2) 2021.05.16
F007 - JVM : Memory Architecture  (0) 2021.05.14