Search
Duplicate
๐Ÿ˜€

13. I/O

ํƒœ๊ทธ
I/O
InputStream/OutputStream
Reader/Writer
NIO

I/O(์ž…์ถœ๋ ฅ)

I/O๋ž€ Input๊ณผ Output์˜ ์•ฝ์ž๋กœ ์ž…๋ ฅ๊ณผ ์ถœ๋ ฅ, ๊ฐ„๋‹จํžˆ ์ค„์—ฌ์„œ ์ž…์ถœ๋ ฅ์ด๋ผ๊ณ  ํ•œ๋‹ค. ์ž…์ถœ๋ ฅ์€ ์ปดํ“จํ„ฐ ๋‚ด๋ถ€ ๋˜๋Š” ์™ธ๋ถ€์˜ ์žฅ์น˜์™€ ํ”„๋กœ๊ทธ๋žจ๊ฐ„์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.
์˜ˆ๋ฅผ ๋“ค๋ฉด ํ‚ค๋ณด๋“œ๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ์ž…๋ ฅ๋ฐ›๋Š”๋‹ค๋“ ๊ฐ€ System.out.println()์„ ์ด์šฉํ•ด์„œ ํ™”๋ฉด์— ์ถœ๋ ฅํ•œ๋‹ค๋˜๊ฐ€ ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ์ž…์ถœ๋ ฅ์˜ ์˜ˆ์ด๋‹ค.
๊ทธ๋ ‡๋‹ค๋ฉด ๋ฐ์ดํ„ฐ๋Š” ์–ด๋–ค ๋ฐฉ๋ฒ•์œผ๋กœ ์ „๋‹ฌ๋  ์ˆ˜ ์žˆ์„๊นŒ? Stream, Channel, Buffer๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ๊ทธ๋ฆ‡๊ณผ ํ†ต๋กœ๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.

Stream

์ŠคํŠธ๋ฆผ์ด๋ž€? ๋ฐ์ดํ„ฐ๋ฅผ ์šด๋ฐ˜ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋˜๋Š” ์—ฐ๊ฒฐํ†ต๋กœ์ด๋‹ค.
Stream์ด๋ž€, ๋ฐ์ดํ„ฐ๊ฐ€ ๋“ค์–ด์˜จ ์ˆœ์„œ๋Œ€๋กœ ํ˜๋Ÿฌ๋‹ค๋‹ˆ๋Š” ๋‹จ๋ฐฉํ–ฅ์˜ ํ†ต๋กœ์ด๋‹ค. ์ž…๊ตฌ์™€ ์ถœ๊ตฌ๊ฐ€ ์กด์žฌํ•˜๋ฉฐ ์ž…๊ตฌ๋ฅผ InputStream, ์ถœ๊ตฌ๋ฅผ OutputStream์ด๋ผ ํ•œ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋Š” Stream์„ ํ†ตํ•ด byte ๋˜๋Š” byte[] ํ˜•ํƒœ๋กœ ํ˜๋Ÿฌ๋‹ค๋‹Œ๋‹ค.
๋ฌผ์ด ํ•œ์ชฝ ๋ฐฉํ–ฅ์œผ๋กœ๋งŒ ํ๋ฅด๋Š” ๊ฒƒ๊ณผ ๊ฐ™์ดย ๋‹จ๋ฐฉํ–ฅํ†ต์‹ ๋งŒย ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ•˜๋‚˜์˜ ์ŠคํŠธ๋ฆผ์œผ๋กœ ์ž…๋ ฅ๊ณผ ์ถœ๋ ฅ์„ ๋™์‹œ์— ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์—†๋‹ค. ์ž…๋ ฅ๊ณผ ์ถœ๋ ฅ์„ ๋™์‹œ์— ์ฒ˜๋ฆฌํ•˜๋ ค๋ฉด ์ž…๋ ฅ์ŠคํŠธ๋ฆผ๊ณผ ์ถœ๋ ฅ์ŠคํŠธ๋ฆผ์„ ๊ฐ๊ฐ ๋งŒ๋“ค์–ด ์ด 2๊ฐœ์˜ ์ŠคํŠธ๋ฆผ์ด ํ•„์š”ํ•˜๋‹ค.
Stream์€ ๋™๊ธฐ์ , blocking ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค. ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ฑฐ๋‚˜ ์“ฐ๊ธฐ ์œ„ํ•ด ์ŠคํŠธ๋ฆผ์— ์š”์ฒญํ•˜๋ฉด ์ŠคํŠธ๋ฆผ์€ ์ž์‹ ์˜ ์—ญํ• ์— ๋งž์ถฐ ๋‹ค์‹œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ฑฐ๋‚˜ ์“ธ ์ˆ˜ ์žˆ์„ ๋•Œ๊นŒ์ง€ ๋‹ค๋ฅธ ์ž‘์—…์„ ํ•˜์ง€ ๋ชปํ•˜๊ณ  ๋ฌดํ•œ์ • ๊ธฐ๋‹ค๋ฆฐ๋‹ค.

NIO(new IO, Buffer, Channel)

์ž๋ฐ”์˜ ๊ธฐ๋ณธ ์ž…์ถœ๋ ฅ ๋ฐฉ์‹์ด์—ˆ๋˜ Stream์€ blocking ๋ฐฉ์‹๊ณผ Non-Buffer์˜ ํŠน์ง•์œผ๋กœ ์ธํ•ด ์ž…์ถœ๋ ฅ ์†๋„๊ฐ€ ๋Š๋ฆด ์ˆ˜ ๋ฐ–์— ์—†์—ˆ๋‹ค. ์ž๋ฐ” 4๋ถ€ํ„ฐ ์ด๋Ÿฌํ•œ ๋ฌธ์ œ์ ์„ ํ•ด๊ฒฐํ•˜๊ณ ์ž NIO(new Input Output)์ด java.nio ํŒจํ‚ค์ง€์— ํฌํ•จ๋˜์–ด ๋“ฑ์žฅํ•˜์˜€๋‹ค.
๊ธฐ์กด IO API์—์„œ๋Š” byte streams, character streams๋ฅผ ์‚ฌ์šฉํ–ˆ์ง€๋งŒ, NIO์—์„œ๋Š” ์ฑ„๋„(Channel)๊ณผ ๋ฒ„ํผ(Buffer)๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

Channel

Channel์€ NIO์˜ ๊ธฐ๋ณธ ์ž…์ถœ๋ ฅ ๋ฐฉ์‹์ด๋‹ค.
Channel์ด๋ž€, ๋ฐ์ดํ„ฐ๊ฐ€ ํ˜๋Ÿฌ๋‹ค๋‹ˆ๋Š” ์–‘๋ฐฉํ–ฅ์˜ ํ†ต๋กœ์ด๋‹ค. Channel์€ Stream๊ณผ ์œ ์‚ฌํ•˜์ง€๋งŒ ๋™์ž‘ ๋ฐฉ์‹์ด ๋‹ค๋ฅด๋‹ค.
โ€ข
Channel์€ ์–‘๋ฐฉํ–ฅ์ด๊ธฐ ๋•Œ๋ฌธ์— input/output์„ ๊ตฌ๋ถ„ํ•˜์ง€ ์•Š๋Š”๋‹ค.
โ€ข
Channel์€ Stream๊ณผ ๋‹ค๋ฅด๊ฒŒ ๊ธฐ๋ณธ์ ์œผ๋กœ Buffer๋ฅผ ํ†ตํ•ด์„œ๋งŒ read์™€ wrtie๋ฅผ ํ•  ์ˆ˜ ์žˆ๋Š” buffer ๋ฐฉ์‹์ด๋‹ค.
โ€ข
blocking ๋ฐฉ์‹๊ณผ non-blocking ๋ฐฉ์‹ ๋ชจ๋‘ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค. (Non-blocking ๋ฐฉ์‹์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์–ด์„œ ๊ณผ๋„ํ•œ ์Šค๋ ˆ๋“œ ์ƒ์„ฑ์„ ํ”ผํ•˜๊ณ  ํšจ๊ณผ์ ์œผ๋กœ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅ)

Buffer

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

๊ธฐ์กด I/O์™€ NIO์˜ ์ฐจ์ด์ 

InputStream & OutputStream

InputStream์€ Stream ์ค‘ ๋ฐ์ดํ„ฐ๋ฅผ readํ•˜๋Š” ์ž…๊ตฌ์ด๊ณ , OutputStreawm์€ ๋ฐ์ดํ„ฐ๋ฅผ writeํ•˜๋Š” ์ถœ๊ตฌํžˆ์•„. ์„œ๋กœ ๋‹ค๋ฅธ ๋‘ ํด๋ผ์ด์–ธํŠธ๊ฐ€ Stream์„ ์‚ฌ์šฉํ•˜๋ฉด ์•„๋ž˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ์ง„ํ–‰๋œ๋‹ค.
InputStream๊ณผ OutputStream์€ Stream์„ ์ดํ•ดํ•˜๋Š” ๊ฐœ๋…์ ์ธ ์˜๋ฏธ์ด๊ธฐ๋„ ํ•˜์ง€๋งŒ Java์—์„œ๋Š” ๋ฐ”์ดํŠธ ์‹œํ€€์Šค๋ฅผ ์ฝ๊ฑฐ๋‚˜ ์“ฐ๊ธฐ์œ„ํ•œ ๊ธฐ๋ณธ ๊ธฐ๋Šฅ์„ ์ •์˜ํ•ด๋†“์€ ์ถ”์ƒ ํด๋ž˜์Šค์ด๊ธฐ๋„ ํ•˜๋‹ค. ์ฆ‰, Java์˜ ๋ชจ๋“  ๋ฐ”์ดํŠธ ์ŠคํŠธ๋ฆผ์€ InputStream ๋˜๋Š” OutputStream ์œ„์— ๋นŒ๋“œ๋œ๋‹ค.
Java์—์„œ ์ œ๊ณต๋˜๋Š” ์ŠคํŠธ๋ฆผ ํด๋ž˜์Šค๋“ค์€ ๋‹คํ˜•์„ฑ์„ ์ด์šฉํ•ด ์ŠคํŠธ๋ฆผ์„ ๊ณ„์ธตํ™”๊ฐ€ ๊ฐ€๋Šฅํ•˜๋ฉฐ, ๋” ํฐ ๋ฐ์ดํ„ฐ ์œ ํ˜•์ฒ˜๋ฆฌ์™€ ๊ฐ™์€ ๋” ๋†’์€ ์ˆ˜์ค€์˜ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

InputStream

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

OutputStream

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

Byte & Character ์ŠคํŠธ๋ฆผ

๋ฐ์ดํ„ฐ๋ฅผ ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ์ „๋‹ฌํ•˜๋Š๋ƒ์— ๋”ฐ๋ผ ์ŠคํŠธ๋ฆผ์€ ๋‘๊ฐ€์ง€๋กœ ๋‚˜๋‰œ๋‹ค.
๋ฐ”์ดํŠธ ๊ธฐ๋ฐ˜ ์ŠคํŠธ๋ฆผ - (InputStream, OutputStream)
binary ๋ฐ์ดํ„ฐ๋ฅผ ์ž…์ถœ๋ ฅํ•˜๋Š” ์ŠคํŠธ๋ฆผ
์ด๋ฏธ์ง€, ๋™์˜์ƒ ๋“ฑ์„ ์†ก์ˆ˜์‹  ํ•  ๋•Œ ์ฃผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค.
์œ„ ์ž…์ถœ๋ ฅ๋“ค์€ ๋ชจ๋‘ InputStream, OutputStream ํด๋ž˜์Šค์˜ ํ•˜์œ„ํด๋ž˜์Šค์ด๋ฉฐ, ๊ฐ๊ฐ ์ฝ๊ณ  ์“ฐ๋Š”๋ฐ ํ•„์š”ํ•œ ์ถ”์ƒ ๋ฉ”์†Œ๋“œ๋ฅผ ๋ชฉ์ ์— ๋งž๊ฒŒ ๊ตฌํ˜„ํ•ด๋†“์€ ๊ตฌํ˜„์ฒด ํด๋ž˜์Šค์ด๋‹ค.
๋ฌธ์ž ๊ธฐ๋ฐ˜ ์ŠคํŠธ๋ฆผ - Writer, Reader
Stream์€ ๋ฐ”์ดํŠธ ๋‹จ์œ„๋Š” ๋ฐ”์ดํŠธ ๋‹จ์œ„๋กœ ์—ฐ๊ฒฐํ•˜๊ณ  ์บ๋ฆญํ„ฐ ๋‹จ์œ„๋Š” ์บ๋ฆญํ„ฐ ๋‹จ์œ„๋กœ ์—ฐ๊ฒฐํ•˜๋Š” ๊ฒƒ์ด ์›์น™์ด๋‹ค. ๋ฐ”์ดํŠธ๊ธฐ๋ฐ˜์˜ ์ž…์ถœ๋ ฅ ์ŠคํŠธ๋ฆผ์€ ๋‹จ์ ์ด ์žˆ๋‹ค. ๋ฐ”๋กœ ์ž๋ฐ”์—์„  ํ•œ ๋ฌธ์ž๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ž๋ฃŒํ˜•์ธ char์€ 1byte๊ฐ€ ์•„๋‹Œ 2byte์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ”์ดํŠธ๊ธฐ๋ฐ˜์˜ ์ŠคํŠธ๋ฆผ์œผ๋กœ 2byte์ธ ๋ฌธ์ž๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐ ์–ด๋ ค์›€์ด ์žˆ๋‹ค.
์ด๋Ÿฌํ•œ ๋ฐ”์ดํŠธ๊ธฐ๋ฐ˜์˜ ์ž…์ถœ๋ ฅ ์ŠคํŠธ๋ฆผ์˜ ๋‹จ์ (1byte -> 2byte)์„ ๋ณด์™„ํ•˜๊ธฐ ์œ„ํ•ด ๋ฌธ์ž๊ธฐ๋ฐ˜์˜ ์ŠคํŠธ๋ฆผ์„ ์ œ๊ณตํ•œ๋‹ค. ๋ฌธ์ž๋ฐ์ดํ„ฐ๋ฅผ ์ž…์ถœ๋ ฅํ•  ๋•Œ๋Š” ๋ฐ”์ดํŠธ๊ธฐ๋ฐ˜ ์ŠคํŠธ๋ฆผ ๋Œ€์‹  ๋ฌธ์ž ๊ธฐ๋ฐ˜์ŠคํŠธ๋ฆผ์„ ํ™œ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์€ ํŽธ์ด๋‹ค.
InputStream -> Reader
OutputStream -> Writer

ํ‘œ์ค€ ์ŠคํŠธ๋ฆผ(System.in, System.out, System.err)

์ž๋ฐ”์—์„œ๋Š” ํ‘œ์ค€ ์ž…์ถœ๋ ฅ(standard I/O)์„ ์œ„ํ•ด 3๊ฐ€์ง€ ์ž…์ถœ๋ ฅ ์ŠคํŠธ๋ฆผ, System.in, System.out, System.err์„ ์ œ๊ณตํ•˜๋Š”๋ฐ, ์ด ๋“ค์€ ์ž๋ฐ” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์‹คํ–‰๊ณผ ๋™์‹œ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ์ž๋™์ ์œผ๋กœ ์ƒ์„ฑ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ณ„๋„๋กœ ์ŠคํŠธ๋ฆผ์„ ์ƒ์„ฑํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค.
โ€ข
System.in : ํ‘œ์ค€ ์ž…๋ ฅ์šฉ ์ŠคํŠธ๋ฆผ
โ€ข
System.out : ํ‘œ์ค€ ์ถœ๋ ฅ์šฉ ์ŠคํŠธ๋ฆผ
โ€ข
System.err : ํ‘œ์ค€ ์˜ค๋ฅ˜ ์ถœ๋ ฅ ์ŠคํŠธ๋ฆผ

ํŒŒ์ผ ์ฝ๊ณ  ์“ฐ๊ธฐ(FileInputStream, FileOutputStream)

FileInputStream๊ณผ FileOutputStream์€ ํŒŒ์ผ์— ์ž…์ถœ๋ ฅ์„ ํ•˜๊ธฐ ์œ„ํ•œ ์ŠคํŠธ๋ฆผ์ด๋‹ค.
// ์ฝ๊ธฐ public class FileIOStreamTest { public static void main(String[] args) throws IOException { FileInputStream fis = new FileInputStream("./src/test.txt"); int data = 0; while((data=fis.read())!=-1) { char c = (char)data; System.out.print(c); } } } // ์“ฐ๊ธฐ public class FileIOStreamTest2 { public static void main(String[] args) { int data = 0; try { // FileOutputStream ์€ ๋ฌด์กฐ๊ฑด ํ•ด๋‹น ํŒŒ์ผ์„ ์ƒ์„ฑํ•œ๋‹ค. append ๊ฐ’์„ true๋กœ ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด์–ด์„œ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. FileOutputStream fos = new FileOutputStream("./src/test2.txt", true); while((data = System.in.read()) != -1) { fos.write(data); } fos.close(); // ํŒŒ์ผ์„ ๋‹ซ๋Š”๋‹ค. } catch (FileNotFoundException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } } }
Java
๋ณต์‚ฌ

BufferedInputStream๊ณผ BufferedOutputStream

BufferedInputStream๊ณผ BufferedOutputStream์€ ์ŠคํŠธ๋ฆผ์˜ ์ž…์ถœ๋ ฅ ํšจ์œจ์„ ๋†’์ด๊ธฐ ์œ„ํ•ด ๋ฒ„ํผ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ณด์กฐ์ŠคํŠธ๋ฆผ์ด๋‹ค. ํ•œ ๋ฐ”์ดํŠธ์”ฉ ์ž…์ถœ๋ ฅ๋˜๋Š” ๊ฒƒ ๋ณด๋‹ค๋Š” ๋ฒ„ํผ(๋ฐ”์ดํŠธ๋ฐฐ์—ด)๋ฅผ ์ด์šฉํ•ด์„œ ํ•œ ๋ฒˆ์— ์—ฌ๋Ÿฌ ๋ฐ”์ดํŠธ๋ฅผ ์ž…์ถœ๋ ฅํ•˜๋Š” ๊ฒƒ์ด ๋น ๋ฅด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.