์์์ ํ๋ณํ(Implicit Coercion)
Javascript์ ์์์ ํ๋ณํ์ ์ ํด์ง์ง ์์ ๊ฐ ์ ํ์ ์์๋๋ ์ ํ์ผ๋ก ๊ฐ์ ๋ณํํ๋ ค๋ Javascript์ ์ฑ์ง์
๋๋ค.
์ด๋ก ์ธํด ์ฌ์ฉ์๋ ์ซ์ ๊ฐ์ ๋๊ฒจ์ผ ํ๋ ๊ณณ์ ๋ฌธ์์ด์ ๋ฃ์ ์๋ ์๊ณ , ๋ฌธ์์ด์ ๋ฃ์ด์ผ ํ๋ ๊ณณ์ ๊ฐ์ฒด๋ฅผ ๋๊ธฐ๋ ์ค์๋ฅผ ํ ์๋ ์์ต๋๋ค.
์ด๋ Javascript์ ์ฃผ์ ๊ธฐ๋ฅ์ด์ง๋ง, ๊ฐ์ฅ ํผํด์ผ ํ ๊ธฐ๋ฅ์
๋๋ค.
Javascript๋ ๋ค๋ฅธ ์ธ์ด์ ๋ฌ๋ฆฌ ํ์
์ ๊ต์ฅํ ์ ์ฐํฉ๋๋ค.
3 * '3'; // 9
1 + '2' + 1; // 121
true + true; // 2
10 - true; // 9
const foo = {
valueOf: () => 2
};
3 + foo; // 5
4 * foo; // 8
const bar = {
toString: () => ' promise is a boy :)'
};
1 + bar; // "1 promise is a boy :)"
4 * []; // 0
4 * [2]; // 8
4 + [2]; // "42"
4 + [1, 2]; // "41,2"
4 * [1, 2]; // NaN
'string' ? 4 : 1; // 4
undefined ? 4 : 1; // 1
์ซ์ ํํ์์์ ์ซ์๊ฐ ์๋ ๊ฐ
String(๋ฌธ์์ด)
์ซ์ ๋ฌธ์(Numeric Characters)๋ฅผ ๊ฐ์ก๋ค๋ฉด ์ด๋ค ๋ฌธ์์ด์ด๋ผ๋ ๋๋ฑํ ์ซ์๋ก ๋ฐ๋๋๋ค.
ํ์ง๋ง ๋ง์ผ ๋ฌธ์์ด์ ์ซ์๊ฐ ์๋ ๊ฒ(Non-Numeric Characters)์ด ํฌํจ๋์ด ์์ผ๋ฉด NaN(Not a Number)์ ๋ฆฌํดํ๊ฒ ๋ฉ๋๋ค.
๋ํ๊ธฐ ์ฐ์ฐ์(+)
๋ํ๊ธฐ ์ฐ์ฐ์๋ ํฌ๊ฒ 2๊ฐ์ง ๊ธฐ๋ฅ์ ์ํํฉ๋๋ค.
- ์ํ์ ์ธ ๋ง์
- ๋ฌธ์์ด ํฉ์น๊ธฐ(๊ฒฐํฉ์ฐ์ฐ์)
๋ํ, ๋ํ๊ธฐ ์ฐ์ฐ์๋ ๋ ๊ฐ์ง ํน์ง์ ์ง๋๋๋ค.
- ๋ํ๊ธฐ ์ฐ์ฐ์์์๋ ๋ฌธ์์ ์ฐ์ ์์๊ฐ ์ซ์๋ณด๋ค ๋์ต๋๋ค.
- ๊ฐ์ฒด์ ํจ์ ๋ํ ๋ฌธ์๋ณด๋ค ์ฐ์ ์์๊ฐ ๋ฎ์ต๋๋ค.
๊ทธ ์ธ ์ฐ์ฐ์(-, *, /, %)
- ๋ํ๊ธฐ ์ฐ์ฐ์๋ฅผ ์ ์ธํ ์ฐ์ฐ์์์๋ ์ซ์์ ์ฐ์ ์์๊ฐ ๋ฌธ์๋ณด๋ค ๋์ต๋๋ค.
- ์ซ์๊ฐ ์๋ ๋ฌธ์์ด์ด ๋ค์ด๊ฐ ๊ฒฝ์ฐ ์ฐ์ฐ์ด ๋ถ๊ฐ๋ฅํด
NaN
์ด ๋ฐํ๋ฉ๋๋ค.
3 * '3'; // 3 * 3
3 * Number('3'); // 3 * 3
Number('5'); // 5
Number('1.'); // 1
Number('1.34'); // 1.34
Number('0'); // 0
Number('012'); // 12
Number('1,'); // NaN
Number('1+1'); // NaN
Number('1a'); // NaN
Number('la'); // NaN
Number('one'); // NaN
Number('text'); // NaN
๊ฐ์ฒด(Object)
Javascript์์ ๊ฐ์ฒด์ ๋๋ถ๋ถ์ ์๋ฌต์ ํ๋ณํ์ ๊ฒฐ๊ณผ ๊ฐ์ผ๋ก [object Object]
๋ฅผ ๋ฐํํฉ๋๋ค.
'name' + {}; // "name[object Object]"
๋ชจ๋ Javascript ๊ฐ์ฒด๋ toString
๋ฉ์๋๋ฅผ ์์๋ฐ์ต๋๋ค. ์์๋ฐ์ toString
๋ฉ์๋๋ ๊ฐ์ฒด๊ฐ ๋ฌธ์์ด ํ์
์ผ๋ก ๋ณํด์ผ ํ ๋๋ง๋ค ์ฐ์
๋๋ค.toString
์ ๋ฐํ ๊ฐ์ ๋ฌธ์์ด ํฉ์น๊ธฐ(string concatenation) ํน์ ์ํ์ ํํ์(mathematical expressions)๊ณผ ๊ฐ์ ์ฐ์ฐ์์ ์ฐ์ด๊ฒ ๋ฉ๋๋ค.
const foo = {};
foo.toString(); // [object Object]
const baz = {
toString: () => "I'm object baz"
};
baz + '!'; // "I'm object baz!"
๊ฐ์ฒด๊ฐ ์ํ์ ํํ์ ์ฌ์ด์ ๋ค์ด๊ฐ์ ๋๋, Javascript๋ ๋ฐํ ๊ฐ์ ์ซ์๋ก ๋ณํํ๋ ค ํ ๊ฒ์ ๋๋ค.
const foo = {
toString: () => 4
};
2 * foo; // 8
2 / foo; // 0.5
2 + foo; // 6
'four' + foo; // "four4"
const baz = {
toString: () => 'four'
};
2 * baz; // NaN
2 + baz; // 2four
const bar = {
toString: () => '2'
};
2 + bar; // "22"
2 * bar; // 4
๋ฐฐ์ด ๊ฐ์ฒด(Array Object)
๋ฐฐ์ด์์ ์์๋ toString
๋ฉ์๋๋ ์ฝ๊ฐ ๋ค๋ฅด๊ฒ ๋์ํฉ๋๋ค.
์ด๊ฒ์ ๋ฐฐ์ด์์ ์๋ฌด๋ฐ ์ธ์๋ ๋ฃ์ง ์์ join
๋ฉ์๋๋ฅผ ํธ์ถํ ๊ฒ๊ณผ ๋น์ทํ ๋ฐฉ์์ผ๋ก ์๋ํ๊ฒ ๋ฉ๋๋ค.
[1, 2, 3].toString() // "1,2,3"
[1, 2, 3].join() // "1,2,3"
[].toString() // ""
[].join() // ""
"me" + [1,2,3] // "me1,2,3"
4 + [1,2,3] // "41,2,3"
4 * [1,2,3] // NaN
4 * []; // 0
4 / [2]; // 2
//similar to
4 * Number([].toString());
4 * Number('');
4 * 0;
//
4 / Number([2].toString());
4 / Number('2');
4 / 2;
True, False ๊ทธ๋ฆฌ๊ณ ""
Number(true); // 1
Number(false); // 0
Number(''); // 0
4 + true; // 5
3 * false; // 0
3 * ''; // 0
3 + ''; // 3
valueOf ๋ฉ์๋
๋ฌธ์์ด์ด๋ ์ซ์๊ฐ ์ฌ ๊ณณ์ ๊ฐ์ฒด๋ฅผ ๋๊ธธ ๋๋ง๋ค Javascript ์์ง์ ์ํด ์ฌ์ฉ๋ valueOf
๋ฉ์๋๋ฅผ ์ ์ํ๋ ๊ฒ๋ ๊ฐ๋ฅํฉ๋๋ค.
const foo = {
valueOf: () => 3
};
3 + foo; // 6
3 * foo; // 9
๊ฐ์ฒด์ toString
๊ณผ valueOf
๋ฉ์๋๊ฐ ์ ๋ถ ์ ์๋์ด ์์ ๋๋ Javascript ์์ง์ valueOf
๋ฉ์๋๋ฅผ ์ฌ์ฉํฉ๋๋ค.
const bar = {
valueOf: () => 5,
toString: () => 2
};
'sa' + bar; // "sa5"
3 * bar; // 15
2 + bar; // 7
valueOf
๋ฉ์๋๋ ๊ฐ์ฒด๊ฐ ์ด๋ ํ ์ซ์ ๊ฐ์ ๋ํ๋ผ ๋ ์ฌ์ฉํ๊ธฐ ์ํด ๋ง๋ค์ด์ก์ต๋๋ค.
const two = new Number(2);
two.valueOf(); // 2
Falsy์ Truthy
๋ชจ๋ Javascript ๊ฐ์ true
๋ false
๋ก ๋ณํ๋ ์ ์๋ ํน์ฑ์ ๊ฐ๊ณ ์์ต๋๋ค.true
๋ก ํ๋ณํ์ ๊ฐ์ ํ๋ ๊ฒ์ truthy๋ผ๊ณ ํฉ๋๋ค.
๋ false
๋ก ํ๋ณํ์ ๊ฐ์ ํ๋ ๊ฒ์ falsy๋ผ๊ณ ํฉ๋๋ค.
๋ค์์ Javascript์์ ๋ฐํ ์์ falsy๋ก ์ทจ๊ธ๋๋ ๊ฐ๋ค์ ๋๋ค.
- false
- 0
- null
- undefined
- ""
- NaN
- -0
์ด ์ธ์๋ ์ ๋ถ truthy๋ก ์ทจ๊ธ๋ฉ๋๋ค.
if (-1) // truthy
if ("0") // truthy
if ({}) // truthy
์์ ์ฝ๋์ฒ๋ผ truthy๋ฅผ ์ด์ฉํด๋ ๊ด์ฐฎ์ต๋๋ค.
ํ์ง๋ง ๊ฐ์ด ์ฐธ์์ ๋ช
์์ ์ผ๋ก ํํํด์ฃผ๋ ๊ฒ์ด ๋ ์ข์ ์์ฑ๋ฒ์
๋๋ค.
๋ช
์ฌํด์ผ ํ ๊ฒ์ ๊ฐ๋ฐ์๊ฐ Javascript์ ์์์ ํ๋ณํ(implicit coercion)์ ์๋ฒฝํ ์ดํดํ๋๋ผ๋, Javascript์ ์์์ ํ๋ณํ์ ์์กดํ์ง ์์์ผ๋ฉด ํฉ๋๋ค.
<์ ์ข์ ์>
const counter = 2
if(counter)
๋ค์์ ์ฝ๋๊ฐ ํจ์ฌ ์ข์ ์ฝ๋์ ๋๋ค.
if(counter === 2)
// or
if(typeof counter === "number")
์๋ ํจ์๋ Number
ํ์
์ ๋ณ์๋ฅผ ๋ฐ์ ์คํํ๋๋ก ํ๊ณ ์ถ์ด ๋ง๋ ํจ์์
๋๋ค.
const add = (number) => {
if (!number) new Error('Only accepts arguments of type: number');
// your code
};
์์ ๊ฐ์ ๊ฒฝ์ฐ์๋ ์ธ์ ๊ฐ์ผ๋ก 0์ ์ฃผ๋ฉด ์๋์น ์์ ์๋ฌ๊ฐ ๋ฐ์ํ๊ฒ ๋ฉ๋๋ค.
add(0); // Error: Only accepts arguments of type: number
//better check
const add = (number) => {
if (typeof number !== 'number')
new Error('Only accepts arguments of type: number');
//your code
};
add(0); // no error
NaN(Not a Number)
NaN
์ ์๊ธฐ ์์ ๊ณผ๋ ๊ฐ์ง ์์ ํน๋ณํ ์ซ์ ๊ฐ์
๋๋ค.
Javascript์์ ์ ์ผํ๊ฒ ์๊ธฐ ์์ ๊ณผ ๊ฐ์ง ์์ ๊ฐ์
๋๋ค.
NaN === NaN; // false
const notANumber = 3 * 'a'; // NaN
notANumber == notANumber; // false
notANumber === notANumber; // false
if (notANumber !== notANumber) // true
ES6(ECMAScript6)์์๋ NaN
์ ์ฒดํฌํ๊ธฐ ์ํ ๋ฉ์๋(Number.isNaN)
๊ฐ ๋ฑ์ฅํ์ต๋๋ค.
Number.isNaN(NaN); // true
Number.isNaN('name'); // false
์ ์ญ isNaN
ํจ์์ ๋ํด์๋ ์์์ผ ํฉ๋๋ค.
์ด ํจ์๋ ์ธ์๊ฐ ์ค์ ๋ก NaN
์ธ์ง ์ฒดํฌํ๊ธฐ ์ ์ ์ธ์๋ก ๋ค์ด์จ ๊ฐ์ ํ๋ณํ์ ๊ฐ์ ํฉ๋๋ค.
isNaN('name'); // true
isNaN('1'); // false
์ ์ญ isNaN
ํจ์๋ ์ฌ์ฉํ์ง ์๋ ๊ฒ์ด ์ข์ต๋๋ค.
const coerceThenCheckNaN = (val) => {
const coercedVal = Number(val);
return coercedVal !== coercedVal ? true : false;
};
coerceThenCheckNaN('1a'); // true
coerceThenCheckNaN('1'); // false
coerceThenCheckNaN('as'); // true
coerceThenCheckNaN(NaN); // true
coerceThenCheckNaN(10); // false
๋ช ์์ ํ๋ณํ(Explicit Coercion)
๋ช
์์ ๋ณํ(Explicit Conversion)์ ๊ฐ๋ฐ์๊ฐ ์๋์ ์ผ๋ก ํ๋ณํ์ ํ๋ ์
๋๋ค.
๋ช
์์ ํ๋ณํ์ ์ฃผ๋ก String, Number, Boolean
ํ์
์ผ๋ก ์ด๋ฃจ์ด์ง๋๋ค.Symbol
์ ์์ฃผ ์ฌ์ฉ๋์ง ์๊ณ , null
๊ณผ undefined
๋ ์๋ฃํ์ด๋ฉด์ ๋์์ ๊ฐ์ด๊ธฐ ๋๋ฌธ์ ํ์ํ ๊ฒฝ์ฐ ๊ทธ๋ฅ ๊ทธ ๊ฐ์ ํ ๋นํ๋ฉด ๋ฉ๋๋ค.Object
๋ Date
๊ฐ์ฒด๋ฅผ ์ซ์๋ก ๋ณํํ๋ ํน๋ณํ ๊ฒฝ์ฐ๊ฐ ์๋๋ผ๋ฉด, ๊ทธ๋ฅ ์์ ํ ๊ฐ์ Object
๋ก ๋ง๋ค๋ฉด ๋ง๋ค์์ง ๊ตณ์ด Object
๋ก ํ ๋ณํํ๋ ์ผ์ ์์ต๋๋ค.
String()
console.log(String(123)); // 123
console.log(String(NaN)); // NaN
console.log(String(1 / 0)); // Infinity
console.log(String(-1 / 0)); // -Infinity
console.log(String(true)); // true
console.log(String(false)); // true
console.log(String(undefined)); // undefined
console.log(String(null)); // null
console.log(String({ name: 'bigtop' })); // [object Object]
๋ฌธ์์ด์ด ์๋ ๊ฐ์ ๋ฌธ์์ด๋ก ๋ฐ๊พธ๋ ค๋ฉด ์ด๋ ๊ฒ String
ํจ์๋ฅผ ํ์ฉํ๋ฉด ๋๋๋ฐ, ์๊ดํธ ์์ ๊ฐ์ ๋ฃ์ด์ฃผ๋ฉด ๊ทธ ๊ฐ์ด ๋ฌธ์์ด๋ก ๋ณํฉ๋๋ค.
๊ฐ์ฒด์ ๊ฒฝ์ฐ์๋ [object Object]๊ฐ
์ถ๋ ฅ๋๋๋ฐ ์ฐ๋ฆฌ๊ฐ ๋ฐ๋ผ๋ณด๋ ๊ฐ์ฒด์ ๋ชจ์ ๊ทธ๋๋ก๋ฅผ ๋ฌธ์์ด๋ก ๋ง๋ค๊ณ ์ถ์ ๊ฒฝ์ฐ์๋ JSON๊ฐ์ฒด์ stringify
๋ฉ์๋๋ฅผ ํ์ฉํด์ผ ํฉ๋๋ค.
console.log(JSON.stringify({ name: 'bigtop' })); // {"name": "bigtop"}
Number()
console.log(Number('')); // 0
console.log(Number('abc')); // NaN
console.log(Number('123')); // 123
console.log(Number('123a')); // NaN
console.log(Number(true)); // 1
console.log(Number(false)); // 0
console.log(Number(null)); // 0
console.log(Number(undefined)); // NaN
console.log(Number({ name: 'bigtop' })); // NaN
console.log(Number({})); // NaN
๋ง์ฐฌ๊ฐ์ง๋ก ์ซ์๊ฐ ์๋ ๊ฐ์ ์ซ์๋ก ๋ฐ๊พธ๋ ค๋ฉด ์ด๋ ๊ฒ Number
ํจ์๋ฅผ ํ์ฉํ๋ฉด ๋ฉ๋๋ค.
- ๋น ๋ฌธ์์ด์ 0์ผ๋ก ๋ฐํ
- ์ซ์์ ๋ฌธ์๊ฐ ํผํฉ๋ ๋ฌธ์์ด์
NaN
๋ฐํ Boolean
ํํ์ ๊ฐ์true
๋ 1,false
๋ 0 ๋ฐํnull
์ 0,undefined
๋NaN
๋ฐํ- ๋น ๊ฐ์ฒด๋
NaN
๋ฐํ
์ฐธ๊ณ ๋ก '123a'์ ๊ฐ์ ์ซ์์ ๋ฌธ์๊ฐ ํผํฉ๋ ๊ฒฝ์ฐ์๋ ์ซ์๋ก ์์ํ๋ ๋ฌธ์์ด์ธ ๊ฒฝ์ฐ parseInt
ํน์ parseFloat
ํจ์๋ฅผ ์ฌ์ฉํ๋ฉด ์ซ์ ํํ๋ก ๋ณํ์ด ๊ฐ๋ฅํฉ๋๋ค.
// ์ฒซ ๋ฌธ์๊ฐ ์ซ์์ธ ๊ฒฝ์ฐ parseInt๋ ์ ์ํ์ผ๋ก ํด์์ด ๊ฐ๋ฅํ ๋งํผ ์ซ์๋ก ๋ณํ.
console.log(parseInt('123a')); // 123
console.log(parseInt('1.23a')); // 1
// ์ฒซ ๋ฌธ์๊ฐ ์ซ์์ด๊ฑฐ๋ ์์ซ์ ์ธ ๊ฒฝ์ฐ parseFloat์ ์์ํ์ผ๋ก ํด์์ด ๊ฐ๋ฅํ ๋งํผ ์ซ์๋ก ๋ณํ
console.log(parseFloat('1.23a')); // 1.23
console.log(parseFloat('.23a')); // 0.23
// ์ฒซ ๋ฌธ์๊ฐ ๋ฌธ์์ผ ๊ฒฝ์ฐ๋ NaN๊ฐ์ผ๋ก ๋ณํ.
console.log(parseInt('a123')); // NaN
console.log(parseFloat('a1.23')); // NaN
Boolean()
console.log(Boolean('')); // false
console.log(Boolean('abc')); // true
console.log(Boolean('123')); // true
console.log(Boolean('0')); // true
console.log(Boolean(0)); // false
console.log(Boolean(123)); // true
console.log(Boolean(NaN)); // false
console.log(Boolean(null)); // false
console.log(Boolean(undefined)); // false
console.log(Boolean({ name: 'bigtop' })); // true
console.log(Boolean({})); // true
๋ช ์นญ์ ํ์ดํ(Nominal Typing)
๋ช
์นญ์ ํ์ดํ(Nominal Typing) ๋ฐฉ์์
ํน์ ํค์๋๋ฅผ ํตํ์ฌ ํ์
์ ์ง์ ํด ์ฌ์ฉํ๋ ๋ฐฉ์์
๋๋ค.C++
์ด๋ Java
์ ๊ฐ์ ์ธ์ด๊ฐ ๋ช
์นญ์ ํ์ดํ(Nominal Typing)
์ฆ 'ํ์
'์ ์ ํด์ ๊ฐ๋ฐํ๋ ๋ฐฉ์์
๋๋ค.
ํ์
์ ๋ฏธ๋ฆฌ ์ ํด์ ๊ฐ๋ฐํ๊ฒ ๋๋ฉด ์ค๋ฅ๋ฅผ ์ค์ด๊ณ ์ ์ง๋ณด์๊ฐ ์์ํ์ง๋ง Javascript์์๋ ํ์
์ ์ง์ ํ๋ ๊ฒ์ด ๋ถ๊ฐ๋ฅํฉ๋๋ค.
์ด ๊ฐ์ Javascript์ ๋จ์ ์ ๋ณด์ํ๊ธฐ ์ํด ๋ง์ดํฌ๋ก์ํํธ์์ TypeScript
๋ฅผ ๊ฐ๋ฐํ์ต๋๋ค.
int num = 10;
char str = "a";
num = str; // ERROR!!
num = "a"; // ERROR!!
str = 10; // ERROR!!
์์ ๊ฐ์ ์ํฉ์์ num
์ int
ํ์ผ๋ก str
์ char
ํ์ผ๋ก ์ ์ธ๋์ต๋๋ค.
๋ฐ๋ผ์ ์๋ก ํ์
์ด ๋ง์ง ์๋ ๊ฐ์ ๋์
์ฐ์ฐ์(=)๋ฅผ ์ด์ฉํด ๋์
ํ๋ ค ํ ๊ฒฝ์ฐ ์๋ฌ๊ฐ ๋ฐ์ํ๊ฒ ๋ฉ๋๋ค.
class Foo {};
class Bar {};
Foo foo = new Bar();
ํด๋์ค์์๋ ๋ง์ฐฌ๊ฐ์ง๋ก ์์ ์์์ Foo
์ Bar
๋ ์๋ก ํธํ์ด ๋ถ๊ฐ๋ฅํ ํด๋์ค์
๋๋ค.
class Foo {};
class Bar extends Foo {};
Foo foo = new Bar();
์์ ๊ฐ์ด extends
๋ฅผ ์ด์ฉํด ์๋ก ํด๋์ค ๊ฐ์ ์ํธ ํธํ์ ๋ช
์ํ๋ฉด ํด๋์ค๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๊ตฌ์กฐ์ ํ์ดํ(Structural Typing)
๊ตฌ์กฐ์ ํ์ดํ(Structural Typing)
์ ๋ฉค๋ฒ์ ๋ฐ๋ผ ํ์
์ ๊ฒ์ฌํ๋ ๋ฐฉ๋ฒ์
๋๋ค.๋ช
์นญ์ ํ์ดํ(Nominal Typing)
๊ณผ ๋ฐ๋๋๋ ๋ฐฉ๋ฒ์ผ๋ก TypeScript, Go
๋ฑ์์ ์ฌ์ฉํฉ๋๋ค.๊ตฌ์กฐ์ ํ์ดํ(Structural Typing)
์ ๋ ๋ฐ์ดํฐ์ ํ์
๊ตฌ์กฐ๋ฅผ ๋น๊ตํ์ฌ ํธํ๋๋ ํ์
์ธ์ง ๊ฒ์ฌํฉ๋๋ค.
ํ ํ์
์ด ๋ค๋ฅธ ํ์
์ด ๊ฐ๋ ๋ฉค๋ฒ๋ฅผ ๋ชจ๋ ๊ฐ์ง๊ณ ์์ ๊ฒฝ์ฐ ๋ ํ์
์ ํธํ๋๋ ํ์
์
๋๋ค.
- Typescript์ ํต์ฌ ์์น ์ค ํ๋๋ ํ์ ๊ฒ์ฌ๊ฐ ๊ฐ์ด ์๋ ํํ์ ์ง์คํ๋ ๊ฒ.
- ๋ ๊ฐ์ฒด๊ฐ ๊ฐ์ ํํ๋ฅผ ๊ฐ์ง๋ฉด ๊ฐ์ ๊ฒ์ผ๋ก ๊ฐ์ฃผ.
interface Point {
x: number;
y: number;
}
function printPoint(p: Point) {
console.log(`${p.x}, ${p.y}`);
}
const point = { x: 12, y: 26 }; //์ฌ๊ธฐ ๋ณ์๋ Point ํ์
์ผ๋ก ์ ์ธ ๋ ์ ์ด ์์ง๋ง,
printPoint(point);
// Typescript๋ ํ์
๊ฒ์ฌ์์ point์ Point ํํ๋ฅผ ๋น๊ต, ๋ ๋ค ๊ฐ์ ํํ๋ผ ํต๊ณผ!
ํํ ์ผ์น์์๋ ์ผ์น์ํฌ ๊ฐ์ฒด์ ํ๋์ ํ์ ์งํฉ๋ง ํ์ํฉ๋๋ค.
๊ฐ์ฒด ๋๋ ํด๋์ค์ ํ์ํ ๋ชจ๋ ์์ฑ์ด ์๋ค๋ฉด? Typescript
๋ ๊ตฌํ ์ธ๋ถ ์ ๋ณด์ ๊ด๊ณ์์ด ์ผ์นํ๋ค๊ณ ๊ฐ์ฃผํฉ๋๋ค.
interface Point { ๐ ์ฌ๊ธฐ์ ์์ฑ์ด๋
x: number;
y: number;
}
function printPoint (p: Point) {
console.log(`${p.x}, ${p.y}`);
}
class VirtualPoint { ๐ ์ฌ๊ธฐ์ ์์ฑ์ด ๊ฐ๋ค
x: number;
y: number; // ๋ชจ๋ ์์ฑ์ด ๋ค ์์!
constructor(x: number, y: number){
this.x = x;
this.y = y;
}
}
const newVPoint = new VirtualPoint(13, 56);
printPoint (newVPoint);
๋ ํ์ดํ(Duck Typing)
์ปดํจํฐ ํ๋ก๊ทธ๋๋ฐ ๋ถ์ผ์์ ๋ ํ์ดํ(duck typing)
์ ๋์ ํ์ดํ์ ํ ์ข
๋ฅ๋ก, ๊ฐ์ฒด์ ๋ณ์ ๋ฐ ๋ฉ์๋์ ์งํฉ์ด ๊ฐ์ฒด์ ํ์
์ ๊ฒฐ์ ํ๋ ๊ฒ์ ๋ปํฉ๋๋ค.
ํด๋์ค ์์์ด๋ ์ธํฐํ์ด์ค ๊ตฌํ์ผ๋ก ํ์
์ ๊ตฌ๋ถํ๋ ๋์ , ๋ ํ์ดํ์ ๊ฐ์ฒด๊ฐ ์ด๋ค ํ์
์ ๊ฑธ๋ง์ ๋ณ์์ ๋ฉ์๋๋ฅผ ์ง๋๋ฉด ๊ฐ์ฒด๋ฅผ ํด๋น ํ์
์ ์ํ๋ ๊ฒ์ผ๋ก ๊ฐ์ฃผํฉ๋๋ค.
"์ด๋ค ์๊ฐ ์ค๋ฆฌ์ฒ๋ผ ๊ฑท๊ณ , ํค์์น๊ณ , ์๋ฆฌ๋ฅผ ๋ธ๋ค๋ฉด ๊ทธ ์๋ฅผ ์ค๋ฆฌ๋ผ๊ณ ๋ถ๋ฅผ ๊ฒ์ด๋ค."
Javascript๋ ํ์
์ ๋ํด ์ ์ฐํ ๋์ ํ์
์ธ์ด์
๋๋ค.
๊ทธ๋์ Java์๋ ๋ค๋ฅด๊ฒ ํ์
์ ๋ํด์๋ ๋ช
์์ ์ผ๋ก ์ ์ธ ์์ด ์์ ์์ฌ๋ก ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
// JAVA
String name = "goong";
// Javascript
const name = 'goong';
์ฐ๋ฆฌ๋ ์๋ฐ๋ฅผ ์ ์ ํ์
์ธ์ด, Javascript๋ฅผ ๋์ ํ์
์ธ์ด๋ผ๊ณ ๋ถ๋ฅํ ์ ์์ต๋๋ค.
์ ์ ํ์
์ ์ธ์ด๋ ์ปดํ์ผ ์์ , ๋์ ํ์
์ ์ธ์ด๋ ๋ฐํ์ ์์ ์ ํ์
์ด ์ฒดํฌ๋๋ค๊ณ ์๊ฐํ๋ฉด ๋ฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ ์ ํ์
์ด ๊ฐ์ง๋ ์ฅ์ ๊ณผ ๋์ ํ์
์ธ Javascript๊ฐ ๊ฐ์ง๋ ๋จ์ ์ ๋ณด์ํด ํ์ํ ๊ฒ์ด Typescript์
๋๋ค.
ํ๋์ ์๋ก, ์ฆ Typescript๋ ๊ธฐ์กด์ Javascript๊ฐ ๊ฐ์ง๋ ๋ฐํ์์์ ์ค๋ ์ด์๋ค์ ์ปดํ์ผ ์์ ์ ์์์ฐจ๋ฆด ์ ์์ต๋๋ค.
๊ฐ๋จํ ํ์
์คํฌ๋ฆฝํธ์ Javascript๋ฅผ ๋น๊ตํ๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
Typescript์ ์ฝ์ด ์๋ฆฌ ์ค ํ๋๋ ํ์
์ฒดํน์ ํํ(Shape)์ ์ค์ ์ ๋ก๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ด๊ฒ์ ๋ ํ์ดํ(Duck Typing)
๋๋ ๊ตฌ์กฐ์ ์๋ธ ํ์ดํ(Structural Typing)์ด๋ผ๊ณ
๋ถ๋ฅผ ์ ์์ต๋๋ค.
๊ทธ๋ ๋ค๋ฉด, ๊ตฌ์กฐ์ ์๋ธ ํ์ดํ์
๋ฌด์์ ๋ํ๋ด๋ ๊ฒ์ด๊ณ , ๋ ํ์ดํ
์ ๋ฌด์์ผ๊น์?๋ ํ์ดํ
์ ๊ฐ์ฒด ์์ ์ด ์ด๋ ํ ํ์
์ธ์ง๊ฐ ์ค์ํ์ง ์๊ณ , ํน์ ๋ฉ์๋๋ ์์ฑ์ ์กด์ฌ๋ก ํ์
์ ํ๋จํฉ๋๋ค.
๋ฐ๋์ ๊ฒฝ์ฐ์๋ ํน์ ํ์
์ ์ ์ํจ์ผ๋ก์จ, ๊ทธ ํ์
์ ํน์ ํ๊ฒ ๋ฉ๋๋ค.
๋ ํ์ดํ
์ ํน์ ํ์
์ ์ฝ๋งค์ด์ง ์๊ณ , ์ํ๋ ํ๋์ ํ ์ ์๋ ์ฌ๋ถ๋ก ํ๋จํฉ๋๋ค.
๊ทธ๋์ ํ์
์ ์ ์ฝ ์์ด ์ฌ์ฉํ์ฌ ๋ณด๋ค ์ ์ฐํ๊ฒ ์ฝ๋๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.
// static
let staticName: string = 'goong';
staticName = 1; // TypeError
// dynamic
let dynamicName = 'goong';
dynamicName = 1; // Ok
References
'๐ฅ Front-End > JavaScript' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[JS] ๋ชจ๋์๋ฐ์คํฌ๋ฆฝํธ Deep Dive - ๋ฐ์ดํฐ ํ์ (0) | 2022.04.06 |
---|---|
[JS] 6. ํจ์ ์ค์ฝํ & ๋ธ๋ก ์ค์ฝํ & ๋ ์์ปฌ ์ค์ฝํ (1) | 2022.04.06 |
[JS] 5. == & === & typeof (0) | 2022.03.22 |
[JS] 3. ๊ฐ ํ์ (Value Type) & ์ฐธ์กฐ ํ์ (Reference Type) (0) | 2022.03.22 |
[JS] 2. ์์์๋ฃํ(Primitive Types) (0) | 2022.03.22 |