JavaScript์ Symbol.species๋ฅผ ํ์ํ์ฌ ํ์ ๊ฐ์ฒด์ ์์ฑ์ ๋์์ ์ ์ดํ์ธ์. ๊ฒฌ๊ณ ํ ํด๋์ค ์ค๊ณ์ ๊ณ ๊ธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ฐ๋ฐ์ ํ์์ ์ ๋๋ค.
์์ฑ์ ์ปค์คํฐ๋ง์ด์ง ์ ๊ธ ํด์ : JavaScript์ Symbol.species ์ฌ์ธต ๋ถ์
๊ด๋ํ๊ณ ๋์์์ด ์งํํ๋ ํ๋ JavaScript ๊ฐ๋ฐ ํ๊ฒฝ์์ ๊ฒฌ๊ณ ํ๊ณ ์ ์ง๋ณด์ ๊ฐ๋ฅํ๋ฉฐ ์์ธก ๊ฐ๋ฅํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๋ ๊ฒ์ ๋งค์ฐ ์ค์ํ ๊ณผ์ ์ ๋๋ค. ์ด๋ฌํ ๋์ ์ ๋ณต์กํ ์์คํ ์ ์ค๊ณํ๊ฑฐ๋ ์ ์ธ๊ณ ๊ณ ๊ฐ์ ๋์์ผ๋ก ํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์์ฑํ ๋ ํนํ ๋๋๋ฌ์ง๋๋ฐ, ๋ค์ํ ํ, ๊ฐ๊ธฐ ๋ค๋ฅธ ๊ธฐ์ ์ ๋ฐฐ๊ฒฝ, ๊ทธ๋ฆฌ๊ณ ์ข ์ข ๋ถ์ฐ๋ ๊ฐ๋ฐ ํ๊ฒฝ์ด ํ๋ฐ ๋ชจ์ด๊ธฐ ๋๋ฌธ์ ๋๋ค. ๊ฐ์ฒด๊ฐ ์ด๋ป๊ฒ ๋์ํ๊ณ ์ํธ์์ฉํ๋์ง์ ๋ํ ์ ๋ฐ์ฑ์ ๋จ์ํ ๋ชจ๋ฒ ์ฌ๋ก๊ฐ ์๋๋ผ, ์์ ์ฑ๊ณผ ํ์ฅ์ฑ์ ์ํ ๊ทผ๋ณธ์ ์ธ ์๊ตฌ์ฌํญ์ ๋๋ค.
๊ฐ๋ฐ์์๊ฒ ์ด๋ฌํ ์์ค์ ์ธ๋ฐํ ์ ์ด ๊ถํ์ ๋ถ์ฌํ๋ JavaScript์ ๊ฐ๋ ฅํ๋ฉด์๋ ์์ฃผ ๊ฐ๊ณผ๋๋ ๊ธฐ๋ฅ ์ค ํ๋๊ฐ ๋ฐ๋ก Symbol.species์ ๋๋ค. ECMAScript 2015(ES6)์ ์ผ๋ถ๋ก ๋์ ๋ ์ด ์ ์๋ ค์ง ์ฌ๋ณผ์, ๋ด์ฅ ๋ฉ์๋๊ฐ ํ์ ๊ฐ์ฒด๋ก๋ถํฐ ์๋ก์ด ์ธ์คํด์ค๋ฅผ ์์ฑํ ๋ ์ฌ์ฉํ๋ ์์ฑ์ ํจ์๋ฅผ ์ปค์คํฐ๋ง์ด์งํ๋ ์ ๊ตํ ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํฉ๋๋ค. ์ด๋ ์์ ์ฒด์ธ์ ์ ๋ฐํ๊ฒ ๊ด๋ฆฌํ๊ณ , ์ฝ๋๋ฒ ์ด์ค ์ ๋ฐ์ ๊ฑธ์ณ ํ์ ์ผ๊ด์ฑ๊ณผ ์์ธก ๊ฐ๋ฅํ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์ฅํ๋ ๋ฐฉ๋ฒ์ ์ ์ํฉ๋๋ค. ๋๊ท๋ชจ์ ๋ณต์กํ ํ๋ก์ ํธ์์ ํ์ ํ๋ ๊ตญ์ ์ ์ธ ํ์๊ฒ Symbol.species์ ๋ํ ๊น์ ์ดํด์ ํ๋ช ํ ํ์ฉ์ ์ํธ ์ด์ฉ์ฑ์ ๊ทน์ ์ผ๋ก ํฅ์์ํค๊ณ , ์์์น ๋ชปํ ํ์ ๊ด๋ จ ๋ฌธ์ ๋ฅผ ์ํํ๋ฉฐ, ๋ ์ ๋ขฐํ ์ ์๋ ์ํํธ์จ์ด ์ํ๊ณ๋ฅผ ์กฐ์ฑํ ์ ์์ต๋๋ค.
์ด ์ข ํฉ ๊ฐ์ด๋๋ ์ฌ๋ฌ๋ถ์ Symbol.species์ ๊น์ ์ธ๊ณ๋ก ์ด๋ํฉ๋๋ค. ์ฐ๋ฆฌ๋ ๊ทธ๊ฒ์ ๊ทผ๋ณธ์ ์ธ ๋ชฉ์ ์ ๊ผผ๊ผผํ๊ฒ ํํค์น๊ณ , ์ค์ฉ์ ์ด๊ณ ์ค๋ช ์ ์ธ ์์ ๋ฅผ ํตํด ์ดํด๋ณด๊ณ , ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์ฑ์ ๋ฐ ํ๋ ์์ํฌ ๊ฐ๋ฐ์์๊ฒ ํ์์ ์ธ ๊ณ ๊ธ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ๊ฒํ ํ๋ฉฐ, ์ค์ํ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๊ฐ๊ดํ ๊ฒ์ ๋๋ค. ์ฐ๋ฆฌ์ ๋ชฉํ๋ ์ฌ๋ฌ๋ถ์ด ํ๋ ฅ ์๊ณ ๊ณ ์ฑ๋ฅ์ผ ๋ฟ๋ง ์๋๋ผ, ๊ฐ๋ฐ ์ถ์ฒ๋ ๋ฐฐํฌ ๋์์ ๊ด๊ณ์์ด ๋ณธ์ง์ ์ผ๋ก ์์ธก ๊ฐ๋ฅํ๊ณ ์ ์ธ๊ณ์ ์ผ๋ก ์ผ๊ด๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค ์ ์๋ ์ง์์ ๊ฐ์ถ๋๋ก ํ๋ ๊ฒ์ ๋๋ค. JavaScript์ ๊ฐ์ฒด ์งํฅ ๋ฅ๋ ฅ์ ๋ํ ์ดํด๋ฅผ ํ ๋จ๊ณ ๋์ด๊ณ ํด๋์ค ๊ณ์ธต์ ๋ํ ์ ๋ก ์๋ ์์ค์ ์ ์ด๋ ฅ์ ์ ๊ธ ํด์ ํ ์ค๋น๋ฅผ ํ์ญ์์ค.
ํ๋ JavaScript์์์ ์์ฑ์ ํจํด ์ปค์คํฐ๋ง์ด์ง์ ํ์์ฑ
ํ๋กํ ํ์ ๊ณผ ๋ ํ๋์ ์ธ ํด๋์ค ๊ตฌ๋ฌธ์ ์ํด ๋ท๋ฐ์นจ๋๋ JavaScript์ ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ์์ฑ์์ ์์์ ํฌ๊ฒ ์์กดํฉ๋๋ค. Array, RegExp ๋๋ Promise์ ๊ฐ์ ํต์ฌ ๋ด์ฅ ํด๋์ค๋ฅผ ํ์ฅํ ๋, ํ์ ํด๋์ค์ ์ธ์คํด์ค๊ฐ ๋์ฒด๋ก ๋ถ๋ชจ์ฒ๋ผ ๋์ํ๋ฉด์๋ ๊ณ ์ ํ ํฅ์๋ ๊ธฐ๋ฅ์ ๊ฐ์ง ๊ฒ์ด๋ผ๋ ์์ฐ์ค๋ฌ์ด ๊ธฐ๋๊ฐ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋ฏธ๋ฌํ์ง๋ง ์ค๋ํ ๋์ ์, ํ์ ํด๋์ค์ ์ธ์คํด์ค์์ ํน์ ๋ด์ฅ ๋ฉ์๋๋ฅผ ํธ์ถํ์ ๋, ํ์ ํด๋์ค์ ์ข (species)์ ๋ณด์กดํ๋ ๋์ ๊ธฐ๋ณธ ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ๋ฐํํ๋ ๊ธฐ๋ณธ ๋์์์ ๋ฐ์ํฉ๋๋ค. ์ด ์ฌ์ํด ๋ณด์ด๋ ๋์ ํธ์ฐจ๋ ๋ ํฌ๊ณ ๋ณต์กํ ์์คํ ๋ด์์ ์๋นํ ํ์ ๋ถ์ผ์น๋ฅผ ์ ๋ฐํ๊ณ ์ฐพ๊ธฐ ํ๋ ๋ฒ๊ทธ๋ฅผ ๋์ ํ ์ ์์ต๋๋ค.
"์ข ์์ค" ํ์: ์จ๊ฒจ์ง ์ํ
์ด "์ข ์์ค"์ ๊ตฌ์ฒด์ ์ธ ์๋ก ์ค๋ช ํด ๋ณด๊ฒ ์ต๋๋ค. ์ ์ธ๊ณ ๊ธ์ต ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ฌ์ฉ๋๋ ํน์ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์ํด, ์ฌ๋ฌ ๊ท์ ์ง์ญ์ ๊ฑธ์ณ ์ค์์ ์ค์ํ ๊ฐ๋ ฅํ ๋ก๊น ์ด๋ ํน์ ๋ฐ์ดํฐ ์ ํจ์ฑ ๊ฒ์ฌ ๊ท์น์ ์ถ๊ฐํ๋ ์ปค์คํ ๋ฐฐ์ด ์ ์ฌ ํด๋์ค๋ฅผ ๊ฐ๋ฐํ๋ค๊ณ ์์ํด ๋ณด์ญ์์ค:
class SecureTransactionList extends Array { constructor(...args) { super(...args); console.log('SecureTransactionList ์ธ์คํด์ค๊ฐ ์์ฑ๋์ด ๊ฐ์ฌ ์ค๋น๊ฐ ์๋ฃ๋์์ต๋๋ค.'); this.auditLog = []; } addTransaction(transaction) { this.push(transaction); this.auditLog.push(`๊ฑฐ๋ ์ถ๊ฐ: ${JSON.stringify(transaction)}`); console.log(this.auditLog[this.auditLog.length - 1]); } getAuditReport() { return `${this.length}๊ฐ ๊ฑฐ๋์ ๋ํ ๊ฐ์ฌ ๋ณด๊ณ ์:\n${this.auditLog.join('\n')}`; } }
์ด์ ์ธ์คํด์ค๋ฅผ ์์ฑํ๊ณ ์ด ์ปค์คํ ๋ฆฌ์คํธ์ map()๊ณผ ๊ฐ์ ์ผ๋ฐ์ ์ธ ๋ฐฐ์ด ๋ณํ์ ์ํํด ๋ด ์๋ค:
const dailyTransactions = new SecureTransactionList(); dailyTransactions.addTransaction({ id: 'TRN001', amount: 100, currency: 'USD' }); dailyTransactions.addTransaction({ id: 'TRN002', amount: 75, currency: 'EUR' }); console.log(dailyTransactions.getAuditReport()); const processedTransactions = dailyTransactions.map(t => ({ ...t, processed: true })); console.log(processedTransactions instanceof SecureTransactionList); // ์์: true, ์ค์ : false console.log(processedTransactions instanceof Array); // ์์: true, ์ค์ : true // console.log(processedTransactions.getAuditReport()); // ์ค๋ฅ: processedTransactions.getAuditReport๋ ํจ์๊ฐ ์๋๋๋ค
์คํ ์ฆ์ processedTransactions๊ฐ SecureTransactionList๊ฐ ์๋ ์ผ๋ฐ Array ์ธ์คํด์ค์์ ์ ์ ์์ต๋๋ค. map ๋ฉ์๋๋ ๊ธฐ๋ณธ ๋ด๋ถ ๋ฉ์ปค๋์ฆ์ ๋ฐ๋ผ ์๋ Array์ ์์ฑ์๋ฅผ ํธ์ถํ์ฌ ๋ฐํ ๊ฐ์ ์์ฑํ์ต๋๋ค. ์ด๋ ํ์ ํด๋์ค์ ์ปค์คํ ๊ฐ์ฌ ๊ธฐ๋ฅ๊ณผ ์์ฑ(auditLog ๋ฐ getAuditReport() ๋ฑ)์ ํจ๊ณผ์ ์ผ๋ก ์ ๊ฑฐํ์ฌ ์์์น ๋ชปํ ํ์ ๋ถ์ผ์น๋ฅผ ์ด๋ํฉ๋๋ค. ์ฑ๊ฐํฌ๋ฅด, ํ๋ํฌํธ๋ฅดํธ, ๋ด์์ ์์ง๋์ด์ ๊ฐ์ด ์๊ฐ๋๊ฐ ๋ค๋ฅธ ๋ถ์ฐ๋ ๊ฐ๋ฐ ํ์๊ฒ ์ด๋ฌํ ํ์ ์์ค์ ์์ธก ๋ถ๊ฐ๋ฅํ ๋์์ผ๋ก ๋ํ๋ ์ ์์ผ๋ฉฐ, ํ์ ์ฝ๋๊ฐ SecureTransactionList์ ์ปค์คํ ๋ฉ์๋์ ์์กดํ๋ ๊ฒฝ์ฐ ์ค๋ง์ค๋ฌ์ด ๋๋ฒ๊น ์ธ์ ๊ณผ ์ ์ฌ์ ์ธ ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ ๋ฌธ์ ๋ก ์ด์ด์ง ์ ์์ต๋๋ค.
ํ์ ์์ธก ๊ฐ๋ฅ์ฑ์ ๊ธ๋ก๋ฒ ํ๊ธ ํจ๊ณผ
๋ง์ดํฌ๋ก์๋น์ค, ๊ณต์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ, ๊ทธ๋ฆฌ๊ณ ์๋ก ๋ค๋ฅธ ํ๊ณผ ์ง์ญ์ ์คํ ์์ค ๊ตฌ์ฑ ์์๊ฐ ์ํํ๊ฒ ์ํธ ์ด์ฉ๋์ด์ผ ํ๋ ๊ธ๋ก๋ฒํ๊ณ ์ํธ ์ฐ๊ฒฐ๋ ์ํํธ์จ์ด ๊ฐ๋ฐ ํ๊ฒฝ์์, ์ ๋์ ์ธ ํ์ ์์ธก ๊ฐ๋ฅ์ฑ์ ์ ์งํ๋ ๊ฒ์ ๋จ์ง ์ ์ตํ ๊ฒ์ด ์๋๋ผ ์์กด์ ํ์์ ์ ๋๋ค. ๋๊ธฐ์ ์ ์๋๋ฆฌ์ค๋ฅผ ์๊ฐํด ๋ณด์ญ์์ค: ๋ฐฉ๊ฐ๋ก๋ฅด์ ๋ฐ์ดํฐ ๋ถ์ ํ์ ValidatedDataSet(๋ฌด๊ฒฐ์ฑ ๊ฒ์ฌ๋ฅผ ํฌํจํ๋ ์ปค์คํ Array ์๋ธํด๋์ค)์ ๊ธฐ๋ํ๋ ๋ชจ๋์ ๊ฐ๋ฐํ์ง๋ง, ๋๋ธ๋ฆฐ์ ๋ฐ์ดํฐ ๋ณํ ์๋น์ค๋ ์์ ๋ ๋ชจ๋ฅด๊ฒ ๊ธฐ๋ณธ ๋ฐฐ์ด ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ์ผ๋ฐ Array๋ฅผ ๋ฐํํฉ๋๋ค. ์ด ๋ถ์ผ์น๋ ๋ค์ด์คํธ๋ฆผ ์ ํจ์ฑ ๊ฒ์ฌ ๋ก์ง์ ์น๋ช ์ ์ผ๋ก ๊นจ๋จ๋ฆฌ๊ณ , ์ค์ํ ๋ฐ์ดํฐ ๊ณ์ฝ์ ๋ฌดํจํํ๋ฉฐ, ์ฌ๋ฌ ํ๊ณผ ์ง๋ฆฌ์ ๊ฒฝ๊ณ๋ฅผ ๋์ด ์ง๋จํ๊ณ ์์ ํ๋ ๋ฐ ๋งค์ฐ ์ด๋ ต๊ณ ๋น์ฉ์ด ๋ง์ด ๋๋ ์ค๋ฅ๋ก ์ด์ด์ง ์ ์์ต๋๋ค. ์ด๋ฌํ ๋ฌธ์ ๋ ํ๋ก์ ํธ ์ผ์ ์ ์ฌ๊ฐํ ์ํฅ์ ๋ฏธ์น๊ณ , ๋ณด์ ์ทจ์ฝ์ ์ ๋์ ํ๋ฉฐ, ์ํํธ์จ์ด ์ ๋ขฐ๋๋ฅผ ์ ํ์ํฌ ์ ์์ต๋๋ค.
Symbol.species๊ฐ ํด๊ฒฐํ๋ ํต์ฌ ๋ฌธ์
Symbol.species๊ฐ ํด๊ฒฐํ๊ธฐ ์ํด ์ค๊ณ๋ ๊ทผ๋ณธ์ ์ธ ๋ฌธ์ ๋ ๋ด์ฅ ์ฐ์ฐ ์ค ๋ฐ์ํ๋ ์ด "์ข ์์ค"์ ๋๋ค. JavaScript์๋ Array๋ฟ๋ง ์๋๋ผ RegExp, Promise ๋ฑ ์ฌ๋ฌ ๋ด์ฅ ๋ฉ์๋๊ฐ ๊ฐ๊ฐ์ ํ์ ์ ๋ง๋ ์๋ก์ด ์ธ์คํด์ค๋ฅผ ์์ฑํ๋๋ก ์ค๊ณ๋์์ต๋๋ค. ์ด ๋์์ ์ฌ์ ์ํ๊ฑฐ๋ ์ปค์คํฐ๋ง์ด์งํ ์ ์๋ ์ ์ ์๋๊ณ ์ ๊ทผ ๊ฐ๋ฅํ ๋ฉ์ปค๋์ฆ์ด ์๋ค๋ฉด, ์ด๋ฌํ ๋ด์ฅ ๊ฐ์ฒด๋ฅผ ํ์ฅํ๋ ๋ชจ๋ ์ปค์คํ ํด๋์ค๋ ๋ฐํ๋ ๊ฐ์ฒด์์ ๊ณ ์ ํ ์์ฑ๊ณผ ๋ฉ์๋๊ฐ ์ฌ๋ผ์ง๋ ๊ฒ์ ๋ฐ๊ฒฌํ๊ฒ ๋ ๊ฒ์ด๋ฉฐ, ์ด๋ ํน์ ํ์ง๋ง ์์ฃผ ์ฌ์ฉ๋๋ ์ฐ์ฐ์ ๋ํ ์์์ ๋ณธ์ง๊ณผ ์ ์ฉ์ฑ ์์ฒด๋ฅผ ํผ์ํ๋ ๊ฒ์ ๋๋ค.
๋ด์ฅ ๋ฉ์๋๊ฐ ์์ฑ์์ ์์กดํ๋ ๋ฐฉ์
Array.prototype.map๊ณผ ๊ฐ์ ๋ฉ์๋๊ฐ ํธ์ถ๋ ๋, JavaScript ์์ง์ ๋ณํ๋ ์์๋ค์ ์ํ ์ ๋ฐฐ์ด์ ์์ฑํ๊ธฐ ์ํด ๋ด๋ถ ๋ฃจํด์ ์ํํฉ๋๋ค. ์ด ๋ฃจํด์ ์ผ๋ถ์๋ ์ด ์ ์ธ์คํด์ค์ ์ฌ์ฉํ ์์ฑ์๋ฅผ ์ฐพ๋ ๊ณผ์ ์ด ํฌํจ๋ฉ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก, ํ๋กํ ํ์ ์ฒด์ธ์ ์ํํ๋ฉฐ ์ผ๋ฐ์ ์ผ๋ก ๋ฉ์๋๊ฐ ํธ์ถ๋ ์ธ์คํด์ค์ ์ง๊ณ ๋ถ๋ชจ ํด๋์ค์ ์์ฑ์๋ฅผ ํ์ฉํฉ๋๋ค. ์ฐ๋ฆฌ์ SecureTransactionList ์์ ์์ ๊ทธ ๋ถ๋ชจ๋ ํ์ค Array ์์ฑ์์ ๋๋ค.
ECMAScript ๋ช ์ธ์ ์ฑ๋ฌธํ๋ ์ด ๊ธฐ๋ณธ ๋ฉ์ปค๋์ฆ์ ๋ด์ฅ ๋ฉ์๋๊ฐ ๊ด๋ฒ์ํ ์ปจํ ์คํธ์์ ๊ฒฌ๊ณ ํ๊ณ ์์ธก ๊ฐ๋ฅํ๊ฒ ์๋ํ๋๋ก ๋ณด์ฅํฉ๋๋ค. ๊ทธ๋ฌ๋ ๊ณ ๊ธ ํด๋์ค ์์ฑ์, ํนํ ๋ณต์กํ ๋๋ฉ์ธ ๋ชจ๋ธ์ด๋ ๊ฐ๋ ฅํ ์ ํธ๋ฆฌํฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ตฌ์ถํ๋ ์ฌ๋๋ค์๊ฒ ์ด ๊ธฐ๋ณธ ๋์์ ์์ ํ ๊ธฐ๋ฅ์ ๊ฐ์ถ ํ์ ๋ณด์กด ์๋ธํด๋์ค๋ฅผ ๋ง๋๋ ๋ฐ ์๋นํ ์ ์ฝ์ ๊ฐํฉ๋๋ค. ์ด๋ ๊ฐ๋ฐ์๋ค์ด ์์๋ฐฉํธ์ ์ฌ์ฉํ๊ฑฐ๋ ์ด์์ ์ด์ง ์์ ํ์ ์ ๋์ฑ์ ๋ฐ์๋ค์ด๋๋ก ๊ฐ์ํฉ๋๋ค.
Symbol.species ์๊ฐ: ์์ฑ์ ์ปค์คํฐ๋ง์ด์ง ํ
Symbol.species๋ ECMAScript 2015(ES6)์์ ๋์ ๋ ํ๊ธฐ์ ์ธ ์ ์๋ ค์ง ์ฌ๋ณผ์ ๋๋ค. ํต์ฌ ์๋ฌด๋ ํด๋์ค ์์ฑ์๊ฐ ๋ด์ฅ ๋ฉ์๋๊ฐ ํ์ ํด๋์ค์์ ์ ์ธ์คํด์ค๋ฅผ ์์ฑํ ๋ ์ด๋ค ์์ฑ์ ํจ์๋ฅผ ์ฌ์ฉํด์ผ ํ๋์ง๋ฅผ ์ ํํ๊ฒ ์ ์ํ ์ ์๋๋ก ๊ถํ์ ๋ถ์ฌํ๋ ๊ฒ์ ๋๋ค. ์ด๋ ํด๋์ค์ ์ ์ธํ๋ ์ ์ getter ์์ฑ์ผ๋ก ๋ํ๋๋ฉฐ, ์ด getter๊ฐ ๋ฐํํ๋ ์์ฑ์ ํจ์๊ฐ ๋ด์ฅ ์ฐ์ฐ์ ์ํ "์ข ์์ฑ์"๊ฐ ๋ฉ๋๋ค.
๊ตฌ๋ฌธ ๋ฐ ์ ๋ต์ ๋ฐฐ์น
Symbol.species๋ฅผ ๊ตฌํํ๋ ๊ฒ์ ๊ตฌ๋ฌธ์ ์ผ๋ก ๊ฐ๋จํฉ๋๋ค: ํด๋์ค ์ ์์ [Symbol.species]๋ผ๋ ์ด๋ฆ์ ์ ์ getter ์์ฑ์ ์ถ๊ฐํฉ๋๋ค. ์ด getter๋ ์์ฑ์ ํจ์๋ฅผ ๋ฐํํด์ผ ํฉ๋๋ค. ํ์ ํ์ ์ ์ ์งํ๊ธฐ ์ํ ๊ฐ์ฅ ์ผ๋ฐ์ ์ด๊ณ ์ข ์ข ๊ฐ์ฅ ๋ฐ๋์งํ ๋์์ ๋จ์ํ this๋ฅผ ๋ฐํํ๋ ๊ฒ์ ๋๋ค. ์ด๋ ํ์ฌ ํด๋์ค ์์ฒด์ ์์ฑ์๋ฅผ ์ฐธ์กฐํ์ฌ ๊ทธ "์ข "์ ๋ณด์กดํฉ๋๋ค.
class MyCustomType extends BaseType { static get [Symbol.species]() { return this; // ์ด๊ฒ์ ๋ด์ฅ ๋ฉ์๋๊ฐ MyCustomType ์ธ์คํด์ค๋ฅผ ๋ฐํํ๋๋ก ๋ณด์ฅํฉ๋๋ค } // ... ๋๋จธ์ง ์ปค์คํ ํด๋์ค ์ ์ }
์ฐ๋ฆฌ์ SecureTransactionList ์์ ๋ก ๋์๊ฐ Symbol.species๋ฅผ ์ ์ฉํ์ฌ ๊ทธ ๋ณํ์ ์ธ ํ์ ์ง์ ํ์ธํด ๋ด ์๋ค.
์ค์ ์์์ Symbol.species: ํ์ ๋ฌด๊ฒฐ์ฑ ๋ณด์กด
Symbol.species์ ์ค์ ์ ์ฉ์ ์ฐ์ํ๊ณ ์ฌ์คํ ์ํฅ์ ๋ฏธ์นฉ๋๋ค. ์ด ์ ์ getter๋ฅผ ์ถ๊ฐํ๋ ๊ฒ๋ง์ผ๋ก JavaScript ์์ง์ ๋ช ํํ ์ง์นจ์ ์ ๊ณตํ์ฌ, ๋ด์ฅ ๋ฉ์๋๊ฐ ๊ธฐ๋ณธ ํด๋์ค๋ก ๋๋์๊ฐ๋ ๋์ ํ์ ํด๋์ค์ ํ์ ์ ์กด์คํ๊ณ ์ ์งํ๋๋ก ๋ณด์ฅํฉ๋๋ค.
์์ 1: Array ์๋ธํด๋์ค์์ ์ข ์ ์งํ๊ธฐ
๋ฐฐ์ด ์กฐ์ ์ฐ์ฐ ํ์๋ ์์ฒด ์ธ์คํด์ค๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ๋ฐํํ๋๋ก SecureTransactionList๋ฅผ ๊ฐํํด ๋ด ์๋ค:
class SecureTransactionList extends Array { static get [Symbol.species]() { return this; // ์ค์: ๋ด์ฅ ๋ฉ์๋๊ฐ SecureTransactionList ์ธ์คํด์ค๋ฅผ ๋ฐํํ๋๋ก ๋ณด์ฅ } constructor(...args) { super(...args); console.log('SecureTransactionList ์ธ์คํด์ค๊ฐ ์์ฑ๋์ด ๊ฐ์ฌ ์ค๋น๊ฐ ์๋ฃ๋์์ต๋๋ค.'); this.auditLog = []; } addTransaction(transaction) { this.push(transaction); this.auditLog.push(`๊ฑฐ๋ ์ถ๊ฐ: ${JSON.stringify(transaction)}`); console.log(this.auditLog[this.auditLog.length - 1]); } getAuditReport() { return `${this.length}๊ฐ ๊ฑฐ๋์ ๋ํ ๊ฐ์ฌ ๋ณด๊ณ ์:\n${this.auditLog.join('\n')}`; } }
์ด์ ๋ณํ ์ฐ์ฐ์ ๋ฐ๋ณตํ๊ณ ๊ฒฐ์ ์ ์ธ ์ฐจ์ด์ ์ ๊ด์ฐฐํด ๋ด ์๋ค:
const dailyTransactions = new SecureTransactionList(); dailyTransactions.addTransaction({ id: 'TRN001', amount: 100, currency: 'USD' }); dailyTransactions.addTransaction({ id: 'TRN002', amount: 75, currency: 'EUR' }); console.log(dailyTransactions.getAuditReport()); const processedTransactions = dailyTransactions.map(t => ({ ...t, processed: true })); console.log(processedTransactions instanceof SecureTransactionList); // ์์: true, ์ค์ : true (๐) console.log(processedTransactions instanceof Array); // ์์: true, ์ค์ : true console.log(processedTransactions.getAuditReport()); // ์๋ํจ! ์ด์ '2๊ฐ ๊ฑฐ๋์ ๋ํ ๊ฐ์ฌ ๋ณด๊ณ ์:...'๋ฅผ ๋ฐํํฉ๋๋ค
Symbol.species๋ฅผ ์ํด ๋จ ๋ช ์ค๋ง ์ถ๊ฐํ์ ๋ฟ์ธ๋ฐ, ์ฐ๋ฆฌ๋ ๊ทผ๋ณธ์ ์ผ๋ก ์ข ์์ค ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ต๋๋ค! ์ด์ processedTransactions๋ ์ ํํ๊ฒ SecureTransactionList์ ์ธ์คํด์ค๊ฐ ๋์ด ๋ชจ๋ ์ปค์คํ ๊ฐ์ฌ ๋ฉ์๋์ ์์ฑ์ ๋ณด์กดํฉ๋๋ค. ์ด๋ ๋ณต์กํ ๋ฐ์ดํฐ ๋ณํ ์ ๋ฐ์ ๊ฑธ์ณ ํ์ ๋ฌด๊ฒฐ์ฑ์ ์ ์งํ๋ ๋ฐ ์ ๋์ ์ผ๋ก ์ค์ํ๋ฉฐ, ํนํ ๋ฐ์ดํฐ ๋ชจ๋ธ์ด ์ฌ๋ฌ ์ง๋ฆฌ์ ์์ญ๊ณผ ๊ท์ ์ค์ ์๊ตฌ ์ฌํญ์ ๊ฑธ์ณ ์๊ฒฉํ๊ฒ ์ ์๋๊ณ ๊ฒ์ฆ๋๋ ๋ถ์ฐ ์์คํ ๋ด์์ ๋์ฑ ๊ทธ๋ ์ต๋๋ค.
์ธ๋ถํ๋ ์์ฑ์ ์ ์ด: return this๋ฅผ ๋์ด์
return this;๊ฐ Symbol.species์ ๊ฐ์ฅ ์ผ๋ฐ์ ์ด๊ณ ์ข ์ข ๋ฐ๋์งํ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ๋ํ๋ด์ง๋ง, ์ด๋ค ์์ฑ์ ํจ์๋ ๋ฐํํ ์ ์๋ ์ ์ฐ์ฑ์ ๋ ๋ณต์กํ ์ ์ด๋ฅผ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค:
- return this; (ํ์๋ ์ข ์ ๊ธฐ๋ณธ๊ฐ): ์์ฐ๋ ๋ฐ์ ๊ฐ์ด, ๋ด์ฅ ๋ฉ์๋๊ฐ ์ ํํ ํ์ ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ๋ฐํํ๊ธฐ๋ฅผ ๋ช ์์ ์ผ๋ก ์ํ ๋ ์ด์์ ์ธ ์ ํ์ ๋๋ค. ์ด๋ ๊ฐ๋ ฅํ ํ์ ์ผ๊ด์ฑ์ ์ด์งํ๊ณ , ์ปค์คํ ํ์ ์ ๋ํ ์ํํ๊ณ ํ์ ๋ณด์กด์ ์ธ ์ฐ์ฐ ์ฒด์ด๋์ ๊ฐ๋ฅํ๊ฒ ํ๋ฉฐ, ์ด๋ ์ ์ฐํ API์ ๋ณต์กํ ๋ฐ์ดํฐ ํ์ดํ๋ผ์ธ์ ์ค์ํฉ๋๋ค.
- return BaseClass; (๊ธฐ๋ณธ ํ์ ๊ฐ์ ): ํน์ ์ค๊ณ ์๋๋ฆฌ์ค์์๋ ๋ด์ฅ ๋ฉ์๋๊ฐ ๊ธฐ๋ณธ ํด๋์ค(์: ์ผ๋ฐ Array ๋๋ Promise)์ ์ธ์คํด์ค๋ฅผ ๋ฐํํ๋ ๊ฒ์ ์๋์ ์ผ๋ก ์ ํธํ ์ ์์ต๋๋ค. ์ด๋ ํ์ ํด๋์ค๊ฐ ์ฃผ๋ก ์์ฑ ๋๋ ์ด๊ธฐ ์ฒ๋ฆฌ ์ค ํน์ ๋์์ ์ํ ์์ ๋ํผ ์ญํ ์ ํ๊ณ , ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ต์ ํํ๊ฑฐ๋, ๋ค์ด์คํธ๋ฆผ ์ฒ๋ฆฌ๋ฅผ ๋จ์ํํ๊ฑฐ๋, ์ํธ ์ด์ฉ์ฑ์ ์ํด ๋ ๊ฐ๋จํ ์ธํฐํ์ด์ค๋ฅผ ์๊ฒฉํ๊ฒ ์ค์ํ๊ธฐ ์ํด ํ์ค ๋ณํ ์ค์ ๋ํผ๋ฅผ "๋ฒ๊ธฐ"๊ณ ์ถ์ ๋ ์ ์ฉํ ์ ์์ต๋๋ค.
- return AnotherClass; (๋์ฒด ์์ฑ์๋ก ๋ฆฌ๋๋ ์ ): ๋งค์ฐ ๊ณ ๊ธ ๋๋ ๋ฉํํ๋ก๊ทธ๋๋ฐ ์ปจํ ์คํธ์์๋ ๋ด์ฅ ๋ฉ์๋๊ฐ ์์ ํ ๋ค๋ฅด์ง๋ง ์๋ฏธ์ ํธํ๋๋ ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ๋ฐํํ๊ธฐ๋ฅผ ์ํ ์ ์์ต๋๋ค. ์ด๋ ๋์ ๊ตฌํ ์ ํ์ด๋ ์ ๊ตํ ํ๋ก์ ํจํด์ ์ฌ์ฉ๋ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ด ์ต์ ์ ๋์ ํด๋์ค๊ฐ ์์ ์ ์์ ๋์๊ณผ ์์ ํ ํธํ๋์ง ์์ ๊ฒฝ์ฐ ์์์น ๋ชปํ ํ์ ๋ถ์ผ์น ๋ฐ ๋ฐํ์ ์ค๋ฅ์ ์ํ์ ํฌ๊ฒ ์ฆ๊ฐ์ํค๋ฏ๋ก ๊ทน๋์ ์ฃผ์๊ฐ ํ์ํฉ๋๋ค. ์ฒ ์ ํ ๋ฌธ์ํ์ ์๊ฒฉํ ํ ์คํธ๋ ์ฌ๊ธฐ์์ ํํํ ์ ์๋ ๋ถ๋ถ์ ๋๋ค.
๋ ๋ฒ์งธ ์ต์ ์ธ ๊ธฐ๋ณธ ํ์ ์ ๋ฐํ์ ๋ช ์์ ์ผ๋ก ๊ฐ์ ํ๋ ๊ฒฝ์ฐ๋ฅผ ์ค๋ช ํด ๋ณด๊ฒ ์ต๋๋ค:
class LimitedUseArray extends Array { static get [Symbol.species]() { return Array; // ๋ด์ฅ ๋ฉ์๋๊ฐ ์ผ๋ฐ Array ์ธ์คํด์ค๋ฅผ ๋ฐํํ๋๋ก ๊ฐ์ } constructor(...args) { super(...args); this.isLimited = true; // ์ปค์คํ ์์ฑ } checkLimits() { console.log(`์ด ๋ฐฐ์ด์ ์ ํ๋ ์ฉ๋๋ฅผ ๊ฐ์ง๋๋ค: ${this.isLimited}`); } }
const limitedArr = new LimitedUseArray(10, 20, 30); limitedArr.checkLimits(); // "์ด ๋ฐฐ์ด์ ์ ํ๋ ์ฉ๋๋ฅผ ๊ฐ์ง๋๋ค: true" const mappedLimitedArr = limitedArr.map(x => x * 2); console.log(mappedLimitedArr instanceof LimitedUseArray); // false console.log(mappedLimitedArr instanceof Array); // true // mappedLimitedArr.checkLimits(); // ์ค๋ฅ! mappedLimitedArr.checkLimits๋ ํจ์๊ฐ ์๋๋๋ค console.log(mappedLimitedArr.isLimited); // undefined
์ฌ๊ธฐ์ map ๋ฉ์๋๋ ์๋์ ์ผ๋ก ์ผ๋ฐ Array๋ฅผ ๋ฐํํ์ฌ ๋ช ์์ ์ธ ์์ฑ์ ์ ์ด๋ฅผ ๋ณด์ฌ์ค๋๋ค. ์ด ํจํด์ ์ฒ๋ฆฌ ์ฒด์ธ์ ์ด๊ธฐ์ ์๋น๋ ํ, ๋ฐ์ดํฐ ํ๋ฆ์ ํ๋ฐ ๋จ๊ณ์์ ๋ ๋์ ํธํ์ฑ์ด๋ ์ค๋ฒํค๋ ๊ฐ์๋ฅผ ์ํด ํ์ค ํ์ ์ผ๋ก ์์ฐ์ค๋ฝ๊ฒ ๋๋์๊ฐ๋, ํนํ ๊ณ ๋๋ก ์ต์ ํ๋ ๊ธ๋ก๋ฒ ๋ฐ์ดํฐ ์ผํฐ์์ ์์์ ์ด๊ณ ์์ ํจ์จ์ ์ธ ๋ํผ์ ์ ์ฉํ ์ ์์ต๋๋ค.
Symbol.species๋ฅผ ์กด์คํ๋ ์ฃผ์ ๋ด์ฅ ๋ฉ์๋
Symbol.species์ ์ํฅ์ ๋ฐ๋ ๋ด์ฅ ๋ฉ์๋๊ฐ ์ ํํ ๋ฌด์์ธ์ง ์ดํดํ๋ ๊ฒ์ด ๊ฐ์ฅ ์ค์ํฉ๋๋ค. ์ด ๊ฐ๋ ฅํ ๋ฉ์ปค๋์ฆ์ ์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ๋ชจ๋ ๋ฉ์๋์ ๋ณดํธ์ ์ผ๋ก ์ ์ฉ๋๋ ๊ฒ์ด ์๋๋ผ, ๋ณธ์ง์ ์ผ๋ก ์์ ์ "์ข "์ ๋ฐ์ํ๋ ์ ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ ์์ ์ ํนํ๋์ด ์ค๊ณ๋์์ต๋๋ค.
- Array ๋ฉ์๋: ์ด ๋ฉ์๋๋ค์ Symbol.species๋ฅผ ํ์ฉํ์ฌ ๋ฐํ ๊ฐ์ ์์ฑ์๋ฅผ ๊ฒฐ์ ํฉ๋๋ค:
- Array.prototype.concat()
- Array.prototype.filter()
- Array.prototype.map()
- Array.prototype.slice()
- Array.prototype.splice()
- Array.prototype.flat() (ES2019)
- Array.prototype.flatMap() (ES2019)
- TypedArray ๋ฉ์๋: ๊ณผํ ๊ณ์ฐ, ๊ทธ๋ํฝ, ๊ณ ์ฑ๋ฅ ๋ฐ์ดํฐ ์ฒ๋ฆฌ์ ์ค์ํ TypedArray์ ์ ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ ๋ฉ์๋๋ค๋ [Symbol.species]๋ฅผ ์กด์คํฉ๋๋ค. ์ฌ๊ธฐ์๋ ๋ค์์ ํฌํจํ๋ ์ด์ ๊ตญํ๋์ง ์์ต๋๋ค:
- Float32Array.prototype.map()
- Int8Array.prototype.subarray()
- Uint16Array.prototype.filter()
- RegExp ๋ฉ์๋: ๊ณ ๊ธ ๋ก๊น
์ด๋ ํน์ ํจํด ์ ํจ์ฑ ๊ฒ์ฌ์ ๊ฐ์ ๊ธฐ๋ฅ์ ์ถ๊ฐํ ์ ์๋ ์ปค์คํ
์ ๊ท ํํ์ ํด๋์ค์ ๊ฒฝ์ฐ, ํจํด ๋งค์นญ์ด๋ ๋ถํ ์์
์ ์ํํ ๋ ํ์
์ผ๊ด์ฑ์ ์ ์งํ๊ธฐ ์ํด Symbol.species๊ฐ ์ค์ํฉ๋๋ค:
- RegExp.prototype.exec()
- RegExp.prototype[@@split]() (String.prototype.split์ด RegExp ์ธ์์ ํจ๊ป ํธ์ถ๋ ๋ ๋ด๋ถ์ ์ผ๋ก ํธ์ถ๋๋ ๋ฉ์๋)
- Promise ๋ฉ์๋: ํนํ ๋ถ์ฐ ์์คํ
์์ ๋น๋๊ธฐ ํ๋ก๊ทธ๋๋ฐ ๋ฐ ์ ์ด ํ๋ฆ์ ๋งค์ฐ ์ค์ํ Promise ๋ฉ์๋๋ค๋ Symbol.species๋ฅผ ์กด์คํฉ๋๋ค:
- Promise.prototype.then()
- Promise.prototype.catch()
- Promise.prototype.finally()
- Promise.all(), Promise.race(), Promise.any(), Promise.allSettled()์ ๊ฐ์ ์ ์ ๋ฉ์๋ (ํ์ Promise์์ ์ฒด์ด๋๋๊ฑฐ๋ ์ ์ ๋ฉ์๋ ํธ์ถ ์ this ๊ฐ์ด ํ์ Promise ์์ฑ์์ธ ๊ฒฝ์ฐ).
์ด ๋ชฉ๋ก์ ๋ํ ์ฒ ์ ํ ์ดํด๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ, ํ๋ ์์ํฌ ๋๋ ๋ณต์กํ ์ ํ๋ฆฌ์ผ์ด์ ๋ก์ง์ ๋ง๋๋ ๊ฐ๋ฐ์์๊ฒ ํ์์ ์ ๋๋ค. ์ด๋ค ๋ฉ์๋๊ฐ ๋น์ ์ ์ข ์ ์ธ์ ์กด์คํ ์ง ์ ํํ ์๋ ๊ฒ์ ๊ฒฌ๊ณ ํ๊ณ ์์ธก ๊ฐ๋ฅํ API๋ฅผ ์ค๊ณํ๋ ๋ฐ ํ์ ์ค์ด์ฃผ๋ฉฐ, ์ฝ๋๊ฐ ๋ค์ํ๊ณ ์ข ์ข ์ ์ธ๊ณ์ ์ผ๋ก ๋ถ์ฐ๋ ๊ฐ๋ฐ ๋ฐ ๋ฐฐํฌ ํ๊ฒฝ์ ํตํฉ๋ ๋ ๋๋ผ์์ ์ค์ฌ์ค๋๋ค.
๊ณ ๊ธ ์ฌ์ฉ ์ฌ๋ก ๋ฐ ์ค์ ๊ณ ๋ ค ์ฌํญ
ํ์ ๋ณด์กด์ด๋ผ๋ ๊ทผ๋ณธ์ ์ธ ๋ชฉํ๋ฅผ ๋์ด์, Symbol.species๋ ์ ๊ตํ ์ํคํ ์ฒ ํจํด์ ๊ฐ๋ฅ์ฑ์ ์ด์ด์ฃผ๋ฉฐ, ์ ์ฌ์ ์ธ ๋ณด์ ์ํฅ๊ณผ ์ฑ๋ฅ ํธ๋ ์ด๋์คํ๋ฅผ ํฌํจํ ๋ค์ํ ๋งฅ๋ฝ์์ ์ ์คํ ๊ณ ๋ ค๋ฅผ ํ์๋ก ํฉ๋๋ค.
๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฐ ํ๋ ์์ํฌ ๊ฐ๋ฐ ๊ฐํ
๋๋ฆฌ ์ฑํ๋ JavaScript ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ํฌ๊ด์ ์ธ ํ๋ ์์ํฌ๋ฅผ ๊ฐ๋ฐํ๋ ์ ์์๊ฒ Symbol.species๋ ํ์์ ์ธ ์ํคํ ์ฒ ๊ธฐ๋ณธ ์์๋ ๋ค๋ฆ์์ต๋๋ค. ์ด๋ฅผ ํตํด ์ต์ข ์ฌ์ฉ์๊ฐ ๋ด์ฅ๋ ์์ ์คํ ์ค์ ๊ณ ์ ํ "ํน์ฑ"์ ์์ ๋ด์ฌ์ ์ํ ์์ด ์ํํ๊ฒ ์๋ธํด๋์ฑํ ์ ์๋ ๊ณ ๋๋ก ํ์ฅ ๊ฐ๋ฅํ ๊ตฌ์ฑ ์์๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค. ์ปค์คํ Observable ์ํ์ค ํด๋์ค๋ฅผ ๊ฐ์ง ๋ฐ์ํ ํ๋ก๊ทธ๋๋ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ตฌ์ถํ๋ ์๋๋ฆฌ์ค๋ฅผ ์๊ฐํด ๋ณด์ญ์์ค. ์ฌ์ฉ์๊ฐ ๊ธฐ๋ณธ Observable์ ํ์ฅํ์ฌ ThrottledObservable์ด๋ ValidatedObservable์ ๋ง๋ ๋ค๋ฉด, ๊ทธ๋ค์ filter(), map(), ๋๋ merge() ์์ ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ ๋ค๋ฆญ Observable๋ก ๋๋์๊ฐ๋ ๋์ ์ผ๊ด๋๊ฒ ๊ทธ๋ค์ ThrottledObservable(๋๋ ValidatedObservable) ์ธ์คํด์ค๋ฅผ ๋ฐํํ๊ธฐ๋ฅผ ์ํ ๊ฒ์ ๋๋ค. ์ด๋ ์ฌ์ฉ์์ ์ปค์คํ ๋ฉ์๋, ์์ฑ ๋ฐ ํน์ ๋ฐ์ํ ๋์์ด ์ถ๊ฐ์ ์ธ ์ฒด์ด๋ ๋ฐ ์กฐ์์ ์ํด ๊ณ์ ์ฌ์ฉ ๊ฐ๋ฅํ๋๋ก ๋ณด์ฅํ๋ฉฐ, ํ์๋ ๋ฐ์ดํฐ ์คํธ๋ฆผ์ ๋ฌด๊ฒฐ์ฑ์ ์ ์งํฉ๋๋ค.
์ด ๊ธฐ๋ฅ์ ๊ทผ๋ณธ์ ์ผ๋ก ์๋ก ๋ค๋ฅธ ๋๋ฅ์์ ์ด์๋๊ณ ๊ณต์ ์ํ๊ณ์ ๊ธฐ์ฌํ๋ ๋ค์ํ ํ์ ์ํด ๊ฐ๋ฐ๋ ์ ์๋ ์ด์ง์ ์ธ ๋ชจ๋๊ณผ ๊ตฌ์ฑ ์์ ๊ฐ์ ์ํธ ์ด์ฉ์ฑ์ ์ฆ์ง์ํต๋๋ค. Symbol.species ๊ณ์ฝ์ ์ฑ์คํ ์ค์ํจ์ผ๋ก์จ, ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ ์๋ ๋งค์ฐ ๊ฒฌ๊ณ ํ๊ณ ๋ช ์์ ์ธ ํ์ฅ ์ง์ ์ ์ ๊ณตํ์ฌ, ๊ทธ๋ค์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋์ ์ธ ๊ธ๋ก๋ฒ ์ํํธ์จ์ด ํ๊ฒฝ ๋ด์์ ๋ณํํ๋ ์๊ตฌ ์ฌํญ์ ํจ์ฌ ๋ ์ ์ ๊ฐ๋ฅํ๊ณ , ๋ฏธ๋ ์งํฅ์ ์ด๋ฉฐ, ํ๋ ฅ์ ์ผ๋ก ๋ง๋ญ๋๋ค.
๋ณด์ ์ํฅ ๋ฐ ํ์ ํผ๋์ ์ํ
Symbol.species๊ฐ ๊ฐ์ฒด ์์ฑ์ ๋ํ ์ ๋ก ์๋ ์ ์ด๊ถ์ ์ ๊ณตํ๋ ๋ฐ๋ฉด, ๊ทน๋์ ์ฃผ์๋ฅผ ๊ธฐ์ธ์ฌ ๋ค๋ฃจ์ง ์์ผ๋ฉด ์ ์ฌ์ ์ธ ์ค์ฉ์ด๋ ์ทจ์ฝ์ ์ ๋ฒกํฐ๋ฅผ ๋์ ํ๊ธฐ๋ ํฉ๋๋ค. ์ด ์ฌ๋ณผ์ *์ด๋ค* ์์ฑ์๋ ๋์ฒดํ ์ ์๊ฒ ํด์ฃผ๊ธฐ ๋๋ฌธ์, ์ด๋ก ์ ์ผ๋ก ์ ์์ ์ธ ํ์์์ ์ํด ์ ์ฉ๋๊ฑฐ๋ ๋ถ์ฃผ์ํ ๊ฐ๋ฐ์์ ์ํด ์๋ชป ๊ตฌ์ฑ๋์ด ๋ฏธ๋ฌํ์ง๋ง ์ฌ๊ฐํ ๋ฌธ์ ๋ก ์ด์ด์ง ์ ์์ต๋๋ค:
- ํ์ ํผ๋ ๊ณต๊ฒฉ: ์ ์์ ์ธ ๋น์ฌ์๊ฐ [Symbol.species] getter๋ฅผ ์ฌ์ ์ํ์ฌ ํผ์์ ์ผ๋ก๋ ํธํ๋์ง๋ง ๊ถ๊ทน์ ์ผ๋ก ์์์น ๋ชปํ ๋๋ ์ฌ์ง์ด ์ ๋์ ์ธ ํ์ ์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ์์ฑ์๋ฅผ ๋ฐํํ ์ ์์ต๋๋ค. ํ์ ์ฝ๋ ๊ฒฝ๋ก๊ฐ ๊ฐ์ฒด์ ํ์ ์ ๋ํด ๊ฐ์ (์: Array๋ฅผ ๊ธฐ๋ํ์ง๋ง ํ๋ก์๋ ๋ด๋ถ ์ฌ๋กฏ์ด ๋ณ๊ฒฝ๋ ๊ฐ์ฒด๋ฅผ ๋ฐ์)์ ํ๋ค๋ฉด, ์ด๋ ํนํ WebAssembly๋ ๋ค์ดํฐ๋ธ ํ์ฅ์ ํ์ฉํ๋ ํ๊ฒฝ์์ ํ์ ํผ๋, ๊ฒฝ๊ณ ์ด๊ณผ ์ ๊ทผ ๋๋ ๊ธฐํ ๋ฉ๋ชจ๋ฆฌ ์์ ์ทจ์ฝ์ ์ผ๋ก ์ด์ด์ง ์ ์์ต๋๋ค.
- ๋ฐ์ดํฐ ์ ์ถ/๊ฐ๋ก์ฑ๊ธฐ: ํ๋ก์ ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ ์์ฑ์๋ก ๋์ฒดํจ์ผ๋ก์จ ๊ณต๊ฒฉ์๋ ๋ฐ์ดํฐ ํ๋ฆ์ ๊ฐ๋ก์ฑ๊ฑฐ๋ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ์ปค์คํ SecureBuffer ํด๋์ค๊ฐ Symbol.species์ ์์กดํ๊ณ ์ด๊ฒ์ด ํ๋ก์๋ฅผ ๋ฐํํ๋๋ก ์ฌ์ ์๋๋ฉด, ๋ฏผ๊ฐํ ๋ฐ์ดํฐ ๋ณํ์ด ๊ฐ๋ฐ์์ ์ธ์ง ์์ด ๋ก๊น ๋๊ฑฐ๋ ์์ ๋ ์ ์์ต๋๋ค.
- ์๋น์ค ๊ฑฐ๋ถ: ์๋์ ์ผ๋ก ์๋ชป ๊ตฌ์ฑ๋ [Symbol.species] getter๋ ์ค๋ฅ๋ฅผ ๋ฐ์์ํค๊ฑฐ๋, ๋ฌดํ ๋ฃจํ์ ๋น ์ง๊ฑฐ๋, ๊ณผ๋ํ ๋ฆฌ์์ค๋ฅผ ์๋นํ๋ ์์ฑ์๋ฅผ ๋ฐํํ์ฌ, ์ ํ๋ฆฌ์ผ์ด์ ์ด ํด๋์ค ์ธ์คํด์คํ์ ์ํฅ์ ๋ฏธ์น๋ ์ ๋ขฐํ ์ ์๋ ์ ๋ ฅ์ ์ฒ๋ฆฌํ ๊ฒฝ์ฐ ์ ํ๋ฆฌ์ผ์ด์ ๋ถ์์ ์ฑ์ด๋ ์๋น์ค ๊ฑฐ๋ถ๋ก ์ด์ด์ง ์ ์์ต๋๋ค.
๋ณด์์ ๋ฏผ๊ฐํ ํ๊ฒฝ, ํนํ ๋งค์ฐ ๊ธฐ๋ฐ์ธ ๋ฐ์ดํฐ, ์ฌ์ฉ์ ์ ์ ์ฝ๋ ๋๋ ์ ๋ขฐํ ์ ์๋ ์์ค๋ก๋ถํฐ์ ์ ๋ ฅ์ ์ฒ๋ฆฌํ ๋, Symbol.species๋ฅผ ํตํด ์์ฑ๋ ๊ฐ์ฒด ์ฃผ๋ณ์ ์๊ฒฉํ ์ด๊ท , ์ ํจ์ฑ ๊ฒ์ฌ ๋ฐ ์๊ฒฉํ ์ ๊ทผ ์ ์ด๋ฅผ ๊ตฌํํ๋ ๊ฒ์ด ์ ๋์ ์ผ๋ก ์ค์ํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ์ ํ๋ฆฌ์ผ์ด์ ํ๋ ์์ํฌ๊ฐ ํ๋ฌ๊ทธ์ธ์ด ํต์ฌ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ํ์ฅํ๋๋ก ํ์ฉํ๋ ๊ฒฝ์ฐ, [Symbol.species] getter๊ฐ ์์์น ๋ชปํ๊ฑฐ๋, ํธํ๋์ง ์๊ฑฐ๋, ์ ์ฌ์ ์ผ๋ก ์ํํ ์์ฑ์๋ฅผ ๊ฐ๋ฆฌํค์ง ์๋๋ก ๋ณด์ฅํ๋ ๊ฐ๋ ฅํ ๋ฐํ์ ๊ฒ์ฌ๋ฅผ ๊ตฌํํด์ผ ํ ์ ์์ต๋๋ค. ๊ธ๋ก๋ฒ ๊ฐ๋ฐ์ ์ปค๋ฎค๋ํฐ๋ ์ ์ ๋ ์์ ํ ์ฝ๋ฉ ๊ดํ์ ๊ฐ์กฐํ๊ณ ์์ผ๋ฉฐ, ์ด ๊ฐ๋ ฅํ๊ณ ๋ฏธ๋ฌํ ๊ธฐ๋ฅ์ ๋ณด์ ๊ณ ๋ ค ์ฌํญ์ ๋ํ ๋์ ์์ค์ ์ฃผ์๋ฅผ ์๊ตฌํฉ๋๋ค.
์ฑ๋ฅ ๊ณ ๋ ค ์ฌํญ: ๊ท ํ ์กํ ๊ด์
Symbol.species์ ์ํด ๋์ ๋ ์ฑ๋ฅ ์ค๋ฒํค๋๋ ๋๋ถ๋ถ์ ์ค์ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ผ๋ฐ์ ์ผ๋ก ๋ฌด์ํ ์ ์๋ ์์ค์ผ๋ก ๊ฐ์ฃผ๋ฉ๋๋ค. JavaScript ์์ง์ ๊ด๋ จ ๋ด์ฅ ๋ฉ์๋๊ฐ ํธ์ถ๋ ๋๋ง๋ค ์์ฑ์์์ [Symbol.species] ์์ฑ์ ์กฐํํฉ๋๋ค. ์ด ์กฐํ ์์ ์ ์ผ๋ฐ์ ์ผ๋ก ํ๋ JavaScript ์์ง(V8, SpiderMonkey, JavaScriptCore ๋ฑ)์ ์ํด ๊ณ ๋๋ก ์ต์ ํ๋์ด ์์ผ๋ฉฐ, ์ข ์ข ๋ง์ดํฌ๋ก์ด ๋จ์๋ก ๊ทน๋์ ํจ์จ์ฑ์ผ๋ก ์คํ๋ฉ๋๋ค.
๊ธ๋ก๋ฒ ํ์ด ๊ฐ๋ฐํ๋ ๋๋ค์์ ์น ์ ํ๋ฆฌ์ผ์ด์ , ๋ฐฑ์๋ ์๋น์ค ๋ฐ ๋ชจ๋ฐ์ผ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฒฝ์ฐ, ํ์ ์ผ๊ด์ฑ ์ ์ง, ์ฝ๋ ์์ธก ๊ฐ๋ฅ์ฑ ํฅ์, ๊ฒฌ๊ณ ํ ํด๋์ค ์ค๊ณ ๊ฐ๋ฅ์ด๋ผ๋ ์ฌ๋ํ ์ด์ ์ด ๊ฑฐ์ ๊ฐ์งํ ์ ์๋ ๋ฏธ๋ฏธํ ์ฑ๋ฅ ์ํฅ์ ํจ์ฌ ๋ฅ๊ฐํฉ๋๋ค. ์ ์ง๋ณด์์ฑ, ๋๋ฒ๊น ์๊ฐ ๋จ์ถ ๋ฐ ์์คํ ์ ๋ขฐ์ฑ ํฅ์์์ ์ป๋ ์ด์ต์ด ํจ์ฌ ๋ ํฝ๋๋ค.
๊ทธ๋ฌ๋ ์ด๊ณ ๋น๋ ๊ฑฐ๋ ์๊ณ ๋ฆฌ์ฆ, ๋ธ๋ผ์ฐ์ ๋ด์์์ ์ค์๊ฐ ์ค๋์ค/๋น๋์ค ์ฒ๋ฆฌ ๋๋ CPU ์์ฐ์ด ์ฌ๊ฐํ๊ฒ ์ ํ๋ ์๋ฒ ๋๋ ์์คํ ๊ณผ ๊ฐ์ ๊ทน๋๋ก ์ฑ๋ฅ์ด ์ค์ํ๊ณ ์ง์ฐ ์๊ฐ์ด ์งง์ ์๋๋ฆฌ์ค์์๋ ๋ชจ๋ ๋ง์ดํฌ๋ก์ด๊ฐ ์ค์ ๋ก ์ค์ํ ์ ์์ต๋๋ค. ์ด๋ฌํ ์์ธ์ ์ธ ํ์ ์ฌ๋ก์์, ์๊ฒฉํ ํ๋กํ์ผ๋ง์ ํตํด [Symbol.species] ์กฐํ๊ฐ ๋นก๋นกํ ์ฑ๋ฅ ์์ฐ ๋ด์์(์: ์ด๋น ์๋ฐฑ๋ง ๊ฐ์ ์ฒด์ธ๋ ์์ ) ์ธก์ ๊ฐ๋ฅํ๊ณ ์ฉ๋ฉํ ์ ์๋ ๋ณ๋ชฉ ํ์์ ์ ๋ฐํ๋ค๊ณ ๋ช ํํ๊ฒ ๋ํ๋๋ค๋ฉด, ๊ณ ๋๋ก ์ต์ ํ๋ ๋์์ ํ์ํ ์ ์์ต๋๋ค. ์ฌ๊ธฐ์๋ ํน์ ์์ฑ์๋ฅผ ์๋์ผ๋ก ํธ์ถํ๊ฑฐ๋, ์์ ๋์ ํฉ์ฑ์ ์ฌ์ฉํ๊ฑฐ๋, ์ปค์คํ ํฉํ ๋ฆฌ ํจ์๋ฅผ ๊ตฌํํ๋ ๊ฒ์ด ํฌํจ๋ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋ฐ๋ณตํด์ ๋งํ์ง๋ง, 99% ์ด์์ ๊ธ๋ก๋ฒ ๊ฐ๋ฐ ํ๋ก์ ํธ์์ Symbol.species์ ๊ดํ ์ด๋ฌํ ์์ค์ ๋ง์ดํฌ๋ก ์ต์ ํ๋ ์ค์ง์ ์ธ ๊ด์ฌ์ฌ๊ฐ ๋ ๊ฐ๋ฅ์ฑ์ด ๋งค์ฐ ๋ฎ์ต๋๋ค.
์์์ ์ผ๋ก Symbol.species๋ฅผ ์ฌ์ฉํ์ง ์๊ธฐ๋ก ์ ํํ ๋
๋ถ์ธํ ์ ์๋ ๊ฐ๋ ฅํจ๊ณผ ์ ์ฉ์ฑ์๋ ๋ถ๊ตฌํ๊ณ , Symbol.species๋ ์์๊ณผ ๊ด๋ จ๋ ๋ชจ๋ ๋ฌธ์ ์ ๋ํ ๋ง๋ณํต์น์ฝ์ด ์๋๋๋ค. ์๋์ ์ผ๋ก ์ฌ์ฉํ์ง ์๊ฑฐ๋, ๋ช ์์ ์ผ๋ก ๊ธฐ๋ณธ ํด๋์ค๋ฅผ ๋ฐํํ๋๋ก ๊ตฌ์ฑํ๋ ๊ฒ์ด ๊ฐ์ฅ ์ ์ ํ ์ค๊ณ ๊ฒฐ์ ์ธ ํฉ๋ฒ์ ์ด๊ณ ํ๋นํ ์๋๋ฆฌ์ค๊ฐ ์์ต๋๋ค:
- ๊ธฐ๋ณธ ํด๋์ค ๋์์ด ์ ํํ ํ์ํ ๊ฒฝ์ฐ: ์ค๊ณ ์๋๊ฐ ํ์ ํด๋์ค์ ๋ฉ์๋๊ฐ ๋ช ์์ ์ผ๋ก ๊ธฐ๋ณธ ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ๋ฐํํ๋ ๊ฒ์ด๋ผ๋ฉด, Symbol.species๋ฅผ ์์ ํ ์๋ตํ๊ฑฐ๋(๊ธฐ๋ณธ ๋์์ ์์กด) ๋ช ์์ ์ผ๋ก ๊ธฐ๋ณธ ํด๋์ค ์์ฑ์(์: return Array;)๋ฅผ ๋ฐํํ๋ ๊ฒ์ด ์ฌ๋ฐ๋ฅด๊ณ ๊ฐ์ฅ ํฌ๋ช ํ ์ ๊ทผ ๋ฐฉ์์ ๋๋ค. ์๋ฅผ ๋ค์ด, "TransientArrayWrapper"๋ ์ด๊ธฐ ์ฒ๋ฆฌ ํ ๋ํผ๋ฅผ ๋ฒ๊ณ ํ์ค Array๋ฅผ ๋ฐํํ์ฌ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์ค์ด๊ฑฐ๋ ๋ค์ด์คํธ๋ฆผ ์๋น์๋ฅผ ์ํ API ํ๋ฉด์ ๋จ์ํํ๋๋ก ์ค๊ณ๋ ์ ์์ต๋๋ค.
- ์ต์์ฃผ์์ ์ด๊ฑฐ๋ ์์ํ๊ฒ ํ๋์ ์ธ ํ์ฅ์ ์ํด: ํ์ ํด๋์ค๊ฐ ์ฃผ๋ก ์ธ์คํด์ค๋ฅผ ์์ฑํ์ง ์๋ ๋ช ๊ฐ์ง ๋ฉ์๋๋ง ์ถ๊ฐํ๋ ๋งค์ฐ ๊ฐ๋ฒผ์ด ๋ํผ์ธ ๊ฒฝ์ฐ(์: Error๋ฅผ ํ์ฅํ์ง๋ง ๋ด๋ถ ์ค๋ฅ ์ฒ๋ฆฌ ์ค์ stack์ด๋ message ์์ฑ์ด ์๋ก์ด ์ปค์คํ ์ค๋ฅ ํ์ ์ ์ฌํ ๋น๋ ๊ฒ์ผ๋ก ๊ธฐ๋ํ์ง ์๋ ๋ก๊น ์ ํธ๋ฆฌํฐ ํด๋์ค), Symbol.species์ ์ถ๊ฐ์ ์ธ ์์ฉ๊ตฌ ์ฝ๋๋ ๋ถํ์ํ ์ ์์ต๋๋ค.
- ์์๋ณด๋ค ํฉ์ฑ์ด ๋ ์ ํฉํ ํจํด์ผ ๋: ์ปค์คํ ํด๋์ค๊ฐ ๊ธฐ๋ณธ ํด๋์ค์ ๊ฐ๋ ฅํ "is-a" ๊ด๊ณ๋ฅผ ์ง์ ์ผ๋ก ๋ํ๋ด์ง ์๊ฑฐ๋, ์ฌ๋ฌ ์์ค์์ ๊ธฐ๋ฅ์ ์ง๊ณํ๋ ๊ฒฝ์ฐ, ์์๋ณด๋ค ํฉ์ฑ(ํ ๊ฐ์ฒด๊ฐ ๋ค๋ฅธ ๊ฐ์ฒด์ ๋ํ ์ฐธ์กฐ๋ฅผ ๋ณด์ )์ด ์ข ์ข ๋ ์ ์ฐํ๊ณ ์ ์ง๋ณด์ํ๊ธฐ ์ฌ์ด ์ค๊ณ ์ ํ์์ด ์ ์ฆ๋ฉ๋๋ค. ์ด๋ฌํ ํฉ์ฑ ํจํด์์๋ Symbol.species์ ์ํด ์ ์ด๋๋ "์ข "์ ๊ฐ๋ ์ด ์ผ๋ฐ์ ์ผ๋ก ์ ์ฉ๋์ง ์์ต๋๋ค.
Symbol.species๋ฅผ ์ฌ์ฉํ๋ ๊ฒฐ์ ์ ํญ์ ์์์ ์ด๊ณ , ์ ์๊ณ ๋ ์ํคํ ์ฒ์ ์ ํ์ด์ด์ผ ํ๋ฉฐ, ํนํ ๋ณต์กํ ์์คํ ์ด๋ ๋ค์ํ ๊ธ๋ก๋ฒ ํ์ด ์๋นํ๋ ๊ณต์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋งฅ๋ฝ์์ ๋ด์ฅ ์ฐ์ฐ ์ค ์ ๋ฐํ ํ์ ๋ณด์กด์ ๋ํ ๋ช ํํ ํ์์ ์ํด ์ฃผ๋๋์ด์ผ ํฉ๋๋ค. ๊ถ๊ทน์ ์ผ๋ก, ์ด๋ ์ ์ธ๊ณ ๊ฐ๋ฐ์์ ์์คํ ์ ์ํด ์ฝ๋์ ๋์์ ๋ช ์์ ์ด๊ณ , ์์ธก ๊ฐ๋ฅํ๋ฉฐ, ํ๋ ฅ์ ์ผ๋ก ๋ง๋๋ ๊ฒ์ ๊ดํ ๊ฒ์ ๋๋ค.
๊ธ๋ก๋ฒ ์ํฅ๊ณผ ์ฐ๊ฒฐ๋ ์ธ์์ ์ํ ๋ชจ๋ฒ ์ฌ๋ก
Symbol.species๋ฅผ ์ ์คํ๊ฒ ๊ตฌํํ๋ ๊ฒ์ ์ํฅ์ ๊ฐ๋ณ ์ฝ๋ ํ์ผ๊ณผ ๋ก์ปฌ ๊ฐ๋ฐ ํ๊ฒฝ์ ํจ์ฌ ๋ฐ์ด๋์ต๋๋ค. ์ด๋ ํ ํ์ , ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค๊ณ, ๊ทธ๋ฆฌ๊ณ ๊ธ๋ก๋ฒ ์ํํธ์จ์ด ์ํ๊ณ์ ์ ๋ฐ์ ์ธ ๊ฑด์ ์ฑ๊ณผ ์์ธก ๊ฐ๋ฅ์ฑ์ ๊น์ ์ํฅ์ ๋ฏธ์นฉ๋๋ค.
์ ์ง๋ณด์์ฑ ์ฆ์ง ๋ฐ ๊ฐ๋ ์ฑ ํฅ์
๊ธฐ์ฌ์๊ฐ ์ฌ๋ฌ ๋๋ฅ๊ณผ ๋ฌธํ์ ๋งฅ๋ฝ์ ๊ฑธ์ณ ์์ ์ ์๋ ๋ถ์ฐ ๊ฐ๋ฐ ํ์๊ฒ ์ฝ๋์ ๋ช ํ์ฑ๊ณผ ๋ชจํธํ์ง ์์ ์๋๋ ๊ฐ์ฅ ์ค์ํฉ๋๋ค. ํด๋์ค์ ์ข ์์ฑ์๋ฅผ ๋ช ์์ ์ผ๋ก ์ ์ํ๋ ๊ฒ์ ์ฆ์ ์์๋๋ ๋์์ ์ ๋ฌํฉ๋๋ค. ๋ฒ ๋ฅผ๋ฆฐ์ ๊ฐ๋ฐ์๊ฐ ๋ฐฉ๊ฐ๋ก๋ฅด์์ ์์ฑ๋ ์ฝ๋๋ฅผ ๊ฒํ ํ ๋, CancellablePromise์ then() ๋ฉ์๋๋ฅผ ์ ์ฉํ๋ฉด ๊ณ ์ ํ ์ทจ์ ๊ธฐ๋ฅ์ ๋ณด์กดํ๋ฉด์ ์ผ๊ด๋๊ฒ ๋ ๋ค๋ฅธ CancellablePromise๋ฅผ ์์ฑํ ๊ฒ์ด๋ผ๊ณ ์ง๊ด์ ์ผ๋ก ์ดํดํ ๊ฒ์ ๋๋ค. ์ด๋ฌํ ํฌ๋ช ์ฑ์ ์ธ์ง ๋ถํ๋ฅผ ๋ํญ ์ค์ด๊ณ , ๋ชจํธ์ฑ์ ์ต์ํํ๋ฉฐ, ๊ฐ๋ฐ์๊ฐ ๋ ์ด์ ํ์ค ๋ฉ์๋๊ฐ ๋ฐํํ๋ ๊ฐ์ฒด์ ์ ํํ ํ์ ์ ์ถ์ธกํ ํ์๊ฐ ์์ผ๋ฏ๋ก ๋๋ฒ๊น ๋ ธ๋ ฅ์ ์๋นํ ๊ฐ์ํํ์ฌ, ๋ ํจ์จ์ ์ด๊ณ ์ค๋ฅ๊ฐ ์ ์ ํ์ ํ๊ฒฝ์ ์กฐ์ฑํฉ๋๋ค.
์์คํ ๊ฐ ์ํํ ์ํธ ์ด์ฉ์ฑ ๋ณด์ฅ
์ค๋๋ ์ํธ ์ฐ๊ฒฐ๋ ์ธ์์์ ์ํํธ์จ์ด ์์คํ ์ด ์ ์ ๋ ์คํ ์์ค ๊ตฌ์ฑ ์์, ๋ ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ, ๊ทธ๋ฆฌ๊ณ ๋ ๋ฆฝ์ ์ธ ํ์ด ๊ฐ๋ฐํ ๋ง์ดํฌ๋ก์๋น์ค์ ๋ชจ์์ดํฌ๋ก ๊ตฌ์ฑ๋จ์ ๋ฐ๋ผ, ์ํํ ์ํธ ์ด์ฉ์ฑ์ ํํํ ์ ์๋ ์๊ตฌ ์ฌํญ์ ๋๋ค. Symbol.species๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ๊ตฌํํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํ๋ ์์ํฌ๋ ๋ค๋ฅธ ๊ฐ๋ฐ์์ ์ํด ํ์ฅ๋๊ฑฐ๋ ๋ ํฐ ๋ณต์กํ ์์คํ ์ ํตํฉ๋ ๋ ์์ธก ๊ฐ๋ฅํ๊ณ ์ผ๊ด๋ ๋์์ ๋ณด์ฌ์ค๋๋ค. ๊ณตํต ๊ณ์ฝ์ ๋ํ ์ด๋ฌํ ์ค์๋ ๊ตฌ์ฑ ์์๊ฐ ์์์น ๋ชปํ ํ์ ๋ถ์ผ์น์ ๋ถ๋ชํ์ง ์๊ณ ์์ ์ ์ผ๋ก ์ํธ ์์ฉํ ์ ์๋ ๋ ๊ฑด๊ฐํ๊ณ ๊ฒฌ๊ณ ํ ์ํํธ์จ์ด ์ํ๊ณ๋ฅผ ์กฐ์ฑํฉ๋๋ค. ์ด๋ ๋ค๊ตญ์ ์กฐ์ง์ด ๊ตฌ์ถํ ๊ธฐ์ ์์ค ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ ์ฑ๊ณผ ํ์ฅ์ฑ์ ์ค์ํ ์์์ ๋๋ค.
ํ์คํ ๋ฐ ์์ธก ๊ฐ๋ฅํ ๋์ ์ด์ง
Symbol.species์ ๊ฐ์ ์ ์๋ ค์ง ์ฌ๋ณผ์ ์ ๋ต์ ์ฌ์ฉ๊ณผ ๊ฐ์ ์ ํ๋ฆฝ๋ ECMAScript ํ์ค์ ์ค์ํ๋ ๊ฒ์ JavaScript ์ฝ๋์ ์ ๋ฐ์ ์ธ ์์ธก ๊ฐ๋ฅ์ฑ๊ณผ ๊ฒฌ๊ณ ์ฑ์ ์ง์ ์ ์ผ๋ก ๊ธฐ์ฌํฉ๋๋ค. ์ ์ธ๊ณ ๊ฐ๋ฐ์๋ค์ด ์ด๋ฌํ ํ์ค ๋ฉ์ปค๋์ฆ์ ๋ฅ์ํด์ง๋ฉด, ๊ทธ๋ค์ ๋ค์ํ ํ๋ก์ ํธ, ์ปจํ ์คํธ ๋ฐ ์กฐ์ง์ ๊ฑธ์ณ ์์ ์ ์ง์๊ณผ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ์์ ์๊ฒ ์ ์ฉํ ์ ์์ต๋๋ค. ์ด๋ฌํ ํ์คํ๋ ๋ถ์ฐ ํ๋ก์ ํธ์ ํฉ๋ฅํ๋ ์๋ก์ด ํ์์ ํ์ต ๊ณก์ ์ ํฌ๊ฒ ์ค์ด๊ณ ๊ณ ๊ธ ์ธ์ด ๊ธฐ๋ฅ์ ๋ํ ๋ณดํธ์ ์ธ ์ดํด๋ฅผ ๋ฐฐ์ํ์ฌ, ๋ ์ผ๊ด๋๊ณ ๊ณ ํ์ง์ ์ฝ๋ ๊ฒฐ๊ณผ๋ฌผ์ ๋ณ์ต๋๋ค.
ํฌ๊ด์ ์ธ ๋ฌธ์ํ์ ์ค์ํ ์ญํ
ํด๋์ค์ Symbol.species๊ฐ ํฌํจ๋์ด ์๋ค๋ฉด, ์ด๋ฅผ ๋์ ๋๊ฒ ์ฒ ์ ํ ๋ฌธ์ํํ๋ ๊ฒ์ด ์ ๋์ ์ธ ๋ชจ๋ฒ ์ฌ๋ก์ ๋๋ค. ๋ด์ฅ ๋ฉ์๋๊ฐ ์ด๋ค ์์ฑ์๋ฅผ ๋ฐํํ๋์ง ๋ช ํํ๊ฒ ์ค๋ช ํ๊ณ , ๊ฒฐ์ ์ ์ผ๋ก ๊ทธ ์ค๊ณ ์ ํ์ ๊ทผ๊ฑฐ๋ฅผ ์ค๋ช ํ์ญ์์ค. ์ด๋ ์ฝ๋๊ฐ ๋ค์ํ๊ณ ๊ตญ์ ์ ์ธ ๊ฐ๋ฐ์ ๊ธฐ๋ฐ์ ์ํด ์๋น๋๊ณ ํ์ฅ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ ์์๊ฒ ํนํ ์ค์ํฉ๋๋ค. ๋ช ํํ๊ณ , ๊ฐ๊ฒฐํ๋ฉฐ, ์ ๊ทผํ๊ธฐ ์ฌ์ด ๋ฌธ์๋ ์๋ง์ ์๊ฐ์ ๋๋ฒ๊น , ์ข์ ๋ฐ ์คํด๋ฅผ ์ฌ์ ์ ๋ฐฉ์งํ ์ ์์ผ๋ฉฐ, ์ฝ๋์ ์๋์ ๋ํ ๋ณดํธ์ ์ธ ๋ฒ์ญ๊ธฐ ์ญํ ์ ํฉ๋๋ค.
์๊ฒฉํ๊ณ ์๋ํ๋ ํ ์คํธ
ํ์ ํด๋์ค๊ฐ ๋ด์ฅ ๋ฉ์๋์ ์ํธ ์์ฉํ ๋์ ๋์์ ๊ตฌ์ฒด์ ์ผ๋ก ๋ชฉํ๋ก ํ๋ ํฌ๊ด์ ์ธ ๋จ์ ๋ฐ ํตํฉ ํ ์คํธ๋ฅผ ์์ฑํ๋ ๊ฒ์ ํญ์ ์ฐ์ ์ํ์ญ์์ค. ์ฌ๊ธฐ์๋ Symbol.species๊ฐ ์๋ ์๋๋ฆฌ์ค์ ์๋ ์๋๋ฆฌ์ค(๋ค๋ฅธ ๊ตฌ์ฑ์ด ์ง์๋๊ฑฐ๋ ์ํ๋ ๊ฒฝ์ฐ)์ ๋ํ ํ ์คํธ๊ฐ ํฌํจ๋์ด์ผ ํฉ๋๋ค. ๋ฐํ๋ ๊ฐ์ฒด๊ฐ ์ผ๊ด๋๊ฒ ์์๋ ํ์ ์ด๋ฉฐ ํ์ํ ๋ชจ๋ ์ปค์คํ ์์ฑ, ๋ฉ์๋ ๋ฐ ๋์์ ์ ์งํ๋์ง ๊ผผ๊ผผํ๊ฒ ํ์ธํ์ญ์์ค. ๊ฒฌ๊ณ ํ๊ณ ์๋ํ๋ ํ ์คํธ ํ๋ ์์ํฌ๋ ์ฌ๊ธฐ์ ํ์์ ์ด๋ฉฐ, ์ง๋ฆฌ์ ์ถ์ฒ์ ๊ด๊ณ์์ด ๋ชจ๋ ๊ฐ๋ฐ ํ๊ฒฝ๊ณผ ๊ธฐ์ฌ์ ๊ฑธ์ณ ์ฝ๋ ํ์ง๊ณผ ์ ํ์ฑ์ ๋ณด์ฅํ๋ ์ผ๊ด๋๊ณ ๋ฐ๋ณต ๊ฐ๋ฅํ ๊ฒ์ฆ ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํฉ๋๋ค.
๊ธ๋ก๋ฒ ๊ฐ๋ฐ์๋ฅผ ์ํ ์คํ ๊ฐ๋ฅํ ํต์ฐฐ๋ ฅ ๋ฐ ํต์ฌ ์์
JavaScript ํ๋ก์ ํธ์์ Symbol.species์ ํ์ ํจ๊ณผ์ ์ผ๋ก ํ์ฉํ๊ณ ์ ์ธ๊ณ์ ์ผ๋ก ๊ฒฌ๊ณ ํ ์ฝ๋๋ฒ ์ด์ค์ ๊ธฐ์ฌํ๋ ค๋ฉด ๋ค์ ์คํ ๊ฐ๋ฅํ ํต์ฐฐ๋ ฅ์ ๋ด๋ฉดํํ์ญ์์ค:
- ํ์ ์ผ๊ด์ฑ ์นํธ: ๋ด์ฅ ํด๋์ค๋ฅผ ํ์ฅํ๊ณ ๊ทธ ๋ด์ฅ ๋ฉ์๋๊ฐ ํ์ ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ์ถฉ์คํ ๋ฐํํ ๊ฒ์ผ๋ก ๊ธฐ๋ํ ๋๋ง๋ค Symbol.species๋ฅผ ํ์ฉํ๋ ๊ฒ์ ๊ธฐ๋ณธ ๊ดํ์ผ๋ก ์ผ์ผ์ญ์์ค. ์ด๋ ์ ์ฒด ์ ํ๋ฆฌ์ผ์ด์ ์ํคํ ์ฒ ์ ๋ฐ์ ๊ฑธ์ณ ๊ฐ๋ ฅํ ํ์ ์ผ๊ด์ฑ์ ๋ณด์ฅํ๋ ์ด์์ ๋๋ค.
- ์ํฅ๋ฐ๋ ๋ฉ์๋ ๋ง์คํฐํ๊ธฐ: ๋ค์ํ ๋ค์ดํฐ๋ธ ํ์ ์ ๊ฑธ์ณ Symbol.species๋ฅผ ์ ๊ทน์ ์ผ๋ก ์กด์คํ๊ณ ํ์ฉํ๋ ํน์ ๋ด์ฅ ๋ฉ์๋ ๋ชฉ๋ก(์: Array.prototype.map, Promise.prototype.then, RegExp.prototype.exec)์ ์ต์ํด์ง๋ ๋ฐ ์๊ฐ์ ํฌ์ํ์ญ์์ค.
- ์ ์คํ ์์ฑ์ ์ ํ ์ฐ์ต: [Symbol.species] getter์์ this๋ฅผ ๋ฐํํ๋ ๊ฒ์ด ๊ฐ์ฅ ์ผ๋ฐ์ ์ด๊ณ ์ข ์ข ์ฌ๋ฐ๋ฅธ ์ ํ์ด์ง๋ง, ๊ณ ๊ธ์ ํนํ๋ ์ค๊ณ ์๊ตฌ ์ฌํญ์ ์ํด ์๋์ ์ผ๋ก ๊ธฐ๋ณธ ํด๋์ค ์์ฑ์๋ ์์ ํ ๋ค๋ฅธ ์์ฑ์๋ฅผ ๋ฐํํ๋ ๊ฒ์ ์ํฅ๊ณผ ํน์ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ์ฒ ์ ํ ์ดํดํ์ญ์์ค.
- ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ฒฌ๊ณ ์ฑ ํฅ์: ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํ๋ ์์ํฌ๋ฅผ ๊ตฌ์ถํ๋ ๊ฐ๋ฐ์์๊ฒ Symbol.species๋ ๊ฒฌ๊ณ ํ๊ณ ๊ณ ๋๋ก ํ์ฅ ๊ฐ๋ฅํ ๋ฟ๋ง ์๋๋ผ ๊ธ๋ก๋ฒ ๊ฐ๋ฐ์ ์ปค๋ฎค๋ํฐ์ ์์ธก ๊ฐ๋ฅํ๊ณ ์ ๋ขฐํ ์ ์๋ ๊ตฌ์ฑ ์์๋ฅผ ์ ๊ณตํ๊ธฐ ์ํ ์ค์ํ๊ณ ๊ณ ๊ธ ๋๊ตฌ์์ ์ธ์ํ์ญ์์ค.
- ๋ฌธ์ํ ๋ฐ ์๊ฒฉํ ํ ์คํธ ์ฐ์ ์์ ์ง์ : ์ปค์คํ ํด๋์ค์ ์ข ๋์์ ๊ดํด ํญ์ ์์ ์ฒ๋ผ ๋ช ํํ ๋ฌธ์๋ฅผ ์ ๊ณตํ์ญ์์ค. ๊ฒฐ์ ์ ์ผ๋ก, ๋ด์ฅ ๋ฉ์๋๊ฐ ๋ฐํํ๋ ๊ฐ์ฒด๊ฐ ์ผ๊ด๋๊ฒ ์ฌ๋ฐ๋ฅธ ํ์ ์ด๋ฉฐ ์์๋๋ ๋ชจ๋ ๊ธฐ๋ฅ์ ์ ์งํ๋์ง ๊ฒ์ฆํ๊ธฐ ์ํด ํฌ๊ด์ ์ธ ๋จ์ ๋ฐ ํตํฉ ํ ์คํธ๋ก ์ด๋ฅผ ๋ท๋ฐ์นจํ์ญ์์ค.
Symbol.species๋ฅผ ์ผ์์ ์ธ ๊ฐ๋ฐ ๋๊ตฌ ํคํธ์ ์ ์คํ๊ฒ ํตํฉํจ์ผ๋ก์จ, ๋น์ ์ ๊ทผ๋ณธ์ ์ผ๋ก JavaScript ์ ํ๋ฆฌ์ผ์ด์ ์ ๋นํ ๋ฐ ์๋ ์ ์ด, ํฅ์๋ ์์ธก ๊ฐ๋ฅ์ฑ ๋ฐ ์ฐ์ํ ์ ์ง๋ณด์์ฑ์ ๋ถ์ฌํฉ๋๋ค. ์ด๋ ๊ฒฐ๊ตญ ๋ชจ๋ ์ง๋ฆฌ์ ๊ฒฝ๊ณ๋ฅผ ๋์ด ์ํํ๊ฒ ์์ ํ๋ ํ์ ์ํ ๋ ํ๋ ฅ์ ์ด๊ณ , ํจ์จ์ ์ด๋ฉฐ, ์ ๋ขฐํ ์ ์๋ ๊ฐ๋ฐ ๊ฒฝํ์ ์กฐ์ฑํฉ๋๋ค.
๊ฒฐ๋ก : JavaScript์ ์ข ์ฌ๋ณผ์ ์ง์์ ์ธ ์ค์์ฑ
Symbol.species๋ ํ๋ JavaScript์ ์ ๊ตํจ, ๊น์ด ๋ฐ ๋ด์ฌ๋ ์ ์ฐ์ฑ์ ๋ํ ์ฌ์คํ ์ฆ๊ฑฐ๋ก ์ ์์ต๋๋ค. ์ด๋ ๊ฐ๋ฐ์์๊ฒ ๋ด์ฅ ๋ฉ์๋๊ฐ ํ์ ํด๋์ค์์ ์ ์ธ์คํด์ค๋ฅผ ์์ฑํ ๋ ์ฌ์ฉํ ์ ํํ ์์ฑ์ ํจ์๋ฅผ ์ ์ดํ ์ ์๋ ์ ๋ฐํ๊ณ , ๋ช ์์ ์ด๋ฉฐ, ๊ฐ๋ ฅํ ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํฉ๋๋ค. ์ด ๊ธฐ๋ฅ์ ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ๋ด์ฌ๋ ์ค์ํ๊ณ ์ข ์ข ๋ฏธ๋ฌํ ๋์ , ์ฆ ํ์ ํ์ ์ด ๋ค์ํ ์์ ์ ํตํด ์ผ๊ด๋๊ฒ ์์ ์ "์ข "์ ์ ์งํ์ฌ ์ปค์คํ ๊ธฐ๋ฅ์ ๋ณด์กดํ๊ณ , ๊ฐ๋ ฅํ ํ์ ๋ฌด๊ฒฐ์ฑ์ ๋ณด์ฅํ๋ฉฐ, ์์์น ๋ชปํ ํ๋ ํธ์ฐจ๋ฅผ ๋ฐฉ์งํ๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํฉ๋๋ค.
๊ตญ์ ๊ฐ๋ฐํ, ์ ์ธ๊ณ์ ์ผ๋ก ๋ถ์ฐ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๋ ์ํคํ ํธ, ๊ทธ๋ฆฌ๊ณ ๋๋ฆฌ ์๋น๋๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ ์์๊ฒ Symbol.species๊ฐ ์ ๊ณตํ๋ ์์ธก ๊ฐ๋ฅ์ฑ, ์ผ๊ด์ฑ ๋ฐ ๋ช ์์ ์ ์ด๋ ๊ทธ์ผ๋ง๋ก ๊ท์คํฉ๋๋ค. ์ด๋ ๋ณต์กํ ์์ ๊ณ์ธต์ ๊ด๋ฆฌ๋ฅผ ๊ทน์ ์ผ๋ก ๋จ์ํํ๊ณ , ์ฐพ๊ธฐ ํ๋ ํ์ ๊ด๋ จ ๋ฒ๊ทธ์ ์ํ์ ํฌ๊ฒ ์ค์ด๋ฉฐ, ๊ถ๊ทน์ ์ผ๋ก ์ง๋ฆฌ์ ๋ฐ ์กฐ์ง์ ๊ฒฝ๊ณ๋ฅผ ๋๋๋๋ ๋๊ท๋ชจ ์ฝ๋๋ฒ ์ด์ค์ ์ ๋ฐ์ ์ธ ์ ์ง๋ณด์์ฑ, ํ์ฅ์ฑ ๋ฐ ์ํธ ์ด์ฉ์ฑ์ ํฅ์์ํต๋๋ค. ์ด ๊ฐ๋ ฅํ ECMAScript ๊ธฐ๋ฅ์ ์ ์คํ๊ฒ ์์ฉํ๊ณ ํตํฉํจ์ผ๋ก์จ, ๋น์ ์ ๋จ์ง ๋ ๊ฒฌ๊ณ ํ๊ณ ํ๋ ฅ์ ์ธ JavaScript๋ฅผ ์์ฑํ๋ ๊ฒ์ด ์๋๋ผ, ๋ชจ๋ ์ฌ๋, ๋ชจ๋ ๊ณณ์ ์ํ ๋ ์์ธก ๊ฐ๋ฅํ๊ณ , ํ๋ ฅ์ ์ด๋ฉฐ, ์ ์ธ๊ณ์ ์ผ๋ก ์กฐํ๋ก์ด ์ํํธ์จ์ด ๊ฐ๋ฐ ์ํ๊ณ์ ๊ตฌ์ถ์ ์ ๊ทน์ ์ผ๋ก ๊ธฐ์ฌํ๋ ๊ฒ์ ๋๋ค.
ํ์ฌ ๋๋ ๋ค์ ํ๋ก์ ํธ์์ Symbol.species๋ฅผ ์คํํด ๋ณด์๊ธฐ๋ฅผ ์ง์ฌ์ผ๋ก ๊ถ์ฅํฉ๋๋ค. ์ด ์ฌ๋ณผ์ด ์ด๋ป๊ฒ ํด๋์ค ๋์์ธ์ ๋ณํ์ํค๊ณ , ๋ ์ ๊ตํ๊ณ , ์ ๋ขฐํ ์ ์์ผ๋ฉฐ, ์ ์ธ๊ณ์ ์ผ๋ก ์ค๋น๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ ์ ์๋๋ก ํ์ ์ค์ด์ฃผ๋์ง ์ง์ ๊ด์ฐฐํด ๋ณด์ญ์์ค. ์๊ฐ๋๋ ์์น์ ๊ด๊ณ์์ด ์ฆ๊ฑฐ์ด ์ฝ๋ฉ ๋์ธ์!