๐Ÿ—จ๏ธ Backend/Java

[Java] ์ปฌ๋ ‰์…˜ ํ”„๋ ˆ์ž„์› (6) - HashMap, Collectionsํด๋ž˜์Šค

Kyle99 2022. 12. 16. 06:04

HashMap

HashMap์€ Map์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค์ด๋‹ค.

Map์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ–ˆ๊ธฐ์— ์ˆœ์„œ๋Š” ์—†๊ณ , ์ค‘๋ณต์€ ํ‚ค๋Š” ํ—ˆ์šฉํ•˜์ง€ ์•Š์ง€๋งŒ ๊ฐ’์€ ํ—ˆ์šฉํ•œ๋‹ค. → ํ‚ค X, ๊ฐ’ O

๋ฐ์ดํ„ฐ๋ฅผ ํ‚ค์™€ ๊ฐ’์˜ ์Œ์œผ๋กœ ์ €์žฅ์„ ํ•˜๋Š” ๊ฒƒ์ด ํŠน์ง•์ด๋‹ค.

Hashtable์€ ์˜›๋‚  ๋ฒ„์ „์ด๊ณ , HashMap์€ ์‹ ๋ฒ„์ „์ด๋‹ค.

๋‘ ์ฐจ์ด์ ์€ Hashtable์€ ๋™๊ธฐํ™”๊ฐ€ ๋˜์–ด์žˆ๊ณ , HashMap์€ ๋™๊ธฐํ™”๊ฐ€ ๋˜์–ด์žˆ์ง€ ์•Š์€ ๊ฒƒ์ด ์ฐจ์ด์ด๋‹ค.

TreeMap์€ TreeSet๊ณผ ๊ฐ™์€ ํŠน์ง•์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. TreeSet์— ๋Œ€ํ•ด์„œ๋Š” ๋‹ค์Œ ๋”๋ณด๊ธฐ๋ฅผ ํ™•์ธํ•˜๋ฉด ๋œ๋‹ค.

๋”๋ณด๊ธฐ

๋งŒ์•ฝ ์ˆœ์„œ๋ฅผ ์œ ์ง€ํ•ด์•ผ ํ•˜๋Š” HashMap์„ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด LinkedHashMapํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

์ด๋ ‡๊ฒŒ Map์ธํ„ฐํŽ˜์ด์Šค ์ค‘ ๊ตฌํ˜„ํ•œ ๋Œ€ํ‘œ์ ์ธ ์ปฌ๋ ‰์…˜ ํด๋ž˜์Šค๋Š” HashMap์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.


HashMap์˜ ํ‚ค(key)์™€ ๊ฐ’(value)

HashMap์€ ํ•ด์‹ฑ(hashing) ๊ธฐ๋ฒ•์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•œ๋‹ค. ๊ทธ๋ ‡๊ธฐ์— ๋ฐ์ดํ„ฐ๊ฐ€ ๋งŽ์•„๋„ ๊ฒ€์ƒ‰์ด ๋น ๋ฅด๋‹ค.

ํด๋ž˜์Šค ์ด๋ฆ„์— Hash๊ฐ€ ๋“ค์–ด๊ฐ„ ํด๋ž˜์Šค๋Š” ๋ชจ๋‘ ํ•ด์‹ฑ(hashing) ๊ธฐ๋ฒ•์„ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•œ๋‹ค๋Š” ๋œป์ด๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ํ•ด์‹ฑ(hashing) ๊ธฐ๋ฒ•์€ ๋ฌด์—‡์ผ๊นŒ?

ํ•ด์‹ฑ์— ๋Œ€ํ•œ ์˜ˆ์‹œ๋ฅผ ๋จผ์ € ๋“ค์–ด์„œ ์„ค๋ช…์„ ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

์–ด๋–ค ๋ณ‘์›์˜ ๊ฐ„ํ˜ธ์‚ฌ๊ฐ€ ํ™˜์ž์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ๋‹ด๊ธด ์„œ๋ฅ˜๋“ค์„ ์ •๋ฆฌํ•˜๋ ค๊ณ  ํ•  ๋•Œ,

๋งŒ์•ฝ ์—ฐ๋„๋ณ„๋กœ ์„œ๋ž์— ์ •๋ฆฌ๋ฅผ ํ–ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋ฉด,

๋งŒ์•ฝ ๋‹ค๋ฅธ ๊ฐ„ํ˜ธ์‚ฌ๊ฐ€ ํ™˜์ž์ •๋ณด๋ฅผ ์ฐพ์•„๋‹ฌ๋ผ๊ณ  ์ฃผ๋ฏผ๋ฒˆํ˜ธ๋ฅผ ๋งํ•˜๋ฉด,

๊ฐ„ํ˜ธ์‚ฌ๋Š” ๊ณง๋ฐ”๋กœ 70๋…„๋Œ€ ์„œ๋ฅ˜๋ฅผ ๋ถ„๋ฆฌํ•ด๋†“์€ ์„œ๋ž์—์„œ ์„œ๋ฅ˜๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค.

ํ•ด์‹œ ํ•จ์ˆ˜(hash function)๊ฐ€ ํ•˜๋Š” ์ผ์€ ์œ„ ์ƒํ™ฉ๊ณผ ๋™์ผํ•˜๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

 ํ•ด์‹œํ•จ์ˆ˜์— ์–ด๋–ค ํ‚ค(key)๋ฅผ ๋„ฃ๊ฒŒ ๋˜๋ฉด ํ•ด๋‹น ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋˜์–ด์žˆ๋Š” index๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

ํ•ด์‹œํ•จ์ˆ˜(hash function)๋กœ ํ•ด์‹œ ํ…Œ์ด๋ธ”(hash table)์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅ, ๊ฒ€์ƒ‰ํ•˜๋Š” ๊ธฐ๋ฒ•์ด๋‹ค.

์œ„ ์˜ˆ์‹œ๋ฅผ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์‹œ๊ฐ์œผ๋กœ ๋ฐ”๋ผ๋ณด๋ฉด ์œ„ ์ด๋ฏธ์ง€์™€ ๊ฐ™๋‹ค.

์œ„ ์ด๋ฏธ์ง€์—์„œ ํ•ด์‹œ ์ฝ”๋“œ๋Š” ๋ฐฐ์—ด์˜ index์™€ ๊ฐ™์€ ์˜๋ฏธ์ด๋‹ค.

์ฆ‰, ์ฐพ๊ณ ์ž ํ•˜๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๋Š” ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋ฐฐ์—ด์˜ index๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

์—ฌ๊ธฐ์„œ ํ•ด์‹œ ํ…Œ์ด๋ธ”์€ ๋ฐฐ์—ด๊ณผ ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ๊ฐ€ ์กฐํ•ฉ๋œ ํ˜•ํƒœ์ด๋‹ค.

ํ•ด์‹œํ…Œ์ด๋ธ”

 ์œ„ ํ•ด์‹œ ํ…Œ์ด๋ธ”์˜ ์ด๋ฏธ์ง€๋ฅผ ๋ณด๋ฉด ๋ฐฐ์—ด์ด ์ œ์ผ ์ฒ˜์Œ ์žˆ๊ณ  ๊ฐ ๋ฐฐ์—ด์˜ ์ธ๋ฑ์Šค๋“ค์€ ๋‹ค๋ฅธ ๊ฐ’๋“ค๊ณผ ์—ฐ๊ฒฐ๋˜์–ด์žˆ๋‹ค.

๊ทธ๋ ‡๊ธฐ์— ๋ฐฐ์—ด๊ณผ ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ๊ฐ€ ์กฐํ•ฉ๋œ ํ˜•ํƒœ๋ผ๊ณ  ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

๋ฐฐ์—ด์˜ ์ ‘๊ทผ์„ฑ์ด ์ข‹๋‹ค๋Š” ์žฅ์ ๊ณผ, ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ์˜ ๋ณ€๊ฒฝ์— ์œ ๋ฆฌํ•˜๋‹ค๋Š” ์žฅ์ ์„ ์„ž์€ ๊ฒƒ์ด๋‹ค.

ํ•ด์‹œ ํ…Œ์ด๋ธ”์— ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๊ณผ์ •

โ“ ํ‚ค๋กœ ํ•ด์‹œํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ด์„œ ํ•ด์‹œ ์ฝ”๋“œ๋ฅผ ์–ป๋Š”๋‹ค.

โ“‘ ํ•ด์‹œ ์ฝ”๋“œ(ํ•ด์‹œํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜ ๊ฐ’)์— ๋Œ€์‘ํ•˜๋Š” ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ฐฐ์—ด์—์„œ ์ฐพ๋Š”๋‹ค.

โ“’ ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ์—์„œ ํ‚ค์™€ ์ผ์น˜ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ๋Š”๋‹ค.
 
โ€ป ํ•ด์‹œํ•จ์ˆ˜๋Š” ๊ฐ™์€ ํ‚ค์— ๋Œ€ํ•ด ํ•ญ์ƒ ๊ฐ™์€ ํ•ด์‹œ ์ฝ”๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•œ๋‹ค.
โ€ป ์„œ๋กœ ๋‹ค๋ฅธ ํ‚ค์ผ์ง€๋ผ๋„ ๊ฐ™์€ ๊ฐ’์˜ ํ•ด์‹œ์ฝ”๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

์ด๋ ‡๊ฒŒ ํ•ด์‹ฑ ๊ธฐ๋ฒ•์„ ํ†ตํ•ด ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ๋Š” ํ‚ค์™€ ๊ฐ’์œผ๋กœ ๋ถ„๋ฅ˜๊ฐ€ ๋œ๋‹ค.

 

์—ฌ๊ธฐ์„œ ํ‚ค๋Š” ์ค‘๋ณต์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๊ณ , ๊ฐ’์€ ์ค‘๋ณต์„ ํ—ˆ์šฉํ•œ๋‹ค.

์—ฌ๊ธฐ์„œ ๋งŽ์ด ํ—ท๊ฐˆ๋ฆฌ๋Š” ๋ถ€๋ถ„์ด ์žˆ๋Š”๋ฐ, ์œ„ ์ฝ”๋“œ์™€ ๊ฐ™์ด 3๊ฐœ์˜ ํ‚ค์™€ ๊ฐ’์„ HashMap์— ์ถ”๊ฐ€(put)๋ฅผ ํ•˜๋ฉด,

ํ‚ค(key) ๊ฐ’(value)
myId 1234
asdf 1234

์ด๋ ‡๊ฒŒ asdf๋Š” ๊ฐ’์ด 1111์ด ์•„๋‹Œ, 1234๋กœ ์ €์žฅ์ด ๋œ๋‹ค.

์ฆ‰, ๋˜‘๊ฐ™์€ ํ‚ค์™€ ๋‹ค๋ฅธ ๊ฐ’์œผ๋กœ ์ €์žฅ์„ ํ•˜๋ฉด ์ƒˆ๋กœ์šด ๊ฐ’์œผ๋กœ ๋ณ€๊ฒฝ์ด ๋œ๋‹ค๋Š” ๋œป์ด๋‹ค.


HashMap์˜ ์ฃผ์š” ๋ฉ”์„œ๋“œ

์ƒ์„ฑ์ž / ๋ฉ”์„œ๋“œ ์„ค๋ช…
HashMap() HashMap๊ฐ์ฒด๋ฅผ ์ƒ์„ฑ
HashMap(int initialCapacity) ์ง€์ •๋œ ๊ฐ’์„ ์ดˆ๊ธฐ์šฉ๋Ÿ‰์œผ๋กœ ํ•˜๋Š” HashMap๊ฐ์ฒด๋ฅผ ์ƒ์„ฑ
HashMap(int initialCapacity, float loadFactor) ์ง€์ •๋œ ์ดˆ๊ธฐ์šฉ๋Ÿ‰๊ณผ load factor์˜ HashMap๊ฐ์ฒด๋ฅผ ์ƒ์„ฑ
HashMap(Map m) ์ง€์ •๋œ Map์˜ ๋ชจ๋“  ์š”์†Œ๋ฅผ ํฌํ•จํ•˜๋Š” HashMap์„ ์ƒ์„ฑ
void clear() HashMap์— ์ €์žฅ๋œ ๋ชจ๋“  ๊ฐ์ฒด๋ฅผ ์ œ๊ฑฐ
Object clone() ํ˜„์žฌ HashMap์„ ๋ณต์ œํ•ด์„œ ๋ฐ˜ํ™˜
boolean containsKey(Object key) HashMap์— ์ง€์ •๋œ ํ‚ค๊ฐ€ ํฌํ•จ๋˜์–ด์žˆ๋Š”์ง€ ํ™•์ธ.
boolean containsValue(Object value) HashMap์— ์ง€์ •๋œ ๊ฐ’์ด ํฌํ•จ๋˜์–ด์žˆ๋Š”์ง€ ํ™•์ธ
Set entrySet() HashMap์— ์ €์žฅ๋œ ํ‚ค์™€ ๊ฐ’์„ ์—”ํŠธ๋ฆฌ(ํ‚ค์™€ ๊ฐ’์˜ ๊ฒฐํ•ฉ)์˜
ํ˜•ํƒœ๋กœ Set์— ์ €์žฅํ•ด์„œ ๋ฐ˜ํ™˜
Object get(Object key) ์ง€์ •๋œ ํ‚ค์˜ ๊ฐ’(๊ฐ์ฒด)์„ ๋ฐ˜ํ™˜. ๋ชป์ฐพ์œผ๋ฉด null ๋ฐ˜ํ™˜
Object getOrDefault(Object key, Object defaultValue) ์ง€์ •๋œ ํ‚ค์˜ ๊ฐ’(๊ฐ์ฒด)์„ ๋ฐ˜ํ™˜. ๋ชป์ฐพ์œผ๋ฉด ๊ธฐ๋ณธ๊ฐ’(defaultValue)
์œผ๋กœ ์ง€์ •๋œ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜
boolean isEmpty() HashMap์ด ๋น„์–ด์žˆ๋Š”์ง€ ํ™•์ธ
Set keySet() HashMap์— ์ €์žฅ๋œ ๋ชจ๋“  ํ‚ค๊ฐ€ ์ €์žฅ๋œ Set์„ ๋ฐ˜ํ™˜
Object put(Object key, Object value) ์ง€์ •๋œ ํ‚ค์™€ ๊ฐ’์„ HashMap์— ์ €์žฅ
void putAll(Map m) Map์— ์ €์žฅ๋œ ๋ชจ๋“  ์š”์†Œ๋ฅผ HashMap์— ์ €์žฅ
Object remove(Object key) HashMap์—์„œ ์ง€์ •๋œ ํ‚ค๋กœ ์ €์žฅ๋œ ๊ฐ’(๊ฐ์ฒด)์„ ์ œ๊ฑฐ
Object replace(Object key, Object value) ์ง€์ •๋œ ํ‚ค์˜ ๊ฐ’์„ ์ง€์ •๋œ ๊ฐ์ฒด(value)๋กœ ๋Œ€์ฒด
boolean replace(Object key,Object oldValue,Object newValue) ์ง€์ •๋œ ํ‚ค์™€ ๊ฐ์ฒด(oldValue)๊ฐ€ ๋ชจ๋‘ ์ผ์น˜ํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ
์ƒˆ๋กœ์šด ๊ฐ์ฒด(newValue)๋กœ ๋Œ€์ฒด
int size() HashMap์— ์ €์žฅ๋œ ์š”์†Œ์˜ ๊ฐœ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜
Collection values() HashMap์— ์ €์žฅ๋œ ๋ชจ๋“  ๊ฐ’์„ ์ปฌ๋ ‰์…˜์˜ ํ˜•ํƒœ๋กœ ๋ฐ˜ํ™˜

Collections

Collections๋Š” ์ปฌ๋ ‰์…˜์„ ์œ„ํ•œ ๋ฉ”์„œ๋“œ(static)๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

 

1. ์ปฌ๋ ‰์…˜ ์ฑ„์šฐ๊ธฐ, ๋ณต์‚ฌ, ์ •๋ ฌ, ๊ฒ€์ƒ‰ - fill(), copy(), sort(), binarySearch() ๋“ฑ

 

2. ์ปฌ๋ ‰์…˜์˜ ๋™๊ธฐํ™” - synchronizedXXX()

๋ฐฐ์—ด ๊ธฐ๋ฐ˜ ์ปฌ๋ ‰์…˜์—๋Š” Vector์™€ Arraylist๊ฐ€ ์žˆ๋‹ค.

๋‘˜์˜ ์ฐจ์ด์ ์œผ๋กœ๋Š” Vector๋Š” ๋™๊ธฐํ™”๊ฐ€ ๋˜์–ด์žˆ๊ณ , ArrayList๋Š” ๋™๊ธฐํ™”๊ฐ€ ๋˜์–ด์žˆ์ง€ ์•Š๋‹ค.

ํ•˜์ง€๋งŒ ArrayList๋กœ ๋™๊ธฐํ™”๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด synchronized๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

์ด๋ ‡๊ฒŒ ArrayList ๊ฐ™์€ ๊ฒฝ์šฐ๋Š” ์„ ํƒ์ ์œผ๋กœ ๋™๊ธฐํ™” ์—ฌ๋ถ€๋ฅผ ์ •ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, Vector๋Š” ํ•ญ์‚ฌ ๋™๊ธฐํ™”๊ฐ€ ๋˜์–ด์žˆ๋‹ค.

์‚ฌ์šฉ๋ฒ•์€ ์œ„ ์ฝ”๋“œ์™€ ๊ฐ™์ด ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

Collections.synchronizedList()์— ๋™๊ธฐํ™”๋˜์–ด์žˆ์ง€ ์•Š์€ ArrayList()๋ฅผ ๋„ฃ๊ฒŒ ๋˜๋ฉด ๋™๊ธฐํ™”๋œ syncList๊ฐ€ ์ƒ๊ธด๋‹ค.

๊ทธ๋ ‡๊ฒŒ ๋™๊ธฐํ™”๋œ syncList๋Š” Vector์™€ ๊ฐ™์€ List๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

 

3. ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€(readOnly) ์ปฌ๋ ‰์…˜ ๋งŒ๋“ค๊ธฐ - unmodifiableXXX()

unmodifiable์„ ํ†ตํ•ด์„œ ๋งŒ๋“ค์–ด์ง„ ์ปฌ๋ ‰์…˜์€ ์ˆ˜์ •์ด ๋ถˆ๊ฐ€๋Šฅํ•œ ์ฝ๊ธฐ ์ „์šฉ ์ปฌ๋ ‰์…˜์œผ๋กœ ๋งŒ๋“ค์–ด์ค€๋‹ค.

์ปฌ๋ ‰์…˜์ด ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๊ฒŒ ๋ณดํ˜ธํ•  ๋•Œ, ์ฝ๊ธฐ ์ „์šฉ์œผ๋กœ ์‚ฌ์šฉํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”์„œ๋“œ์ด๋‹ค.

 

4. ์‹ฑ๊ธ€ํ†ค ์ปฌ๋ ‰์…˜ ๋งŒ๋“ค๊ธฐ - singletonXXX()

์‹ฑ๊ธ€ํ†ค ์ปฌ๋ ‰์…˜์€ ๊ฐ์ฒด๋ฅผ ํ•œ ๊ฐœ๋งŒ ์ €์žฅํ•˜๋Š” ์ปฌ๋ ‰์…˜์„ ๋งŒ๋“ค ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค.

 

5. ํ•œ ์ข…๋ฅ˜์˜ ๊ฐ์ฒด๋งŒ ์ €์žฅํ•˜๋Š” ์ปฌ๋ ‰์…˜ ๋งŒ๋“ค๊ธฐ - checkedXXX()

checked๋Š” ํ•œ ๊ฐ€์ง€ ํƒ€์ž…์˜ ๊ฐ์ฒด๋งŒ ์ €์žฅํ•  ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค.

์œ„ ์ฝ”๋“œ์™€ ๊ฐ™์ด ArrayList๋ฅผ ๋งŒ๋“ค๊ณ  checkedList๋ฅผ ํ†ตํ•ด list์™€ ํƒ€์ž…์„ ์ •ํ•ด์ค€๋‹ค.

๊ทธ๋Ÿผ ์ •ํ•ด์ง„ ํƒ€์ž…์˜ ๊ฐ์ฒด๋Š” ์ถ”๊ฐ€๊ฐ€ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, ๊ทธ ์™ธ์˜ ํƒ€์ž…์„ ๋„ฃ์œผ๋ฉด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

์‚ฌ์‹ค checked๋Š” ์ง€๋„ค๋ฆญ์Šค๊ฐ€ ๋‚˜์˜จ ์ดํ›„๋กœ๋Š” ์ž˜ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.

๊ทธ๋ ‡๊ธฐ์— ์–ด๋–ค ์—ญํ• ์„ ํ•˜๋Š”์ง€ ์ •๋„๋งŒ ์•Œ์•„๋‘๋„๋ก ํ•˜์ž.


์ปฌ๋ ‰์…˜ ํด๋ž˜์Šค ์ •๋ฆฌ