λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

Programming/Java

μžλ°”(Java) μ‚¬μš©μž μž…/좜λ ₯κ³Ό 버퍼(butter)

728x90
λ°˜μ‘ν˜•

ν”„λ‘œκ·Έλž¨μ„ μ‚¬μš©ν•˜λ‹€ 보면 μ‚¬μš©μž μž…λ ₯을 λ°›λŠ” κ²½μš°κ°€ λ§Žλ‹€.

 

cμ–Έμ–΄λ‚˜ java의 경우 μ‚¬μš©μž μž…λ ₯을 받을 λ•Œ, 버퍼(buffer)λΌλŠ” 녀석에 값을 μž„μ‹œλ‘œ μ €μž₯ν•΄λ‘μ—ˆλ‹€κ°€ ν•œλ²ˆμ— λ³€μˆ˜μ— μ €μž₯ν•˜λŠ”λ°  μˆ«μžμ™€ λ¬Έμžκ°€ λ‹€λ₯΄κ²Œ λ™μž‘ν•΄μ„œ μ΄μƒν•œ μ˜λ„ν•œ 바와 λ‹€λ₯΄κ²Œ λ˜κΈ°λ„ ν•œλ‹€.

 

β–Ά  버퍼(buffer)의 이해

일단, μ™œ λ²„νΌλΌλŠ” 것이 μ‘΄μž¬ν•˜λŠ”μ§€λΆ€ν„° μ•Œμ•„μ•Όν•  것 κ°™λ‹€.

 

컴퓨터에 따라 λ‹€λ₯΄κ² μ§€λ§Œ 일반적인 컴퓨터(κ°€μ •μš©)λŠ” 1μ΄ˆμ— μ•½ 8천 ~ 1μ–΅ 번 μ •λ„μ˜ 연산을 μ²˜λ¦¬ν•  수 μžˆλ‹€κ³  ν•œλ‹€.

 

λ§Œμ•½, 컴퓨터가 μ‚¬μš©μžμ—κ²Œ 정보λ₯Ό μž…λ ₯ λ°›μ•„μ•Όν•  λ•Œ, μš°λ¦¬κ°€ 정보λ₯Ό λͺ¨λ‘ μž…λ ₯ν•˜κΈ°λ₯Ό κΈ°λ‹€λ €μ•Ό ν•œλ‹€λ©΄, μš°λ¦¬κ°€ 1 / 1μ–΅ 초 μ•ˆμ— ν•˜λ‚˜μ˜ 값을 μž…λ ₯ν•˜μ§€ μ•ŠλŠ” ν•œ μ»΄ν“¨ν„°λŠ” κ·Έλ™μ•ˆ 계속 λŒ€κΈ°ν•˜κ³  μžˆμ–΄μ•Ό ν•œλ‹€. 

 

CPUμž…μž₯μ—μ„œλŠ” μ†ν„°μ§€λŠ” 일이 아닐 수 없을 것이닀. κ·Έλž˜μ„œ λ“±μž₯ν•œ 것이 "버퍼"λΌλŠ” κ°œλ…μ΄λΌκ³  ν•œλ‹€.

 

μ–΄λ–€ λ³€μˆ˜μ— μ‚¬μš©μž μž…λ ₯ 값을 μ €μž₯ν•  λ•Œ, ν•˜λ‚˜ν•˜λ‚˜ μ°¨λ‘€λ‘œ μ €μž₯ν•˜λŠ” 것이 μ•„λ‹Œ μž„μ‹œλ‘œ 버퍼에 μ €μž₯ν•΄ λ‘μ—ˆλ‹€κ°€ λͺ¨λ“  μž…λ ₯이 μ™„λ£Œλ˜λ©΄(μ‚¬μš©μžκ°€ μ—”ν„°ν‚€λ₯Ό λˆ„λ¦„) ν•œ λ²ˆμ— λ³€μˆ˜μ— μ €μž₯μ‹œν‚€λŠ” 것이닀. μž…λ ₯을 ν•˜λŠ” κ·Έ 사이사이 μ‹œκ°„μ— μ»΄ν“¨ν„°λŠ” λ‹€λ₯Έ 일을 ν•˜κ³  μžˆμ„ 수 μžˆλ‹€.

 

ν‚€λ³΄λ“œλ‘œ 'WOW'λΌλŠ” 문자λ₯Ό μ‚¬μš©μžμ—κ²Œ μž…λ ₯ λ°›λŠ”λ‹€κ³  κ°€μ •ν•˜μž.

μ‚¬μš©μžκ°€ ν‚€λ³΄λ“œλ₯Ό μž…λ ₯ν• λ•Œ λ§ˆλ‹€ λ²„νΌμ—λŠ” λ¬Έμžκ°€ ν•˜λ‚˜μ”© μŒ“μ΄κΈ° μ‹œμž‘ν•œλ‹€.

 

↓λ²„νΌμ˜ μƒνƒœ λ³€ν™”

ν‚€λ³΄λ“œ 'W' μž…λ ₯ W      
λ‹€μŒ μž…λ ₯ 값이 μžˆμ„ λ•ŒκΉŒμ§€ μ»΄ν“¨ν„°λŠ” λ‹€λ₯Έ μž‘μ—…μ„ 처리...
ν‚€λ³΄λ“œ 'O' μž…λ ₯ W O    
λ‹€μŒ μž…λ ₯ 값이 μžˆμ„ λ•ŒκΉŒμ§€ μ»΄ν“¨ν„°λŠ” λ‹€λ₯Έ μž‘μ—…μ„ 처리...
ν‚€λ³΄λ“œ 'W' μž…λ ₯ W O W  
λ‹€μŒ μž…λ ₯ 값이 μžˆμ„ λ•ŒκΉŒμ§€ μ»΄ν“¨ν„°λŠ” λ‹€λ₯Έ μž‘μ—…μ„ 처리...
ν‚€λ³΄λ“œ 'Enter' μž…λ ₯ W O W \n
μ‚¬μš©μž μž…λ ₯ μ’…λ£Œ

μ‚¬μš©μžκ°€ μ—”ν„°ν‚€λ₯Ό λˆ„λ₯΄λŠ” μˆœκ°„, μž…λ ₯이 λλ‚œ κ²ƒμœΌλ‘œ κ°„μ£Όν•˜κ³  λ²„νΌμ—λŠ” μ—”ν„°λ₯Ό ν¬ν•¨ν•΄μ„œ μ°¨λ‘€λ‘œ WOW\nκ°€ λ‚¨κ²Œ λœλ‹€.

(\nλŠ” μ»΄ν“¨ν„°μ—μ„œ ν•œ 쀄 띄기, enterλ₯Ό μ˜λ―Έν•œλ‹€.)

 

κ·Έ ν›„ μš°λ¦¬κ°€ λ³€μˆ˜λ₯Ό μ €μž₯ν•œλ‹€λ©΄, 버퍼에 λ‚¨μ•„μžˆλŠ” 값듀을 가져와 μ €μž₯ν•œλ‹€.

ex). 

>>>Scanner sc = new Scanner(System.in); 

>>>String wow = sc.nextLine();   // μ‚¬μš©μž μž…λ ₯으둜 WOW μ €μž₯

 

wowλΌλŠ” λ¬Έμžμ—΄ λ³€μˆ˜μ— 'WOW' μ €μž₯

 

β–Ά  nextInt()와 nextLine()

λ²„νΌμ˜ νŠΉμ§• λ•Œλ¬Έμ— nextInt() λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•΄μ„œ μ •μˆ˜ 값을 μž…λ ₯ν•  λ•Œ, μ£Όμ˜ν•΄μ•Ό ν•  점이 생긴닀.

 

nextInt() λ©”μ„œλ“œλŠ” 버퍼에 λ‚¨μ•„μžˆλŠ” μ—°μ†λœ 숫자만 λ¦¬ν„΄ν•œλ‹€.

 

κ°„λ‹¨ν•œ 예λ₯Ό 듀어보면

 

>>> int num = sc.nextInt();

 

κ°€ μ‹€ν–‰ λ˜μ—ˆμ„ λ•Œ, μ‚¬μš©μž μž…λ ₯을 123으둜 κ°€μ •ν•΄λ³΄μž μ΄λ•Œ, λ²„νΌμ˜ μƒνƒœλŠ” μ•„λž˜μ™€ κ°™λ‹€.

 

↓λ²„νΌμ˜ μƒνƒœ λ³€ν™”

ν‚€λ³΄λ“œ 1 μž…λ ₯ 1      
λ‹€μŒ μž…λ ₯ 값이 μžˆμ„ λ•ŒκΉŒμ§€ μ»΄ν“¨ν„°λŠ” λ‹€λ₯Έ μž‘μ—…μ„ 처리...
ν‚€λ³΄λ“œ 2 μž…λ ₯ 1 2    
λ‹€μŒ μž…λ ₯ 값이 μžˆμ„ λ•ŒκΉŒμ§€ μ»΄ν“¨ν„°λŠ” λ‹€λ₯Έ μž‘μ—…μ„ 처리...
ν‚€λ³΄λ“œ 3 μž…λ ₯ 1 2 3  
λ‹€μŒ μž…λ ₯ 값이 μžˆμ„ λ•ŒκΉŒμ§€ μ»΄ν“¨ν„°λŠ” λ‹€λ₯Έ μž‘μ—…μ„ 처리...
ν‚€λ³΄λ“œ 'Enter' μž…λ ₯ 1 2 3 \n
μ‚¬μš©μž μž…λ ₯ μ’…λ£Œ

μ‚¬μš©μž μž…λ ₯이 μ’…λ£Œλ˜λ©΄, 이제 버퍼에 값듀을 μ°¨λ‘€λ‘œ 가져와 μ„ μ–Έλœ λ³€μˆ˜ num에 μ €μž₯ν•œλ‹€.

 

μ΄λ•Œ, nextInt() λ©”μ„œλ“œ μžμ²΄λŠ” μ—°μ†λœ 번호만 μ €μž₯ν•˜κΈ° λ•Œλ¬Έμ— enter 값인 \n을 λ§Œλ‚˜λ©΄ 더 이상 λ²„νΌμ—μ„œ 값을 κ°€μ Έμ˜€μ§€ μ•ŠλŠ”λ‹€.

 

즉, 123만 λ²„νΌμ—μ„œ κ°€μ Έμ˜€κ³  \n은 남겨둔닀.

 

----μ΅œμ’… μƒνƒœ

 

num == 123

 

↓ν˜„μž¬ λ²„νΌμ˜ μƒνƒœ : \n이 λ‚¨μ•„μžˆλ‹€.

\n      

 

nextInt() λ©”μ†Œλ“œλ§Œ μ‚¬μš©ν•˜λ©΄ 큰 λ¬Έμ œκ°€ μ—†μ–΄ λ³΄μ΄μ§€λ§Œ λ¬Έμžμ—΄ μž…λ ₯을 λ°›μ•„ μ €μž₯ν•˜λŠ” nextLine()을 ν•¨κ»˜ μ‚¬μš©ν•  λ•Œ, λ¬Έμ œκ°€ 생긴닀.

 

μœ„μ—μ„œ μ •μˆ˜ 123을 받은 ν›„ λ¬Έμžμ—΄μ„ μΆ”κ°€λ‘œ μž…λ ₯ λ°›λŠ” ν•¨μˆ˜λ‘œ μˆ˜μ •ν•΄ 보면 μ•„λž˜μ™€ κ°™λ‹€.

 

>>> int num = sc.nextInt();

>>> String str = sc.nextLine();

>>> System.out.println(num);

>>> System.out.println(str);

 

μ˜ˆμƒ μ‚¬μš©μž μž…λ ₯ :

123

μ•ˆλ…• λ°˜κ°€μ›Œ

 

μ˜ˆμƒ 좜λ ₯:

123

μ•ˆλ…• λ°˜κ°€μ›Œ

 

μ‹€μ œ 좜λ ₯:

123

 

μ‹€μ œλ‘œ μ •μˆ˜ 123을 μ‚¬μš©μž μž…λ ₯을 받은 ν›„ λ¬Έμžμ—΄ 값을 μž…λ ₯받지 μ•Šκ³  ν”„λ‘œκ·Έλž¨μ΄ μ’…λ£Œλ˜μ–΄λ²„λ¦°λ‹€.

 

μ΄λŠ” nextLine() λ©”μ„œλ“œμ˜ νŠΉμ§•μΈλ° nextLine()은 값을 κ°€μ Έμ˜¬ λ•Œ \n을 λ§Œλ‚  λ•ŒκΉŒμ§€μ˜ λͺ¨λ“  값을 가져와 λ³€μˆ˜μ— μ €μž₯ν•˜κ³  \nκ°’ μ—­μ‹œ λ²„νΌμ—μ„œ λΉΌλ‚΄κΈ° λ•Œλ¬Έμ΄λ‹€.

 

예λ₯Ό λ“€μ–΄ 버퍼에 "μ•ˆλ…• λ°˜κ°€μ›Œ"λΌλŠ” 값이 λ“€μ–΄μžˆμ„ 경우

 

μ „)

μ•ˆ λ…• /s 반 κ°€ μ›Œ \n

nextLine()은 \n을 λ§Œλ‚˜κΈ° μ „κΉŒμ§€μ˜ 값을 λ³€μˆ˜μ— μ €μž₯ν•˜κ³  \n도 μ œκ±°ν•œλ‹€.

 

ν›„)

         

버퍼가 비어진닀.

 

 

λ‹€μ‹œ λŒμ•„μ™€

>>> int num = sc.nextInt();    // 123 μž…λ ₯

>>> String str = sc.nextLine();

>>> System.out.println(num);

>>> System.out.println(str);

 

nextInt()둜 μ‚¬μš©μž μž…λ ₯ 123을 num에 μ €μž₯ν•œ ν›„ λ²„νΌμ˜ μƒνƒœλŠ” μ•„λž˜μ™€ κ°™λ‹€.

 

↓ν˜„μž¬ λ²„νΌμ˜ μƒνƒœ : \n이 λ‚¨μ•„μžˆλ‹€.

\n      

λ°”λ‘œ μ΄μ–΄μ„œ nextLine()이 μ‹€ν–‰λ˜λ©΄ 버퍼에 \n이 λ‚¨μ•„μžˆκΈ°μ— \nκΉŒμ§€μ˜ 값을 λ²„νΌμ—μ„œ λΉΌλ‚΄ 였고 \nμ „κΉŒμ§€ 이 값을 str에 μ €μž₯ν•œλ‹€.

 

즉, strμ—λŠ” 아무 값도 μ €μž₯λ˜μ§€ μ•Šκ³  λ²„νΌλŠ” λΉ„μ–΄μ§€κ²Œ λœλ‹€.

 

λ²„νΌλŠ” λΉ„μ–΄μ Έ μžˆμ§€ μ•ŠλŠ”λ‹€λ©΄ μΆ”κ°€λ‘œ μ‚¬μš©μž μž…λ ₯을 받지 μ•ŠκΈ° λ•Œλ¬Έμ— μ΄λŸ¬ν•œ 일이 λ°œμƒν•œλ‹€.

 

ν•΄κ²° 방법은 μ—¬λŸ¬ 방법이 μ‘΄μž¬ν•˜λŠ”λ° str에 μ‚¬μš©μž μž…λ ₯을 λ°›κΈ° 전에 nextLine() λ©”μ„œλ“œλ₯Ό 미리 μ‚¬μš©ν•˜μ—¬ 버퍼λ₯Ό λΉ„μš°λŠ” 방식이 μžˆλ‹€.

 

ex):

>>> int num = sc.nextInt();    // 123 μž…λ ₯

>>> sc.nextLine();  // 버퍼에 λ‚¨μ•„μžˆλŠ” \n을 가져와 버퍼λ₯Ό 비움

>>> String str = sc.nextLine();   // μ›ν•˜λŠ” λ¬Έμžμ—΄ μž…λ ₯

>>> System.out.println(num);

>>> System.out.println(str);

 

Cμ–Έμ–΄μ˜ getChar()와 μœ μ‚¬ν•œ 방식이라고 ν•  수 μžˆλ‹€.

 

ν™•μ‹€νžˆ C와 javaλŠ” 쑰금 λΆˆνŽΈν•œ 뢀뢄이 μžˆκΈ°λŠ” ν•˜μ§€λ§Œ 더 원둠적인 λŠλ‚Œμ΄λΌμ„œ μž¬λ―Έμžˆλ‹€.

728x90
λ°˜μ‘ν˜•