๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
BackEnd๐ŸŒฑ/Java

[Java] ArrayList vs LinkedList

by dkswnkk 2022. 4. 6.

์„œ๋ก 

List๋Š” ๋ชจ๋“  ์–ธ์–ด์—์„œ ๊ฐ€์žฅ ์œ ์šฉํ•œ ์ž๋ฃŒ๊ตฌ์กฐ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. Java์—์„œ๋Š” List๋ฅผ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์ œ๊ณตํ•˜๋ฉฐ, LinkedList์™€ ArrayList๋ฅผ ๊ตฌํ˜„ํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ArrayList์™€ LinkedList์˜ ๊ณตํ†ต๋œ ๋ถ€๋ถ„์„ ๋ฝ‘์•„์„œ Colletion ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ถ”๊ฐ€๋กœ ์ •์˜ํ•˜์˜€๋Š”๋ฐ, ์ธํ„ฐํŽ˜์ด์Šค๋งŒ ๊ฐ™์„ ๋ฟ ๋‚ด๋ถ€์ ์œผ๋กœ ๋™์ž‘ํ•˜๋Š” ๋ฐฉ์‹์€ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ์ด๋ฒˆ ๊ฒŒ์‹œ๊ธ€์—์„œ๋Š” ArrayList์™€ LinkedList์˜ ์ฐจ์ด๋ฅผ ์•Œ์•„๋ณด๊ณ  ์–ด๋– ํ•œ ์ƒํ™ฉ์—์„œ ์‚ฌ์šฉํ•ด์•ผ ํ• ์ง€ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 

ArrayList

ArrayList๋Š” List ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ์ดํ„ฐ์˜ ์ €์žฅ์ˆœ์„œ๊ฐ€ ์œ ์ง€๋˜๊ณ  ์ค‘๋ณต์„ ํ—ˆ์šฉํ•œ๋‹ค๋Š” ํŠน์ง•์„ ๊ฐ–๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

ArrayList๋Š” ๊ธฐ์กด์˜ Java Vector๋ฅผ ๊ฐœ์„ ํ•œ ๊ฒƒ์œผ๋กœ Vector์™€ ๊ตฌํ˜„ ์ธก๋ฉด์—์„œ ๋™์ผํ•˜๋‹ค๊ณ  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ํ˜„์žฌ๋กœ ์™€์„œ Vector๋Š” ๊ธฐ์กด์— ์ž‘์„ฑ๋œ ์†Œ์Šค์™€์˜ ํ˜ธํ™˜์„ฑ์„ ์œ„ํ•ด์„œ ๊ณ„์† ๋‚จ๊ฒจ ๋‘๊ณ  ์žˆ์„ ๋ฟ์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€๋Šฅํ•˜๋ฉด Vector๋ณด๋‹ค๋Š” ArrayList๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

ArrayList๋Š” Object ๋ฐฐ์—ด์„ ์ด์šฉํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆœ์ฐจ์ ์œผ๋กœ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ ๋ฐฐ์—ด์˜ ๊ณต๊ฐ„์ด ๊ฝ‰ ์ฐจ ๋” ์ด์ƒ ์ €์žฅํ•  ๊ณต๊ฐ„์ด ์—†์œผ๋ฉด ๊ธฐ์กด์˜ ๋ฐฐ์—ด๋ณด๋‹ค ์ž๋™์ ์œผ๋กœ 2๋ฐฐ ๋” ํฐ ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์„ ์ƒ์„ฑํ•ด์„œ ๊ธฐ์กด์˜ ๋ฐฐ์—ด์— ์ €์žฅ๋œ ๋‚ด์šฉ์„ ์ƒˆ๋กœ์šด ๋ฐฐ์—ด๋กœ ๋ณต์‚ฌํ•œ ๋‹ค์Œ์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

๋ฐฐ์—ด์ด ๊ณต๊ฐ„์ด ๊ฝ‰ ์ฐผ์„ ๊ฒฝ์šฐ

 ArrayList๋Š” ์‚ญ์ œ์—์„œ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋ณต์‚ฌ ์ž‘์—…์ด ์ผ์–ด๋‚ฉ๋‹ˆ๋‹ค.

๋ฐฐ์—ด์˜ ์›์†Œ ์‚ญ์ œ

ํ˜„์žฌ ๋ฐฐ์—ด์—์„œ  0~4์˜ ๊ฐ’์ด ์ €์žฅ๋˜์–ด ์žˆ๋Š” ์ƒํƒœ์—์„œ ์„ธ๋ฒˆ ์งธ ๋ฐ์ดํ„ฐ(2)๋ฅผ ์‚ญ์ œํ•˜์˜€๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋ฉด ๋ณต์‚ฌ ์ž‘์—…์„ ํ†ตํ•ด ๋ชจ๋‘ ํ•œ ์นธ์”ฉ ์œ„๋กœ ๋ณต์‚ฌ์™€ ๋ฎ์–ด ์”Œ์šฐ๊ธฐ ์ž‘์—…์ด ์ผ์–ด๋‚˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ ๋ฐฐ์—ด์— ๊ฐ์ฒด๋ฅผ ์ค‘๊ฐ„์— ์‚ฝ์ž…ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ ์ˆœ์ฐจ์ ์œผ๋กœ ์ €์žฅํ•  ๋•Œ์™€ ๊ฐ์ฒด๋ฅผ ๋งˆ์ง€๋ง‰์— ์ €์žฅ๋œ ๊ฒƒ๋ถ€ํ„ฐ ์‚ญ์ œํ•˜์ง€ ์•Š๋Š” ์ด์ƒ์€ ๋ณต์‚ฌ ์ž‘์—…์ด ์ผ์–ด๋‚˜๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ฃจ๋Š” ๋ฐ์ดํ„ฐ์˜ ๊ฐœ์ˆ˜๊ฐ€ ๋งŽ์„์ˆ˜๋ก ์ž‘์—…์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ArrayList์˜ ๋‚ด์šฉ์„ ์ •๋ฆฌํ•ด ๋ณด์ž๋ฉด ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

1. ํฌ๊ธฐ๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋‹ค.
    - ํฌ๊ธฐ๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์„ ์ƒ์„ฑํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณต์‚ฌํ•ด์•ผ ํ•œ๋‹ค.
    - ์‹คํ–‰์†๋„๋ฅผ ํ–ฅ์ƒํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ถฉ๋ถ„ํžˆ ํฐ ํฌ๊ธฐ์˜ ๋ฐฐ์—ด์„ ์ƒ์„ฑํ•ด์•ผ ํ•˜๋ฏ€๋กœ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋‚ญ๋น„๋  ์ˆ˜๊ฐ€ ์žˆ๋‹ค.
2. ๋น„์ˆœ์ฐจ์ ์ธ ๋ฐ์ดํ„ฐ์˜ ์ถ”๊ฐ€ ๋˜๋Š” ์‚ญ์ œ์— ์‹œ๊ฐ„์ด ๋งŽ์ด ๊ฑธ๋ฆฐ๋‹ค.
    - ์ฐจ๋ก€๋Œ€๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ๋งˆ์ง€๋ง‰์—์„œ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ญ์ œํ•˜๋Š” ๊ฒƒ์€ ๋น ๋ฅด์ง€๋งŒ, 
       ๋ฐฐ์—ด์˜ ์ค‘๊ฐ„์— ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด ๋นˆ์ž๋ฆฌ๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ๋“ค์„ ๋ณต์‚ฌํ•ด์„œ ์ด๋™ํ•ด์•ผ ํ•œ๋‹ค.

 

LinkedList

๋ฐฐ์—ด์€ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๊ฐ€ ์—ฐ์†์ ์œผ๋กœ ์กด์žฌํ•˜์ง€๋งŒ LinkedList๋Š” ๋ถˆ์—ฐ์†์ ์œผ๋กœ ์กด์žฌํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์„œ๋กœ ์—ฐ๊ฒฐํ•œ ํ˜•ํƒœ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐฐ์—ด๊ณผ ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ

์œ„์˜ ๊ทธ๋ฆผ์—์„œ ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด LinkedList์˜ ๊ฐ ์š”์†Œ(node)๋“ค์€ ์ž์‹ ๊ณผ ์—ฐ๊ฒฐ๋œ ๋‹ค์Œ ์š”์†Œ์— ๋Œ€ํ•œ ์ฐธ์กฐ(์ฃผ์†Œ ๊ฐ’)์™€ ๋ฐ์ดํ„ฐ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. 

LinkedList์—์„œ์˜ ๋ฐ์ดํ„ฐ ์‚ญ์ œ์™€ ์ถ”๊ฐ€๋Š” ArrayList์™€ ๋‹ค๋ฅด๊ฒŒ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. ์‚ญ์ œํ•˜๊ณ ์ž ํ•˜๋Š” ์š”์†Œ์˜ ์ด์ „์š”์†Œ๊ฐ€ ์‚ญ์ œํ•˜๊ณ ์ž ํ•˜๋Š” ์š”์†Œ์˜ ๋‹ค์Œ ์š”์†Œ๋ฅผ ์ฐธ๋„ํ•˜๋„๋ก ๋ณ€๊ฒฝํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๋‹จ ํ•˜๋‚˜์˜ ์ฐธ์กฐ๋งŒ ๋ณ€๊ฒฝํ•˜๋ฉด ์‚ญ์ œ๊ฐ€ ์ด๋ฃจ์–ด์ง€๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ฐฐ์—ด์ฒ˜๋Ÿผ ๋ฐ์ดํ„ฐ๋ฅผ ์ด๋™ํ•˜๊ธฐ ์œ„ํ•ด ๋ณต์‚ฌํ•˜๋Š” ๊ณผ์ •์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ฒ˜๋ฆฌ์†๋„๊ฐ€ ๋งค์šฐ ๋น ๋ฆ…๋‹ˆ๋‹ค.

๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ์˜ ์‚ญ์ œ

์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•  ๋•Œ๋Š” ์ƒˆ๋กœ์šด ์š”์†Œ๋ฅผ ์ƒ์„ฑํ•œ ๋‹ค์Œ ์ถ”๊ฐ€ํ•˜๊ณ ์ž ํ•˜๋Š” ์œ„์น˜์˜ ์ด์ „ ์š”์†Œ์˜ ์ฐธ์กฐ๋ฅผ ์ƒˆ๋กœ์šด ์š”์†Œ์— ๋Œ€ํ•œ ์ฐธ์กฐ๋กœ ๋ณ€๊ฒฝํ•ด์ฃผ๊ณ , ์ƒˆ๋กœ์šด ์š”์†Œ๊ฐ€ ๊ทธ ๋‹ค์Œ ์š”์†Œ๋ฅผ ์ฐธ์กฐํ•˜๋„๋ก ๋ณ€๊ฒฝํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋˜๋ฏ€๋กœ ์ฒ˜๋ฆฌ์†๋„๊ฐ€ ๋งค์šฐ ๋น ๋ฆ…๋‹ˆ๋‹ค.

๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ์˜ ์‚ฝ์ž…

 

Doubly LinkedList(์ด์ค‘ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ)

LinkedList๋Š” ์ด๋™๋ฐฉํ–ฅ์ด ๋‹จ๋ฐฉํ–ฅ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค์Œ ์š”์†Œ์— ๋Œ€ํ•œ ์ ‘๊ทผ์€ ์‰ฝ์ง€๋งŒ ์ด์ „ ์š”์†Œ์— ๋Œ€ํ•œ ์ ‘๊ทผ์€ ์–ด๋ ต๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์ ์„ ๋ณด์™„ํ•˜๊ธฐ ์œ„ํ•ด ๋‚˜์˜จ ๊ฒƒ์ด Doubly LinkedList(์ด์ค‘ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ)์ž…๋‹ˆ๋‹ค. 

Doubly LinkedList(์ด์ค‘ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ)๋Š” ๋‹จ์ˆœํžˆ LinkedList์— ์ฐธ์กฐ๋ณ€์ˆ˜๋ฅผ ํ•˜๋‚˜ ๋” ์ถ”๊ฐ€ํ•˜์—ฌ ๋‹ค์Œ ์š”์†Œ์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฟ ์•„๋‹ˆ๋ผ ์ด์ „ ์š”์†Œ์— ๋Œ€ํ•œ ์ฐธ์กฐ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋„๋ก ํ–ˆ์„ ๋ฟ, ๊ทธ ์™ธ์—๋Š” LinkedList์™€ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. 

Doubly LinkedList(์ด์ค‘ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ)๋Š” LinkedList๋ณด๋‹ค ๊ฐ ์š”์†Œ์— ๋Œ€ํ•œ ์ ‘๊ทผ๊ณผ ์ด๋™์ด ์‰ฝ๊ธฐ ๋•Œ๋ฌธ์— LinkedList๋ณด๋‹ค ๋” ๋งŽ์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

Doubly LinkedList(์ด์ค‘ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ)

 

Doubly Circular LinkedList(์ด์ค‘ ์›ํ˜• ๋ฆฌ์ŠคํŠธ)

Doubly LinkedList(์ด์ค‘ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ)์˜ ์ ‘๊ทผ์„ฑ์„ ๋ณด๋‹ค ํ–ฅ์ƒ์‹œํ‚จ ๊ฒƒ์ด Doubly Circular LinkedList(์ด์ค‘ ์›ํ˜• ๋ฆฌ์ŠคํŠธ)์ธ๋ฐ ๋‹จ์ˆœํžˆ Doubly LinkedList(์ด์ค‘ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ)์˜ ์ฒซ ๋ฒˆ์งธ ์š”์†Œ์™€ ๋งˆ์ง€๋ง‰ ์š”์†Œ๋ฅผ ์„œ๋กœ ์—ฐ๊ฒฐ์‹œํ‚จ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด, ๋งˆ์ง€๋ง‰ ์š”์†Œ์˜ ๋‹ค์Œ ์š”์†Œ๊ฐ€ ์ฒซ ๋ฒˆ์งธ ์š”์†Œ๊ฐ€ ๋˜๊ณ , ์ฒซ ๋ฒˆ์งธ ์š”์†Œ์˜ ์ด์ „ ์š”์†Œ๊ฐ€ ๋งˆ์ง€๋ง‰ ์š”์†Œ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

Doubly Circular LinkedList(์ด์ค‘ ์›ํ˜• ๋ฆฌ์ŠคํŠธ)

 

์‚ฌ์‹ค Java์—์„œ LinkedList ํด๋ž˜์Šค๋Š” ์ด๋ฆ„๊ณผ ๋‹ฌ๋ฆฌ LinkedList๊ฐ€ ์•„๋‹Œ Doubly LinkedList(์ด์ค‘ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ)๋กœ ๊ตฌํ˜„๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š”  LinkedList์˜ ๋‹จ์ ์ธ ๋‚ฎ์€ ์ ‘๊ทผ์„ฑ(accessability)์„ ๋†’์ด๊ธฐ ์œ„ํ•ด์„œ์ž…๋‹ˆ๋‹ค.

 

ArrayList์™€ LinkedList์˜ ์„ฑ๋Šฅ ์ฐจ์ด

์‹ค์ œ๋กœ ์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด ArrayList์™€ LinkedList์—์„œ์˜ ์ถ”๊ฐ€์™€ ์‚ญ์ œ ์—ฐ์‚ฐ์˜ ์ฐจ์ด๋ฅผ ์•Œ์•„๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

import java.util.*;

public class Test {
    public static void main(String args[]) {
        // ์ถ”๊ฐ€ํ•  ๋ฐ์ดํ„ฐ์˜ ๊ฐœ์ˆ˜๋ฅผ ๊ณ ๋ คํ•˜์—ฌ ์ถฉ๋ถ„ํžˆ ์žก์•„์•ผํ•œ๋‹ค.
        ArrayList al = new ArrayList(2000000);
        LinkedList ll = new LinkedList();

        System.out.println("= ์ˆœ์ฐจ์ ์œผ๋กœ ์ถ”๊ฐ€ํ•˜๊ธฐ =");
        System.out.println("ArrayList :" + add1(al));
        System.out.println("LinkedList :" + add1(ll));
        System.out.println();
        System.out.println("= ์ค‘๊ฐ„์— ์ถ”๊ฐ€ํ•˜๊ธฐ =");
        System.out.println("ArrayList :" + add2(al));
        System.out.println("LinkedList :" + add2(ll));
        System.out.println();
        System.out.println("= ์ค‘๊ฐ„์—์„œ ์‚ญ์ œํ•˜๊ธฐ =");
        System.out.println("ArrayList :" + remove2(al));
        System.out.println("LinkedList :" + remove2(ll));
        System.out.println();
        System.out.println("= ์ˆœ์ฐจ์ ์œผ๋กœ ์‚ญ์ œํ•˜๊ธฐ =");
        System.out.println("ArrayList :" + remove1(al));
        System.out.println("LinkedList :" + remove1(ll));
    }

    public static long add1(List list) {
        long start = System.currentTimeMillis();
        for (int i = 0; i < 1000000; i++) list.add(i + "");
        long end = System.currentTimeMillis();
        return end - start;
    }

    public static long add2(List list) {
        long start = System.currentTimeMillis();
        for (int i = 0; i < 10000; i++) list.add(500, "X");
        long end = System.currentTimeMillis();
        return end - start;
    }

    public static long remove1(List list) {
        long start = System.currentTimeMillis();
        for (int i = list.size() - 1; i >= 0; i--) list.remove(i);
        long end = System.currentTimeMillis();
        return end - start;
    }

    public static long remove2(List list) {
        long start = System.currentTimeMillis();
        for (int i = 0; i < 10000; i++) list.remove(i);
        long end = System.currentTimeMillis();
        return end - start;
    }
}

์‹คํ–‰ํ™˜๊ฒฝ์— ๋”ฐ๋ผ ๊ฒฐ๊ณผ๋Š” ์กฐ๊ธˆ ๋‹ค๋ฅด๊ฒ ์ง€๋งŒ ์ œ๊ฐ€ ๋Œ๋ ธ์„ ๋•Œ์˜ ๊ฒฐ๊ณผ๋Š” ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์‹คํ–‰ ๊ฒฐ๊ณผ

 

๊ฒฐ๋ก 

  • ์ˆœ์ฐจ์ ์œผ๋กœ ์ถ”๊ฐ€/์‚ญ์ œํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ArrayList๊ฐ€ LinkedList๋ณด๋‹ค ๋น ๋ฅด๋‹ค.
  • ์ค‘๊ฐ„ ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€/์‚ญ์ œํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” LinkedList๊ฐ€ ArrayList๋ณด๋‹ค ๋น ๋ฅด๋‹ค.

๋Œ“๊ธ€