๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๋นˆ ๊ตฌ๋ฉ ์ฑ„์šฐ๊ธฐ

[Java] I/O Buffer

์ถœ์ฒ˜

ChatGPT

https://velog.io/@mmy789/Java-NIO-3

 

[Java] NIO - ๋ฒ„ํผ

๋ฒ„ํผ ์‚ฌ์šฉ๋ฒ•์„ ์•Œ์•„๋ณด์ž!

velog.io

 


๋ฒ„ํผ๋ž€? Buffer

๋ฒ„ํผ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ผ์‹œ์ ์œผ๋กœ ์ €์žฅํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์ด๋‹ค. ์ฃผ๋กœ ์ž…์ถœ๋ ฅ (I/O) ์ž‘์—…์—์„œ ์‚ฌ์šฉ๋˜๋ฉฐ, ๋ฐ์ดํ„ฐ๋ฅผ ๋ชจ์•„์„œ ํ•œ๊บผ๋ฒˆ์— ์ฝ๊ฑฐ๋‚˜ ์“ฐ๋Š” ๋ฐฉ์‹์œผ๋กœ ์„ฑ๋Šฅ์„ ๊ฐœ์„ ํ•œ๋‹ค.

 

๋ฒ„ํผ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ 

1. ์ž…์ถœ๋ ฅ ์„ฑ๋Šฅ ํ–ฅ์ƒ

์ž…์ถœ๋ ฅ ์žฅ์น˜๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ CPU๋ณด๋‹ค ์†๋„๊ฐ€ ๋Š๋ฆฌ๊ธฐ ๋–„๋ฌธ์—, ๋ฐ์ดํ„ฐ๋ฅผ ํ•˜๋‚˜์”ฉ ์ „์†กํ•˜๋ฉด ๋งค์šฐ ๋น„ํšจ์œจ์ ์ผ ์ˆ˜ ์žˆ๋‹ค. ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋ฒ„ํผ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ผ์ •๋Ÿ‰ ๋ชจ์•„ ํ•œ ๋ฒˆ์— ์ „์†Œํ•จ์œผ๋กœ์จ ์„ฑ๋Šฅ์„ ํฌ๊ฒŒ ํ–ฅ์ƒ์‹œํ‚จ๋‹ค.

CPU์™€ ์ž…์ถœ๋ ฅ ๊ธฐ๊ธฐ์˜ ์†๋„ ์ฐจ์ด

  • CPU๋Š” ์ดˆ๋‹น ์ˆ˜์‹ญ์–ต ๋ช…๋ น์–ด๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ณ ์† ์žฅ์น˜์ด๋‹ค.
  • ์ž…๋ ฅ์ถœ ๊ธฐ๊ธฐ๋Š” ์ƒ๋Œ€์ ์œผ๋กœ ๋Š๋ฆฐ ์žฅ์น˜์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ํ•˜๋“œ๋””์Šคํฌ๋Š” ๋ฌผ๋ฆฌ์ ์ธ ํšŒ์ „๊ณผ ํ—ค๋“œ ์ด๋™์ด ํ•„์š”ํ•˜๋ฉฐ, ๋„คํŠธ์›Œํฌ ํ†ต์‹ ์€ ๋Œ€๊ธฐ ์‹œ๊ฐ„์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์ด๋Ÿฌํ•œ ์†๋„ ์ฐจ์ด ๋•Œ๋ฌธ์— CPU๊ฐ€ ์ž…์ถœ๋ ฅ ์ž‘์—…์„ ๊ธฐ๋‹ค๋ฆฌ๋ฉด์„œ ๋ฉˆ์ถ”๊ฒŒ ๋˜๋ฉด ์ „์ฒด ์‹œ์Šคํ…œ์˜ ์„ฑ๋Šฅ์ด ์ €ํ•˜๋œ๋‹ค. ์ด๋Š” I/O ๋ณ‘๋ชฉ ํ˜„์ƒ์ด๋ผ๊ณ  ํ•œ๋‹ค.

๋ฒ„ํผ์˜ ์—ญํ• 

๋ฐ์ดํ„ฐ๋ฅผ ์ผ์‹œ์ ์œผ๋กœ ์ €์žฅํ•˜๊ณ , ํ•œ๊บผ๋ฒˆ์— ์ฒ˜๋ฆฌํ•ด CPU์™€ ์ž…์ถœ๋ ฅ ๊ธฐ๊ธฐ ๊ฐ„์˜ ์†๋„ ์ฐจ์ด๋ฅผ ์™„ํ™”ํ•œ๋‹ค.

 

1. ์“ฐ๊ธฐ ์ž‘์—…

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

2. ์ฝ๊ธฐ ์ž‘์—…

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

2. ์‹œ์Šคํ…œ ํ˜ธ์ถœ ์ตœ์†Œํ™”

๋ฒ„ํผ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์‹œ์Šคํ…œ ํ˜ธ์ถœ์˜ ํšŸ์ˆ˜๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค. ์ž…์ถœ๋ ฅ ์ž‘์—…์€ ์‹œ์Šคํ…œ ํ˜ธ์ถœ์ด ๋งŽ์ด ๋ฐœ์ƒํ•˜๋Š” ์ž‘์—… ์ค‘ ํ•˜๋‚˜์ธ๋ฐ, ์‹œ์Šคํ…œ ํ˜ธ์ถœ์ด ๋นˆ๋ฒˆํ•˜๋ฉด CPU ์„ฑ๋Šฅ์— ๋ถ€๋‹ด์„ ์ค„ ์ˆ˜ ์žˆ๋‹ค. ๋ฒ„ํผ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์—ฌ๋Ÿฌ ๋ฐ์ดํ„ฐ๋ฅผ ๋ชจ์•„์„œ ํ•œ ๋ฒˆ์— ์ฒ˜๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‹œ์Šคํ…œ ํ˜ธ์ถœ์„ ์ค„์—ฌ ์„ฑ๋Šฅ์„ ๊ฐœ์„ ํ•œ๋‹ค.

 

๐Ÿค” ์™œ ์ž…์ถœ๋ ฅ ์ž‘์—…์ด ๋นˆ๋ฒˆํ•˜๋ฉด CPU ์„ฑ๋Šฅ์— ๋ถ€๋‹ด์ด ๋ ๊นŒ

์‹œ์Šคํ…œ ํ˜ธ์ถœ์ด๋ž€

์‚ฌ์šฉ์ž ํ”„๋กœ๊ทธ๋žจ์ด ์šด์˜ ์ฒด์ œ์˜ ์ปค๋„(kernel)์— ์ง์ ‘์ ์ธ ์ ‘๊ทผ์„ ์š”์ฒญํ•˜๋Š” ๋ฐฉ๋ฒ•. ํ”„๋กœ๊ทธ๋žจ์ด ์ผ๋ฐ˜์ ์ธ ์—ฐ์‚ฐ์ด๋‚˜ ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ์„ ํ•  ๋•Œ๋Š” ์‚ฌ์šฉ์ž ๊ณต๊ฐ„(user space)์—์„œ ์‹คํ–‰๋˜์ง€๋งŒ, ํŒŒ์ผ์„ ์—ด๊ฑฐ๋‚˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ณ  ์“ฐ๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ์ž‘์—…์€ ์šด์˜ ์ฒด์ œ์˜ ์ปค๋„ ์˜์—ญ( kernel space)์—์„œ ๊ด€๋ฆฌํ•ด์•ผ ํ•œ๋‹ค. ์ด๋•Œ, ํ”„๋กœ๊ทธ๋žจ์€ ์šด์˜ ์ฒด์ œ์— ์‹œ์Šคํ…œ ํ˜ธ์ถœ์„ ํ†ตํ•ด ์ด๋Ÿฌํ•œ ์ž‘์—…์„ ์š”์ฒญํ•˜๊ฒŒ ๋œ๋‹ค.

 

์ž…์ถœ๋ ฅ ์ž‘์—…๊ณผ ์‹œ์Šคํ…œ ํ˜ธ์ถœ

์ž…์ถœ๋ ฅ ์ž‘์—…(I/O)์€ ์ฃผ๋กœ ํŒŒ์ผ ์‹œ์Šคํ…œ์— ์ ‘๊ทผํ•˜๊ฑฐ๋‚˜ ๋„คํŠธ์›Œํฌ ์žฅ์น˜์™€ ํ†ต์‹ ํ•˜๋Š” ์ž‘์—…์ด๋‹ค. ์ด๋Ÿฐ ์ž‘์—…๋“ค์€ ์‚ฌ์šฉ์ž ํ”„๋กœ๊ทธ๋žจ์ด ์ง์ ‘ ํ•˜๋“œ์›จ์–ด์— ์ ‘๊ทผํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ, ์šด์˜ ์ฒด์ œ์˜ ๋„์›€์ด ํ•„์š”ํ•˜๋‹ค. ๋”ฐ๋ผ์„œ ์‹œ์Šคํ…œ ํ˜ธ์ถœ์„ ํ†ตํ•ด ์šด์˜ ์ฒด์ œ์—๊ฒŒ ์š”์ฒญํ•œ๋‹ค.

 

์‹œ์Šคํ…œ ํ˜ธ์ถœ์ด ๋นˆ๋ฒˆํ•˜๋ฉด CPU์— ๋ถ€๋‹ด์ด ๋˜๋Š” ์ด์œ 

1. ์‚ฌ์šฉ์ž ๋ชจ๋“œ์™€ ์ปค๋„ ๋ชจ๋“œ ๊ฐ„์˜ ์ „ํ™˜ ๋น„์šฉ

  • ์‹œ์Šคํ…œ ํ˜ธ์ถœ์ด ๋ฐœ์ƒํ•˜๋ฉด ์‚ฌ์šฉ์ž ๋ชจ๋“œ(user mode)์—์„œ ์ปค๋„ ๋ชจ๋“œ(kernel mode)๋กœ ์ „ํ™˜์ด ์ด๋ค„์ง„๋‹ค. ์‚ฌ์šฉ์ž ๋ชจ๋“œ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰๋˜๋Š” ์˜์—ญ์ด๊ณ , ์ปค๋„ ๋ชจ๋“œ๋Š” ์šด์˜ ์ฒด์ œ๊ฐ€ ์‹คํ–‰๋˜๋Š” ์˜์—ญ์ด๋‹ค.
  • ์‚ฌ์šฉ์ž ๋ชจ๋“œ์—์„œ ์ปค๋„ ๋ชจ๋“œ๋กœ์˜ ์ „ํ™˜์€ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ์ž‘์—…์ด๋‹ค. ์ด๋Š” CPU๊ฐ€ ์ž‘์—…ใ…‡๋ฅด ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์ปจํ…์ŠคํŠธ ์ „ํ™˜์„ ํ•˜๋ฉฐ, ๊ฐ์ข… ๋ณด์•ˆ ๊ฒ€์‚ฌ์™€ ํ”„๋กœ์„ธ์Šค ์ƒํƒœ ์ €์žฅ ๋ฐ ๋ณต์›์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
  • ์ž…์ถœ๋ ฅ ์ž‘์—…์ด ๋งŽ์•„์งˆ์ˆ˜๋ก ์ด ๋ชจ๋“œ ์ „ํ™˜์ด ์ž์ฃผ ๋ฐœ์ƒํ•˜์—ฌ, CPU๋Š” ์›๋ž˜์˜ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋Œ€์‹  ๋ชจ๋“œ ์ „ํ™˜๊ณผ ๊ด€๋ จ๋œ ์ž‘์—…์— ๋” ๋งŽ์€ ์‹œ๊ฐ„์„ ์†Œ๋น„ํ•˜๊ฒŒ ๋œ๋‹ค.

2. ๋ธ”๋กœํ‚น I/O์˜ ๋Œ€๊ธฐ ์‹œ๊ฐ„

  • ๋งŽ์€ ์ž…์ถœ๋ ฅ ์ž‘์—…์€ ๋ธ”๋กœํ‚น I/O๋กœ ์ฒ˜๋ฆฌ๋œ๋‹ค. ์ด๋Š” ์š”์ฒญ๋œ ์ž…์ถœ๋ ฅ ์ž‘์—…์ด ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋Œ€๊ธฐ ์ƒํƒœ๋กœ ์ „ํ™˜๋œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

3. CPU ์บ์‹œ ํšจ์œจ ๊ฐ์†Œ

  • CPU ์บ์‹œ๋Š” ์ž์ฃผ ์ ‘๊ทผํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๊ณ ์†์œผ๋กœ ์ €์žฅํ•ด ๋‘๋Š” ๊ณต๊ฐ„์ด๋‹ค. ์‹œ์Šคํ…œ ํ˜ธ์ถœ๋กœ ์ธํ•ด ์‚ฌ์šฉ์ž ๋ชจ๋“œ์™€ ์ปค๋„ ๋ชจ๋“œ ๊ฐ„์˜ ์ „ํ™˜์ด ์ž์ฃผ ๋ฐœ์ƒํ•˜๋ฉด, CPU ์บ์‹œ์— ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฌดํšจํ™”๋˜์–ด ์บ์‹œ ๋ฏธ์Šค(cache miss)๊ฐ€ ์ฆ๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Š” CPU๊ฐ€ ์ž์ฃผ ์‚ฌ์šฉํ•˜๋˜ ๋ฐ์ดํ„ฐ๋ฅผ ์บ์‹œ์—์„œ ์ฐพ์ง€ ๋ชปํ•˜๊ณ  ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์ƒˆ๋กœ ๊ฐ€์ ธ์™€์•ผ ํ•˜๋ฏ€๋กœ ์„ฑ๋Šฅ ์ €ํ•˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

๋ฒ„ํผ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด

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

3. ๋ฐ์ดํ„ฐ ์ „์†ก ํšจ์œจ์„ฑ

๋ฒ„ํผ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ž„์‹œ๋กœ ์ €์žฅํ•ด ์ž…์ถœ๋ ฅ ์žฅ์น˜์™€์˜ ๋น„๋™๊ธฐ์ ์ธ ๋ฐ์ดํ„ฐ ์ „์†ก์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•œ๋‹ค. ์—๋ฅผ ๋“ค์–ด, ๋ฐ์ดํ„ฐ๊ฐ€ ๋น ๋ฅด๊ฒŒ ์ƒ์„ฑ๋˜๋”๋ผ๋„ ๋ฒ„ํผ๊ฐ€ ๋จผ์ € ์ €์žฅํ•˜๊ณ , ์ดํ›„ ์ถœ๋ ฅ ์ŠคํŠธ๋ฆผ์„ ํ†ตํ•ด ์ฐจ๋ก€๋Œ€๋กœ ๋ชฉ์ ์ง€์— ์ „์†กํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋ฐ์ดํ„ฐ ์ƒ์„ฑ ์†๋„์™€ ๋ฐ์ดํ„ฐ ์ „์†ก ์†๋„์˜ ์ฐจ์ด๋ฅผ ์™„ํ˜ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๋ฒ„ํผ์˜ ์ข…๋ฅ˜

1. ๋‹ค์ด๋ ‰ํŠธ ๋ฒ„ํผ Direct Buffer

์šด์˜์ฒด์ œ๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ์ด์šฉํ•œ๋‹ค.

I/O ์ž‘์—…์—์„œ ๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ์™€ ์ƒํ˜ธ์ž‘์šฉํ•  ๋•Œ ์„ฑ๋Šฅ ์ด์ ์ด ์žˆ๋‹ค. JVM์ด ๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ์— ์ ‘๊ทผํ•  ๋•Œ ์ค‘๊ฐ„ ๋ณต์‚ฌ ๊ณผ์ •์„ ์ƒ๋žตํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์šด์˜์ฒด์ œ์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹น๋ฐ›๊ธฐ ์œ„ํ•ด ์šด์˜์ฒด์ œ๋ฅผ ํ˜ธ์ถœํ•˜๋ฏ€๋กœ ์ƒ๋Œ€์ ์œผ๋กœ ๋ฒ„ํผ ์ƒ์„ฑ์ด ๋Š๋ฆฌ๋‹ค. ๊ทธ๋ž˜์„œ ์ž์ฃผ ์ƒ์„ฑํ•˜๊ธฐ ๋ณด๋‹ค ํ•œ ๋ฒˆ ์ƒ์„ฑํ•ด์„œ ์žฌ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ ํ•ฉํ•˜๋‹ค. 

์šด์˜์ฒด์ œ๊ฐ€ ํ—ˆ์šฉํ•˜๋Š” ๋ฒ”์œ„ ๋‚ด์—์„œ ๋Œ€์šฉ๋Ÿ‰ ๋ฒ„ํผ๋ฅผ ์ƒ์„ฑ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ์— ์˜ํ•ด ๊ด€๋ฆฌ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ˆ˜๋™์œผ๋กœ ํ•ด์ œ๋˜์ง€ ์•Š๋Š”๋‹ค. ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ๋ฅผ ์ž˜๋ชปํ•˜๋ฉด ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

๋„คํŠธ์›Œํฌ ํ†ต์‹  ๋˜๋Š” ํŒŒ์ผ I/O์—์„œ ๋Œ€๊ทœ๋ชจ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ฑฐ๋‚˜ ์„ฑ๋Šฅ์ด ์ค‘์š”ํ•œ ๊ฒฝ์šฐ์— ์ ํ•ฉํ•˜๋‹ค.

 

2. ๋…ผ๋‹ค์ด๋ ‰ํŠธ ๋ฒ„ํผ Non-Direct Buffer

JVM์˜ ํž™ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ์ด์šฉํ•œ๋‹ค. ์ž‘์€ ๋ฐ์ดํ„ฐ๋‚˜ ๋นˆ๋ฒˆํ•œ ํ• ๋‹น/ํ•ด์ œ๊ฐ€ ํ•„์š”ํ•œ ์ž‘์—…์—์„œ ํšจ์œจ์ ์ด๋‹ค.

๋„ค์ดํ‹ฐ๋ธŒ I/O ์ž‘์—…์—์„œ ํž™ ๋ฉ”๋ชจ๋ฆฌ์™€ ๋„ค์ดํ‹ฐ๋ธŒ ๋ฉ”๋ชจ๋ฆฌ ๊ฐ„์˜ ๋ฐ์ดํ„ฐ ๋ณต์‚ฌ๊ฐ€ ํ•„์š”ํ•˜๋ฉด ์„ฑ๋Šฅ์ด ๋–จ์–ด์งˆ ์ˆ˜ ์žˆ๋‹ค.

๋‹ค์ด๋ ‰ํŠธ ๋ฒ„ํผ์— ๋น„ํ•˜๋ฉด ๋ฒ„ํผ ์ƒ์„ฑ ์‹œ๊ฐ„์ด ๋น ๋ฅด๋‹ค.

JVM์˜ ์ œํ•œ๋œ  ํž™ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด ๋ฒ„ํผ ํฌ๊ธฐ๋ฅผ ํฌ๊ฒŒ ์žก์„ ์ˆ˜ ์—†๋‹ค.

๊ฐ€๋ฐ”์ง€ ์ปฌ๋ ‰ํ„ฐ์— ์˜ํ•ด ์ž๋™์œผ๋กœ ๊ด€๋ฆฌ๋œ๋‹ค.

 

๋ฒ„ํผ๋ง์ด๋ž€ Buffering

๋ฒ„ํผ๋ง์€ ์ž…์ถœ๋ ฅ ๋ฐ์ดํ„ฐ๋ฅผ ์ž„์‹œ๋กœ ๋ชจ์•„๋‘๋Š” ๊ณผ์ •์„ ์˜๋ฏธํ•œ๋‹ค. ๋ฐ์ดํ„ฐ๋ฅผ ํ•œ ๋ฒˆ์— ์ „์†กํ•˜๊ฑฐ๋‚˜ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ๋ชจ์•„์„œ ์ฒ˜๋ฆฌํ•จ์œผ๋กœ์จ ์„ฑ๋Šฅ๊ณผ ํšจ์œจ์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚จ๋‹ค.

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

 

๋ฒ„ํผ ๊ด€๋ จ ํด๋ž˜์Šค

BufferedInputStream / BufferedOuputStream

๋ฐ”์ดํŠธ ์ŠคํŠธ๋ฆผ์„ ์œ„ํ•œ ๋ฒ„ํผ๋ง ํด๋ž˜์Šค. InputStream์ด๋‚˜ OutputStream ๊ฐ์ฒด์— ๋ฒ„ํผ๋ง ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•ด ๋” ํฐ ๋ฐ์ดํ„ฐ ๋ฉ์–ด๋ฆฌ๋ฅผ ํ•œ ๋ฒˆ์— ์ฝ๊ณ  ์“ด๋‹ค.

BufferedReader / BufferdWriter

๋ฌธ์ž ์ŠคํŠธ๋ฆผ์„ ์œ„ํ•œ ๋ฒ„ํผ๋ง ํด๋ž˜์Šค์ด๋‹ค. ํŒŒ์ผ์„ ์ค„ ๋‹จ์œ„๋กœ ์ฝ๊ฑฐ๋‚˜ ์“ธ ๋•Œ ์œ ์šฉํ•˜๋ฉฐ, readLine() ๊ฐ™์€ ๋ฉ”์†Œ๋“œ๋ฅผ ํ†ตํ•ด ํ…์ŠคํŠธ ํŒŒ์ผ์„ ๋” ํšจ์œจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

ByteButter(in java.nio.package)

java.nio(New I/O) ํŒจํ‚ค์ง€์˜ ๋ฒ„ํผ ํด๋ž˜์Šค์ด๋‹ค. ButeBuffer๋Š” ๋ฒ„ํผ์— ์ง์ ‘ ์ ‘๊ทผํ•ด ๋ฐ์ดํ„ฐ์„ ์ฝ๊ณ  ์“ธ ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค. nio ๋ฒ„ํผ๋Š” ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ฑ„๋„์„ ํ†ตํ•ด ๋Œ€๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•  ๋•Œ ์ฃผ๋กœ ์‚ฌ์šฉ๋œ๋‹ค.

 

๋ฒ„ํผ ์‚ฌ์ด์ฆˆ ์„ค์ •

๋ฒ„ํผ ์‚ฌ์ด์ฆˆ๋Š” ์ž…์ถœ๋ ฅ ์ž‘์—…์˜ ์„ฑ๋Šฅ์— ์ค‘์š”ํ•œ ์˜ํ–ฅ์„ ๋ฏธ์นœ๋‹ค. ๋„ˆ๋ฌด ์ž‘์€ ๋ฒ„ํผ๋Š” ์ž์ฃผ I/O ์ž‘์—…์„ ๋ฐœ์ƒ์‹œ์ผœ ์„ฑ๋Šฅ์ด ๋–จ์–ด์ง€๊ณ , ๋„ˆ๋ฌด ํฐ ๋ฒ„ํผ๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋‚ญ๋น„๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ๋Š” ์ ์ ˆํ•œ ํฌ๊ธฐ์˜ ๋ฒ„ํผ๋ฅผ ์„ค์ •ํ•ด ์ž…์ถœ๋ ฅ ์ž‘์—…์˜ ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•ด์•ผ ํ•œ๋‹ค.

์ž๋ฐ”์˜ BufferedInputStream๊ณผ BufferedOutputStream ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž๋ฅผ ๋ณด๋ฉด ๊ธฐ๋ณธ์ ์œผ๋กœ 8KB ํฌ๊ธฐ์˜ ๋ฒ„ํผ๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๋ฐ, ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์‚ฌ์šฉ์ž ์ •์˜ ํฌ๊ธฐ๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๋ฒ„ํผ์™€ ํ”Œ๋Ÿฌ์‹œ Flush

flush() ๋ฉ”์†Œ๋“œ๋Š” ๋ฒ„ํผ์— ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ชฉ์ ์ง€๋กœ ๋‚ด๋ณด๋‚ด๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

์ถœ๋ ฅ ์ŠคํŠธ๋ฆผ์— ๋ฐ์ดํ„ฐ๋ฅผ ์“ธ ๋•Œ ๋ฒ„ํผ์— ๋จผ์ € ์ €์žฅ๋˜๋Š”๋ฐ, ์•„์ง ๋ฒ„ํผ๊ฐ€ ๊ฐ€๋“ ์ฐจ์ง€ ์•Š์€ ๊ฒฝ์šฐ์—๋Š” ์‹ค์ œ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ถœ๋ ฅํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ด๋•Œ flush() ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ๋ฒ„ํผ์— ๋‚จ์•„ ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ•์ œ๋กœ ์ถœ๋ ฅํ•œ๋‹ค.

BufferedWriter๋‚˜ BufferedOutputStream ๊ฐ™์€ ํด๋ž˜์Šค์—์„œ ์ž์ฃผ ์‚ฌ์šฉ๋œ๋‹ค.

 

์ž๋™ ํ”Œ๋Ÿฌ์Šค AutoFlush

PrintWriter์™€ ๊ฐ™์€ ํด๋ž˜์Šค์—๋Š” ์ž๋™ ํ”Œ๋Ÿฌ์‹œ ๊ธฐ๋Šฅ์ด ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, println() ๋ฉ”์†Œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ๋งˆ๋‹ค ์ž๋™์œผ๋กœ ํ”Œ๋Ÿฌ์‹œํ•˜๋Š” ๊ธฐ๋Šฅ์ด ์žˆ์–ด ์‚ฌ์šฉ์ž ์ž…๋ ฅ์ด๋‚˜ ์ค‘์š”ํ•œ ๋ฉ”์‹œ์ง€๋ฅผ ์ฆ‰์‹œ ์ถœ๋ ฅํ•ด์•ผ ํ•  ๋•Œ ์œ ์šฉํ•˜๋‹ค.

 

NIO์™€ ์ „ํ†ต์ ์ธ I/O์—์„œ์˜ ๋ฒ„ํผ

NIO(New I/O) ํŒจํ‚ค์ง€์—์„œ๋Š” ๋ฒ„ํผ๊ฐ€ ์ž…์ถœ๋ ฅ ์ž‘์—…์˜ ์ค‘์š”ํ•œ ๋ถ€๋ถ„์ด๋‹ค. java.nio.Buffer ํด๋ž˜์Šค๋ฅผ ํ†ตํ•ด ๋ฒ„ํผ๋ฅผ ์ง์ ‘ ๊ด€๋ฆฌํ•˜๊ณ , ๋น„๋™๊ธฐ ์ž…์ถœ๋ ฅ์„ ํšจ์œจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•œ๋‹ค.

์ „ํ†ต์ ์ธ I/O(java.io)์—์„œ๋Š” ๋ฒ„ํผ๊ฐ€ ๋‚ด๋ถ€์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ชจ์•„๋‘์ง€๋งŒ, NIO ๋ฒ„ํผ์—์„œ๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ๋ฒ„ํผ๋ฅผ ๋‹ค๋ฃจ๋ฉฐ ๋” ์ •๋ฐ€ํ•œ ๋ฐ์ดํ„ฐ ์ „์†ก๊ณผ ๊ด€๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

 

๋ฒ„ํผ์™€ Close()

๋ฒ„ํผ์™€ ๊ด€๋ จ๋œ ์ŠคํŠธ๋ฆผ์„ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ๋ฐ˜๋“œ์‹œ close() ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ด ๋ฆฌ์†Œ์Šค๋ฅผ ํ•ด์ œํ•ด์•ผ ํ•œ๋‹ค. ์ŠคํŠธ๋ฆผ์„ ๋‹ซ์ง€ ์•Š์œผ๋ฉด ํŒŒ์ผ์ด๋‚˜ ๋„คํŠธ์›Œํฌ ์ž์›์ด ๊ณ„์† ์ ์œ ๋˜์–ด ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ๋‹ค. Java 7๋ถ€ํ„ฐ๋Š” try-with-resource ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•ด ์žฌ๋™์œผ๋กœ ๋ฆฌ์†Œ์Šค๋ฅผ ํ•ด์ œํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์˜ˆ์ œ

try (BufferedReader br = new BufferedReader(new FileReader("example.txt"))) {
    String line;
    while ((line = br.readLine()) != null) {
        System.out.println(line);
    }
} catch (IOException e) {
    e.printStackTrace();
}