-
์์ ๋ณต์ฌ, ๋ฆฌ์กํธ์์ ์์ฃผ ์ฌ์ฉํ๊ณ ์๋ค๊ณ ?์นดํ ๊ณ ๋ฆฌ ์์ 2023. 2. 10. 19:47
TLDR;
๋ฆฌ์กํธ์์๋ ์ฑ๋ฅ์ ์ํด ์์ ๋น๊ต๋ฅผ ํตํด state์ ๋ณ๊ฒฝ์ ๊ฐ์งํ๋ค.
๊ธฐ๋ณธํ ๋ฐ์ดํฐ๋ ๊ธฐ์กด ๊ฐ ๋ณ๊ฒฝ์ ๊ฐ ์์ฒด๊ฐ ๋ณ๊ฒฝ๋์ด ๋ฆฌ์กํธ๊ฐ ์ ์์ ์ผ๋ก ๋น๊ต๋ฅผ ์ํํ์ฌ ๊ฐ์ ์ ๋ฐ์ดํธ ํ ์ ์์ง๋ง, ์ฐธ์กฐํ ๋ฐ์ดํฐ์ ๊ฒฝ์ฐ์๋ ๊ธฐ์กด ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ๋ค๊ณ ํ์ฌ๋, ์ฐธ์กฐ๊ฐ์ ๋์ผํ๊ธฐ์ ๋ฆฌ์กํธ๊ฐ state ๋ณ๊ฒฝ์ ๊ฐ์งํ ์ ์๋ค. ๋ฐ๋ผ์ ์ฐธ์กฐํ ๋ฐ์ดํฐ๋ Spread Operator ํน์ Object.assign์ ์ด์ฉํ์ฌ ์์ ๋ณต์ฌ๋ฅผ ์ํํจ์ผ๋ก์ ์ฐธ์กฐ๊ฐ์ ๋ณ๊ฒฝ์์ผ์ค์ผ ํ๋๋ฐ, ์ค์ฒฉ ๊ฐ์ฒด์ ๊ฒฝ์ฐ ์ค์ฒฉ๋ ๊ฐ์ ์ฐธ์กฐ๊ฐ์ด ๋์ด์ง์ง ์๊ณ ์ฌ๋ณธ ๋ณ๊ฒฝ์ ์๋ณธ์ ๊ฐ์ด ๋ณ๊ฒฝํ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์, ๋ณ๊ฐ์ ๊ฐ์ฒด๋ก ๋ณด๊ณ ๋ง์ฐฌ๊ฐ์ง๋ก ์๋ก์ด ์ฐธ์กฐ๊ฐ์ ๊ฐ๋๋ก ์ค์ฒฉ๋ ๊ฐ์ฒด ๋ด๋ถ์์ ํ๋ฒ ๋ ์์ ๋ณต์ฌ๋ฅผ ์ค์ํด ์ค์ผ ํ๋ค.
์ด ์ธ์๋ ๋ฆฌ์กํธ๊ฐ ์ ๊ณตํ๋ React.memo์์ ๋ํดํธ๋ก ์์ ๋น๊ต๊ฐ ์ฌ์ฉ๋๋๋ฐ, ์ฐธ์กฐํ ๋ฐ์ดํฐ๋ฅผ props๋ก ์ ๋ฌํ ๋์๋ ๋์ผํ ์ฐธ์กฐ๊ฐ์ ์ ์งํ์ฌ React.memo๋ฅผ ์ฌ์ฉ ์๋์ ๋ง๊ฒ ๋์ํ๋๋ก useCallback์ ์ด์ฉํด ๋ฉ๋ชจ์ด์ ์ด์ ํด ์ค ์ ์๋ค.
์์ ๋ณต์ฌ์ ๊น์ ๋ณต์ฌ๊ฐ ๋ฌด์์ธ์ง๋ ์ด์ ์์์ผ๋, ๊ทธ๋์ ๋ฆฌ์กํธ์์ ์ด ๊ฐ๋ ์ด ์ด๋ป๊ฒ ์ฐ์ด๊ณ ์๋์ง ์์๋ณด๋๋ก ํ์.
์์ ๋น๊ต๋ฅผ ํตํด state ๋ณ๊ฒฝ์ ๊ฐ์งํ๋ ๋ฆฌ์กํธ
๋ฆฌ์กํธ์์ ์ผ๋ฐ์ ์ผ๋ก ๋ฆฌ๋ ๋๊ฐ ์ผ์ด๋๋ ์กฐ๊ฑด์, state๊ฐ ๋ณ๊ฒฝ๋์์ ๋, ์๋ก์ด props๊ฐ ์ ๋ฌ๋์์ ๋, ๊ทธ๋ฆฌ๊ณ ๋ถ๋ชจ ์ปดํฌ๋ํธ๊ฐ ๋ฆฌ๋ ๋๋ง ๋ ๋์ด๋ค. ๊ทธ๋ ๋ค๋ฉด ๋ฆฌ์กํธ๋ state๊ฐ ๋ณ๊ฒฝ๋์๋ค๋ ์ฌ์ค์ ์ด๋ป๊ฒ ์ ์ ์์๊น?
๋ฆฌ์กํธ ๊ณต์๋ฌธ์์ useState์ ๊ด๋ จ๋ ์ค๋ช ์ค ๋ค์๊ณผ ๊ฐ์ ์ค๋ช ์ด ๋์จ๋ค.
If the new value you provide is identical to the current state, as determined by an Object.is comparison, React will skip re-rendering the component and its children. This is an optimization. Although in some cases React may still need to call your component before skipping the children, it shouldn’t affect your code.
์ ๋ด์ฉ์์ ์ ์ ์๋ฏ์ด ๋ฆฌ์กํธ๋ state ๋ณ๊ฒฝ์ ๊ฐ์งํ ๋ Object.is๋ฅผ ์ฌ์ฉํ์ฌ shallow compare์ ํ๋ค. ๋ค์์ ๋ฆฌ์กํธ ๋ ํฌ์์ ๊ฐ์ ธ์จ shallowEqual.js ์ฝ๋์ด๋ค.
import is from './objectIs'; import hasOwnProperty from './hasOwnProperty'; /** * Performs equality by iterating through keys on an object and returning false * when any key has values which are not strictly equal between the arguments. * Returns true when the values of all keys are strictly equal. */ function shallowEqual(objA: mixed, objB: mixed): boolean { if (is(objA, objB)) { return true; } if ( typeof objA !== 'object' || objA === null || typeof objB !== 'object' || objB === null ) { return false; } const keysA = Object.keys(objA); const keysB = Object.keys(objB); if (keysA.length !== keysB.length) { return false; } // Test for A's keys different from B. for (let i = 0; i < keysA.length; i++) { const currentKey = keysA[i]; if ( !hasOwnProperty.call(objB, currentKey) || !is(objA[currentKey], objB[currentKey]) ) { return false; } } return true; } export default shallowEqual;
์ ์ฝ๋๋ฅผ ์ดํด๋ณด๋ฉด ๊ณต์๋ฌธ์์์ ์ค๋ช ํ ๋๋ก ๊ฐ์ฅ ์๋จ์์ Object.is๋ฅผ ์ฌ์ฉํ๊ณ ์๋ ๊ฒ์ ๋ณผ ์ ์๋ค. Object is๋ ๊ธฐ๋ณธํ๊ณผ ์ฐธ์กฐํ์์ ์ผ๋ฐ์ ์ผ๋ก ๋ค์๊ณผ ๊ฐ์ด ๋์ํ๋ค.
- ์ซ์, ๋ฌธ์์ด, Boolean๊ณผ ๊ฐ์ ์์ ์๋ฃํ์
๊ฐ์ ๋น๊ต
ํ๋ค. - ๋ฐฐ์ด, ๊ฐ์ฒด ๋ฑ ์ฐธ์กฐ ์๋ฃํ์ ๊ทธ ์์ ๊ฐ ํน์ attribute๋ฅผ ๋น๊ตํ์ง ์๊ณ , ๊ทธ๋ค์
๋ ํผ๋ฐ์ค(์ฐธ์กฐ๋๋ ์์น)
๋ฅผ ๋น๊ตํ๋ค.
๋ฆฌ์กํธ๊ฐ ๊น์ ๋น๊ต๋ฅผ ํ์ง ์๊ณ Object.is๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ์ ๋น๊ตํ๋ ์ด์ ๋ ๊ณต์๋ฌธ์์์ ์ค๋ช ํ ๊ฒ์ฒ๋ผ
์ต์ ํ
๋๋ฌธ์ด๋ค.๋ง์ฝ 5000๊ฐ์ ๊ฐ์ ๊ฐ์ง๊ณ ์๋ ๋ฐฐ์ด์ด ์๊ณ , ์ด ์ค 4998๋ฒ์งธ์ ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ์๋ค๊ณ ํด๋ณด์. ๋ณํ๋ฅผ ๊ฐ์งํ๋ ค๋ฉด ์ฒซ ๋ฒ์งธ ๋ฐ์ดํฐ๋ถํฐ 4998 ๋ฐ์ดํฐ๊น์ง ํ๋ํ๋ ๋น๊ต๋ฅผ ํด์ผํ ๊ฒ์ด๋ค. ์ด๋ ๊ฒ ๋๋ฉด ์ฑ๋ฅ์ด ๋งค์ฐ ๋จ์ด์ง๋ค. ๋ฐ๋ผ์ ๋ฆฌ์กํธ์์๋ ์์ ๋น๊ต๋ฅผ ํตํด ์ฐธ์กฐ๊ฐ์ด ๋ณ๊ฒฝ๋์๋ค๋ฉด ์์ ์๋ ๊ฐ์ด ๋ณ๊ฒฝ๋์๋ค๊ณ ์ธ์งํ๋๋ก ํ ๊ฒ์ด๋ค.
๋ฆฌ์กํธ์์์ ๋ถ๋ณ์ฑ? state ๊ฐ์๋ผ์ฐ๊ธฐ๋ก ์ดํดํด์ผ ํ๋ค.
์์์ ์ดํด๋ดค๋ฏ์ด, ์์ ๋น๊ต๋ฅผ ํตํด state ๋ณ๊ฒฝ์ ๊ฐ์งํ๊ธฐ ๋๋ฌธ์ ๋ฆฌ์กํธ์์๋ ํนํ ๋ฐฐ์ด๊ณผ ๊ฐ์ฒด๋ฅผ ๋ณ๊ฒฝํ ๋์๋ ์ฐธ์กฐ๊ฐ์ ์์ ๋ณ๊ฒฝํ์ฌ ์๋ก์ด ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด์ผ ํ๋ฉฐ, ๊ธฐ์กด์ ๊ฐ์ฒด๋ ๋ถ๋ณ์ฑ์ ์ ์งํด์ผ ํ๋ค๊ณ ๊ณต์๋ฌธ์์์ ์ฌ๋ฌ๋ฒ ๊ฐ์กฐํด์ ์๋ ค์ฃผ๊ณ ์๋ค.
๊ธฐ์กด ๊ฐ์ฒด์ ๋ถ๋ณ์ฑ์ ์ ์งํด์ผ ํ๋ค๋ ๋ง์ด ๋ค์ ์ดํดํ๊ธฐ ์ด๋ ค์ ๋๋ฐ, ์์ด๋ก ๋ณด๋ฉด ํจ์ฌ ์ดํดํ๊ธฐ ์ฝ๋ค.In React, state is considered read-only, so you should replace it rather than mutate your existing objects.
๊ธฐ์กด์ ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ๋ค๊ณ ์๊ฐํ๋ฉด ์๋๊ณ , ๊ธฐ์กด์ state๋ ๊ทธ๋๋ก ๋๋์ฑ,
์ฃผ์๊ฐ์ด ๋ค๋ฅธ ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด ๊ธฐ์กด์ state๋ฅผ ๊ฐ์๋ผ์ด๋ค
๋ผ๊ณ ์๊ฐํด์ผ ํ๋ค. ๊ทธ๋ฆฌ๊ณ ์ด ๋ ์์ ๋ณต์ฌ๋ฅผ ์ฌ์ฉํ๋ค!! ์ด ๋ด์ฉ์ ์ฝ๋๋ก ์ดํดํด ๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.// form์ด๋ผ๋ state๊ฐ ๊ธฐ์กด์ ์๋ค๊ณ ๊ฐ์ // ๐ฉ Don't mutate an object in state like this: form.firstName = 'Taylor'; // ์ด๋ฐ ์์ผ๋ก ์ ๋ฐ์ดํธ ํ๋ ๊ฒ์ด ์๋๋ผ // โ Replace state with a new object setForm({ ...form, // ์์ ์ฃผ์๊ฐ์ด ๋ค๋ฅธ ์๋ก์ด ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด, ๋ณ๊ฒฝํ๊ณ ์ ํ๋ ๊ฐ์ ๋ณ๊ฒฝํ์ฌ ๊ฐ์๋ผ์ด๋ค. firstName: 'Taylor' });
// ๋ฐฐ์ด๋ ๋ง์ฐฌ๊ฐ์ง์ด๋ค. setArtists( // Replace the state [ // with a new array ...artists, // that contains all the old items { id: nextId++, name: name } // and one new item at the end ] );
์ด๋ ๋ฏ ์๋ก์ด ์ฃผ์๊ฐ์ ๊ฐ์ง ๊ฐ์ฒด๋ ๋ฐฐ์ด์ ์ ๋ฌํ์ฌ ๋ฆฌ์กํธ์๊ฒ state ๋ณ๊ฒฝ์ ์๋ ค์ค๋ค! ๋ผ๊ณ ์๊ฐํ๋ ๊ฒ์ผ๋ก ์๊ฐ ์ ํ์ด ํ์ํ๋ค.
์ค์ฒฉ ๊ฐ์ฒด ๋ณ๊ฒฝ์์ ์ฃผ์ํ ์
์ค์ฒฉ๋ ๊ฐ์ฒด๋ ๋ฐฐ์ด์ Spread Operator ํน์ Object.assign์ ์ด์ฉํด์ ๋ณ๊ฒฝํ ๋ ์ฃผ์ํ ์ ์ด ์๋ค.
Spread Operator๋ ์ค์ฒฉ๊ฐ์ฒด์์ 1 depth๋ง ์ฃผ์๋ฅผ ๋ณ๊ฒฝํ์ฌ ๊ฐ์ ๋ณต์ฌํด์ค๋ค๋ ์ ์ ์๊ฐํด๋ณผ ๋, ์ค์ฒฉ๋ ๊ฐ์ฒด์ ๊ฐ์ ๋ณ๊ฒฝํด์ฃผ๊ณ ์ถ๋ค๋ฉด ์๋์ ๊ฐ์ด ์ค์ฒฉ๋์ด ์๋ ๊ฐ์ฒด์ ๊ฐ๋ ํ๋ฒ ๋ ๋ณต์ฌ๋ฅผ ํด์ค์ผ๋ง ์ ๋๋ก ๊ฐ์ด ๋ณ๊ฒฝ๋๋ค.
const [person, setPerson] = useState({ name: 'Niki de Saint Phalle', artwork: { title: 'Blue Nana', city: 'Hamburg', image: 'https://i.imgur.com/Sd1AgUOm.jpg', } }); // ์ ๊ฐ์ฒด์์ city๋ง ๋ณ๊ฒฝํด์ฃผ๊ณ ์ถ๋ค๊ณ ํ๋ค๋ฉด!! setPerson({ ...person, // person์ ๋ณต์ฌํด์ ์๋ก์ด ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด ์ค๋ค. artwork: { // ๊ทธ ์์ artwork๋ฅผ ๋ณ๊ฒฝํ ๊ฑด๋ฐ ...person.artwork, // person.artwork ๊ฐ์ฒด์ ๊ฐ์ ๋ณต์ฌํ ์๋ก์ด ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด์ฃผ๊ณ city: 'New Delhi' // city ํ๋กํผํฐ์ ๊ฐ์ ๋ฐ๊ฟ์ค๋ค. } });
๋ฐฐ์ด state ๋ณ๊ฒฝ ์ ์ฃผ์ํ ์
์ค์ฒฉ ๋ฐฐ์ด๋ก ๋ state๋ฅผ ๋ณ๊ฒฝํ ๋๋ ์ค์ฒฉ ๊ฐ์ฒด์ ๋ง์ฐฌ๊ฐ์ง๋ก ์์ ์๋ ๊ฐ๊น์ง ํ๋ฒ ๋ ์์ ๋ณต์ฌ๋ฅผ ์ค์ํด ์ฐธ์กฐ๊ฐ์ ์์ ํ ๋์ด์ค์ผ ํ๋ค.
๋ํ ๋ฐฐ์ด state ๋ณ๊ฒฝ์์ ์ถ๊ฐ๋ก ์ฃผ์ํด์ผ ํ ์ ๋ค์ด ์๋๋ฐ, ์๋ง ๋ฆฌ์กํธ์์ ๋ฐฐ์ด state๋ฅผ ๋ณ๊ฒฝํ๋ค๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ์ ํ์์ ๊ฒช์๋ ์ ์ด ์ ์ด๋ ํ๋ ๋ฒ์ ์์ ๊ฒ์ด๋ค.
- react์์ push๋ pop ๋ฑ์ผ๋ก state๋ณ๊ฒฝ์ ํด์ค๋ค๋ฉด ๋ฆฌ๋ ๋๋ง์ด ์ผ์ด๋์ง ์๋๋ค.
- sortํจ์๋ฅผ ๊ทธ๋๋ก ์ ์ฉํ๋ ค๊ณ ํ๋ค๋ฉด ์๋ณธ์ ๋ณ๊ฒฝํ ์ ์๋ค๋ ์ค๋ฅ๊ฐ ๋๋ค.
๊ธฐ์กด ๋ฐฐ์ด state๋ฅผ ๊ทธ๋๋ก ๋ณ๊ฒฝํด์ฃผ๋ ค๊ณ ํ๊ธฐ ๋๋ฌธ์ ์์ ๊ฐ์ ์ค๋ฅ๋ฅผ ๋ง๋ ๊ฒ์ด๋ค.
๋ค์์ ๊ณต์๋ฌธ์์์ ๋ฐฐ์ด์ ์ด์ฉํ์ฌ ๊ฐ์ ์ถ๊ฐ, ์ญ์ , ๊ต์ฒด, ์ ๋ ฌ์ ํ๋ ๋ฐฉ๋ฒ์ ์๊ฐํ๊ณ ์๋ ๋ฌธ์์์ ๊ฐ์ ธ์จ ํ์ด๋ค. ํ ์ผ์ชฝ์ ๋ฉ์๋๋ค์ ๋ชจ๋ ์๋ณธ ๋ฐฐ์ด ์์ฒด๋ฅผ ๋ณ๊ฒฝ ์ํค๋ ๋ฉ์๋๊ณ , ์ค๋ฅธ์ชฝ์ ๋ฉ์๋๋ค์ ์๋ก์ด ๋ฐฐ์ด์ ๋ง๋๋ ๋ฐฉ๋ฒ์ด๋ค. ํ์ ์ค๋ฅธ์ชฝ ๋ฐฉ๋ฒ์ ์ด์ฉํด ์๋ก์ด ๋ฐฐ์ด์ ๋ง๋ค์ด ์ ๋ฌํด์ผ๋ง ๋ฐฐ์ด state๋ฅผ ์ ์์ ์ผ๋ก ๋ณ๊ฒฝํ ์ ์๋ค.
์์ ๋น๊ต์ React.Memo, useCallback
์์ ๋น๊ต์ ๋ํด์ ๋ง์ด ๋์์, ๊ณต์๋ฌธ์์์ ์์ ๋น๊ต๊ฐ ๋ ์ด๋์ ์ฌ์ฉ๋๊ณ ์๋์ง ์ฐพ์๋ณด์๋ค. ๋ฐ๋ก React.memo์์ ์ฌ์ฉ๋๊ณ ์๋ค๊ณ ๋์จ๋ค.
์์์ ์ธ๊ธํ ๊ฒ์ฒ๋ผ ๋ฆฌ์กํธ์์๋ props๊ฐ ๋ณ๊ฒฝ๋ ๋ ๋ฆฌ๋ ๋๋ง์ด ๋ฐ์ํ๋ค. props์ ๋ณ๊ฒฝ์ด ์๋๋ฐ๋ ๋ถ๊ตฌํ๊ณ , ๋งค๋ฒ ์ฌ๋ ๋๋ง ๋๋ค๋ฉด ๋นํจ์จ์ ์ด๊ธฐ ๋๋ฌธ์ React.memo๋ฅผ ์ฌ์ฉํ๋ฉด ์์ ๋น๊ต๋ฅผ ์ํํ ์ ์๋๋ก ํ ์ ์๋ค. ์ด ๋, props์ ์ ๋ฌ๋๋ ๊ฐ์ด ๊ธฐ๋ณธํ ๋ฐ์ดํฐ๋ผ๋ฉด ์์ ๋น๊ต๋ฅผ ํตํด์ React.memo๊ฐ ์ ๋๋ก ์๋ํ๊ฒ ์ง๋ง, ์ฐธ์กฐํ ๋ฐ์ดํฐ๋ผ๋ฉด ๋ถ๋ชจ์๊ฒ์ ์ ๋ฌ๋ฐ์ ๋ฐ์ดํฐ๊ฐ ๋งค๋ฒ ์๋ก์ด ์ฃผ์๊ฐ์ ๊ฐ์ง๊ธฐ ๋๋ฌธ์ ์์ ๋น๊ต๋ฅผ ํ๋ React.memo๋ง ํตํด์๋ ์ํ๋ ๋๋ก ์ต์ ํ๋ฅผ ํ ์ ์๋ค.
์๋ฅผ ๋ค์ด, A ๋ถ๋ชจ, B ์์ ์ปดํฌ๋ํธ๊ฐ ์๊ณ , ๋ถ๋ชจ ์ปดํฌ๋ํธ์์ ์์ ์ปดํฌ๋ํธ์๊ฒ ์ด๋ค ํจ์๋ฅผ props๋ก ๋ด๋ ค์ค๋ค๊ณ ํด๋ณด์. ์ด ํจ์๋ ๋ถ๋ชจ๊ฐ ๋ ๋๋ง ๋ ๋๋ง๋ค ์๋ก์ด ์ฐธ์กฐ๊ฐ์ ์ฌ์ฉํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ๋ถํ์ํ๊ฒ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ง์ด ์ก์๋จน์ ๊ฒ์ด๋ฉฐ, ์ฐธ์กฐ๊ฐ์ด ๋งค๋ฒ ๋ค๋ฅด๊ธฐ์ React.Memo๋ฅผ ์ฌ์ฉํ๋๋ผ๋ ์์ ๋น๊ต๋ฅผ ํตํด props๊ฐ์ด ๋ค๋ฅด๋ค๊ณ ์๊ฐํด์ ๋งค๋ฒ ๋ค์ ํธ์ถ๋ ๊ฒ์ด๋ค.
์ด ๋, useCallback์ ์ด์ฉํ์ฌ ๋ ๋๋ง ๊ฐ์ ํจ์๊ฐ ์ฌํ ๋น ๋๋๋ผ๋ ๋์ผํ ์ฐธ์กฐ๋ฅผ ์ ์งํ ์ ์๋๋ก ๋์์ฃผ๋ฉด React.Memo๊ฐ ์ ์ญํ ์ ํ ์ ์๋๋ก ํ ์ ์๋ค.
useCallback Hook์ ์ฌ์ฉํ๋ฉด shouldComponentUpdate๊ฐ ๊ณ์ ์๋ํ๋๋ก ๋ค์ ๋ ๋๋ง๊ฐ์ ๋์ผํ ์ฝ๋ฐฑ ์ฐธ์กฐ๋ฅผ ์ ์งํ ์ ์์ต๋๋ค.
const memoizedCallback = useCallback(() => { doSomething(a, b); }, [a, b]);
์ฐธ๊ณ
- https://beta.reactjs.org/reference/react/useState
- https://www.daleseo.com/react-hooks-use-callback/
- ์ซ์, ๋ฌธ์์ด, Boolean๊ณผ ๊ฐ์ ์์ ์๋ฃํ์