본문으둜 κ±΄λ„ˆλ›°κΈ°

🐀 Chapter 3: 객체와 νƒ€μž…

πŸ¦„ νƒ€μž…μŠ€ν¬λ¦½νŠΈ λ³€μˆ˜ 선언문​

πŸ“š νƒ€μž…μŠ€ν¬λ¦½νŠΈ κΈ°λ³Έ 제곡 νƒ€μž…β€‹

  • μžλ°”μŠ€ν¬λ¦½νŠΈμ™€ νƒ€μž…μŠ€ν¬λ¦½νŠΈμ˜ κΈ°λ³Έ νƒ€μž…
μœ ν˜•μžλ°”μŠ€ν¬λ¦½νŠΈ νƒ€μž…νƒ€μž…μŠ€ν¬λ¦½νŠΈ νƒ€μž…
수 μœ ν˜•Numbernumber
λΆˆλ¦¬μ–Έ νƒ€μž…Booleanboolean
λ¬Έμžμ—΄ νƒ€μž…Stringstring
객체 νƒ€μž…Objectobject

πŸ“š letκ³Ό const ν‚€μ›Œλ“œβ€‹

  • λ‹€μŒμ€ let ν‚€μ›Œλ“œλ‘œ λ³€μˆ˜λ₯Ό μ„ μ–Έν•˜λŠ” 방법이닀.
  • let으둜 μ„ μ–Έν•œ λ³€μˆ˜λŠ” μ½”λ“œμ—μ„œ κ·Έ 값이 μˆ˜μ‹œλ‘œ 변경될 수 μžˆμŒμ„ μ•”μ‹œν•œλ‹€.
let a = 1;
  • λ‹€μŒμ€ const ν‚€μ›Œλ“œλ‘œ λ³€μˆ˜λ₯Ό μ„ μ–Έν•˜λŠ” 방법이닀.
  • const둜 λ³€μˆ˜λ₯Ό μ„ μ–Έν•  λ•ŒλŠ” λ°˜λ“œμ‹œ μ΄ˆκΈ°κ°’μ„ λͺ…μ‹œν•΄μ•Ό ν•œλ‹€.
  • const λ³€μˆ˜λŠ” μ½”λ“œμ—μ„œ λ³€μˆ«κ°’μ΄ μ ˆλŒ€ λ³€ν•˜μ§€ μ•ŠλŠ”λ‹€λŠ” 것을 μ•”μ‹œν•œλ‹€.
const a = 1;

πŸ“š νƒ€μž… 주석​

  • νƒ€μž…μŠ€ν¬λ¦½νŠΈλŠ” μžλ°”μŠ€ν¬λ¦½νŠΈ λ³€μˆ˜ 선언문을 ν™•μž₯ν•΄ λ‹€μŒκ³Ό 같은 ν˜•νƒœλ‘œ νƒ€μž…μ„ λͺ…μ‹œν•  수 μžˆλ‹€.
  • 이λ₯Ό νƒ€μž… 주석(type annotation)이라고 ν•œλ‹€.
// let λ³€μˆ˜ 이름: νƒ€μž… [= μ΄ˆκΉƒκ°’]
// const λ³€μˆ˜μ΄λ¦„: νƒ€μž… = μ΄ˆκΉƒκ°’
let n: number = 1;
let b: boolean = true;
let s: string = 'hello';
let o: object = {};
  • νƒ€μž…μŠ€ν¬λ¦½νŠΈλŠ” let으둜 μ„ μ–Έν•œ λ³€μˆ«κ°’μ€ νƒ€μž… μ£Όμ„μœΌλ‘œ λͺ…μ‹œν•œ νƒ€μž…μ— ν•΄λ‹Ήν•˜λŠ” κ°’μœΌλ‘œλ§Œ λ°”κΏ€ 수 μžˆλ‹€.
let n: number = 1;
let b: boolean = true;
let s: string = 'hello';

n = 'a'; // νƒ€μž… 뢈일치 였λ₯˜ λ°œμƒ
b = 1; // νƒ€μž… 뢈일치 였λ₯˜ λ°œμƒ
s = false; // νƒ€μž… 뢈일치 였λ₯˜ λ°œμƒ

πŸ“š νƒ€μž… 좔둠​

  • νƒ€μž…μŠ€ν¬λ¦½νŠΈλŠ” μžλ°”μŠ€ν¬λ¦½νŠΈμ™€ ν˜Έν™˜μ„±μ„ μœ„ν•΄ νƒ€μž… 주석 뢀뢄을 μƒλž΅ν•  수 μžˆλ‹€.
  • νƒ€μž…μŠ€ν¬λ¦½νŠΈ μ»΄νŒŒμΌλŸ¬λŠ” λ‹€μŒκ³Ό 같은 μ½”λ“œλ₯Ό λ§Œλ‚˜λ©΄ λŒ€μž… μ—°μ‚°μž = 였λ₯Έμͺ½ 값에 따라 λ³€μˆ˜μ˜ νƒ€μž…μ„ μ§€μ •ν•œλ‹€.
  • 이λ₯Ό νƒ€μž… μΆ”λ‘ (type inference)이라고 ν•œλ‹€.
let n = 1; // n의 νƒ€μž…μ„ number둜 νŒλ‹¨
let b = true; // b의 νƒ€μž…μ„ boolean으둜 νŒλ‹¨
let s = 'hello'; // s의 νƒ€μž…μ„ string으둜 νŒλ‹¨
let o = {}; // o의 νƒ€μž…μ„ object둜 νŒλ‹¨
  • 즉, λ³€μˆ˜ 선언문에 νƒ€μž… 주석을 λͺ…μ‹œν•˜μ§€ μ•Šμ•˜μ§€λ§Œ, μ»΄νŒŒμΌλŸ¬κ°€ μ΄ˆκΉƒκ°’μ— 따라 νƒ€μž…μ„ μΆ”λ‘ ν•˜λ―€λ‘œ 각 λ³€μˆ˜λŠ” μ΄ˆκΉƒκ°’μ— ν•΄λ‹Ήν•˜λŠ” νƒ€μž…μœΌλ‘œ μ§€μ •λœλ‹€. λ”°λΌμ„œ 이후에 각 λ³€μˆ˜μ—λŠ” ν•΄λ‹Ή νƒ€μž…μ˜ κ°’λ§Œ 지정할 수 μžˆλ‹€.

πŸ“š any νƒ€μž…β€‹

  • λ‹€μŒ μ½”λ“œμ—μ„œ λ³€μˆ˜ aλŠ” νƒ€μž…μ΄ anyμ΄λ―€λ‘œ κ°’μ˜ νƒ€μž…κ³Ό λ¬΄κ΄€ν•˜κ²Œ μ–΄λ–€ μ’…λ₯˜μ˜ 값도 μ €μž₯ν•  수 μžˆλ‹€.
let a: any = 0;
a = 'hello';
a = true;
a = {};

πŸ“š undefined νƒ€μž…β€‹

  • μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ undefinedλŠ” 값이닀. (λ³€μˆ˜λ₯Ό μ΄ˆκΈ°ν™”ν•˜μ§€ μ•ŠμœΌλ©΄)
  • κ·ΈλŸ¬λ‚˜ νƒ€μž…μŠ€ν¬λ¦½νŠΈμ—μ„œ undefinedλŠ” νƒ€μž…μ΄κΈ°λ„ ν•˜κ³  값이기도 ν•˜λ‹€.
let u: undefined = undefined;
u = 1; // Type '1' is not assignable to type 'undefined' 였λ₯˜ λ°œμƒ
  • νƒ€μž…μ˜ 상속 관계λ₯Ό 보면 anyλŠ” λͺ¨λ“  νƒ€μž…μ˜ 루트 νƒ€μž…, 즉 μ΅œμƒμœ„ νƒ€μž…μ΄λ‹€.
  • λ°˜λ©΄μ— undefinedλŠ” λͺ¨λ“  νƒ€μž…μ˜ μ΅œν•˜μœ„ νƒ€μž…μ΄λ‹€.

typescript-type

πŸ“š ν…œν”Œλ¦Ώ λ¬Έμžμ—΄β€‹

  • λ³€μˆ˜μ— λ‹΄κΈ΄ 값을 μ‘°ν•©ν•΄ λ¬Έμžμ—΄μ„ λ§Œλ“€ 수 있게 ν•˜λŠ” ν…œν”Œλ¦Ώ λ¬Έμžμ—΄μ„ μ œκ³΅ν•œλ‹€.
let count = 10, message = 'Your count';
let result = `${message} is ${count}`;
console.log(result); // Your count is 10

πŸ¦„ 객체와 μΈν„°νŽ˜μ΄μŠ€β€‹

  • object νƒ€μž…μ€ μΈν„°νŽ˜μ΄μŠ€μ™€ 클래슀의 μƒμœ„ νƒ€μž…μ΄λ‹€.
  • object νƒ€μž…μœΌλ‘œ μ„ μ–Έλœ λ³€μˆ˜λŠ” number, boolean, stringνƒ€μž…μ˜ 값을 κ°€μ§ˆ μˆ˜λŠ” μ—†μ§€λ§Œ, λ‹€μŒμ²˜λŸΌ 속성 이름이 λ‹€λ₯Έ 객체λ₯Ό λͺ¨λ‘ 자유둭게 담을 수 μžˆλ‹€.
let o: object = { name: 'Jack', age: 32 };
o = { first: 1, second: 2 };
  • object νƒ€μž…μ€ 마치 객체λ₯Ό λŒ€μƒμœΌλ‘œ ν•˜λŠ” any νƒ€μž…μ²˜λŸΌ λ™μž‘ν•œλ‹€.
  • νƒ€μž…μŠ€ν¬λ¦½νŠΈμ˜ μΈν„°νŽ˜μ΄μŠ€ ꡬ문은 μ΄λ ‡κ²Œ λ™μž‘ν•˜μ§€ μ•Šκ²Œ ν•˜λ €λŠ” λͺ©μ μœΌλ‘œ κ³ μ•ˆλ˜μ—ˆλ‹€.
  • 즉, λ³€μˆ˜ oμ—λŠ” 항상 nameκ³Ό age μ†μ„±μœΌλ‘œ κ΅¬μ„±λœ 객체만 κ°€μ§ˆ 수 있게 ν•΄μ„œ λ‹€λ₯Έ νƒ€μž…μΌ 경우 였λ₯˜λ₯Ό λ°œμƒν•˜κ²Œ ν•œλ‹€.

πŸ“š μΈν„°νŽ˜μ΄μŠ€ 선언문​

  • νƒ€μž…μŠ€ν¬λ¦½νŠΈλŠ” 객체의 νƒ€μž…μ„ μ •μ˜ν•  수 있게 ν•˜λŠ” interfaceλΌλŠ” ν‚€μ›Œλ“œλ₯Ό μ œκ³΅ν•œλ‹€.
interface IPerson {
name: string;
age: number;
};
  • μΈν„°νŽ˜μ΄μŠ€μ˜ λͺ©μ μ€ 객체의 νƒ€μž… λ²”μœ„λ₯Ό μ’νžˆλŠ” 데 μžˆλ‹€. λ”°λΌμ„œ λ‹€μŒμ²˜λŸΌ IPerson μΈν„°νŽ˜μ΄μŠ€μ˜ 쑰건을 λ²—μ–΄λ‚˜λŠ” μ½”λ“œλŠ” λͺ¨λ‘ 였λ₯˜κ°€ λ°œμƒν•œλ‹€.
interface IPerson {
name: string;
age: number;
};

let good: IPerson = { name: 'Jack', age: 32 };

// 'age' 속성이 '{ name: string; }' ν˜•μ‹μ— μ—†μ§€λ§Œ 'IPerson' ν˜•μ‹μ—μ„œ ν•„μˆ˜μž…λ‹ˆλ‹€.
let bad1: IPerson = { name: 'Jack' };
// 'name' 속성이 '{ age: number; }' ν˜•μ‹μ— μ—†μ§€λ§Œ 'IPerson' ν˜•μ‹μ—μ„œ ν•„μˆ˜μž…λ‹ˆλ‹€.
let bad2: IPerson = { age: 32 };
// '{}' ν˜•μ‹μ— 'IPerson' ν˜•μ‹μ˜ name, age 속성이 μ—†μŠ΅λ‹ˆλ‹€.
let bad3: IPerson = {};
// 개체 λ¦¬ν„°λŸ΄μ€ μ•Œλ €μ§„ μ†μ„±λ§Œ 지정할 수 있으며 'IPerson' ν˜•μ‹μ— 'etc'이(κ°€) μ—†μŠ΅λ‹ˆλ‹€.
let bad4: IPerson = { name: 'Jack', age: 32, etc: true };

πŸ“š 선택 속성 ꡬ문​

  • μΈν„°νŽ˜μ΄μŠ€λ₯Ό 섀계할 λ•Œ μ–΄λ–€ 속성은 λ°˜λ“œμ‹œ μžˆμ–΄μ•Ό ν•˜μ§€λ§Œ, μ–΄λ–€ 속성은 μžˆμ–΄λ„ 되고 없어도 λ˜λŠ” ν˜•νƒœλ‘œ λ§Œλ“€κ³  싢을 λ•Œκ°€ μžˆλ‹€.
  • μ΄λŸ¬ν•œ 속성을 선택 속성(optional property)이라고 ν•œλ‹€.
interface IPerson2 {
name: string;
age: number;
etc?: boolean; // optional property
}

let good1: IPerson2 = { name: 'Jack', age: 32 };
let good2: IPerson2 = { name: 'Jack', age: 32, etc: true };

πŸ“š 읡λͺ… μΈν„°νŽ˜μ΄μŠ€β€‹

  • νƒ€μž…μŠ€ν¬λ¦½νŠΈλŠ” interface ν‚€μ›Œλ“œλ„ μ‚¬μš©ν•˜μ§€ μ•Šκ³  μΈν„°νŽ˜μ΄μŠ€μ˜ 이름도 μ—†λŠ” μΈν„°νŽ˜μ΄μŠ€λ₯Ό λ§Œλ“€ 수 μžˆλ‹€.
  • 이λ₯Ό 읡λͺ… μΈν„°νŽ˜μ΄μŠ€(anonymous interface)라고 ν•œλ‹€.
  • 읡λͺ… μΈν„°νŽ˜μ΄μŠ€ 예
let ai: {
name: string,
age: number,
etc?: boolean,
} = { name: 'Jack', age: 32 };
  • ν•¨μˆ˜μ— μ‚¬μš©λœ 읡λͺ… μΈν„°νŽ˜μ΄μŠ€ 예
function printMe(me: { name: string, age: number, etc?: boolean }) {
console.log(
me.etc?
`${me.name} ${me.age} ${me.etc}` :
`${me.name} ${me.age}`
);
}

printMe(ai); // Jack 32

πŸ¦„ 객체와 ν΄λž˜μŠ€β€‹

πŸ“š 클래슀 선언문​

  • νƒ€μž…μŠ€ν¬λ¦½νŠΈλŠ” 객체지ν–₯ μ–Έμ–΄μ—μ„œ ν”νžˆ λ³Ό 수 μžˆλŠ” class, private, public, protected, implements, extend와 같은 ν‚€μ›Œλ“œλ₯Ό μ œκ³΅ν•œλ‹€.
  • 문법적인 차이만 μ•½κ°„ μžˆμ„ 뿐 사싀상 κ·Έ μ˜λ―ΈλŠ” λ‹€λ₯Έ 언어와 κ°™λ‹€.
  • λ‹€μŒμ€ 클래슀 μ„ μ–Έλ¬Έ κΈ°λ³Έ ν˜•νƒœμ΄λ‹€.
class ν΄λž˜μŠ€μ΄λ¦„ {
[private | protected | public] 속성 이름[?]: 속성 νƒ€μž…[...]
}
  • λ‹€μŒ μ½”λ“œλŠ” nameκ³Ό ageλΌλŠ” 속성을 가진 클래슀λ₯Ό μ„ μ–Έν•œλ‹€.
class Person1 {
name: string;
age?: number;
}
  • λ‹€μŒ μ½”λ“œλŠ” Person1 ν΄λž˜μŠ€μ— new μ—°μ‚°μžλ₯Ό μ μš©ν•΄ jack1μ΄λΌλŠ” μ΄λ¦„μ˜ Person1 νƒ€μž… λ³€μˆ˜λ₯Ό λ§Œλ“ λ‹€.
let jack1: Person1 = new Person1();
jack1.name = 'Jack';
jack1.age = 32;
console.log(jack1); // Person1 { name: 'Jack', age: 32 }

πŸ“š μ ‘κ·Ό μ œν•œμžβ€‹

  • 클래슀 속성은 public, private, protect와 같은 μ ‘κ·Ό μ œν•œμž(access modifier)λ₯Ό 이름 μ•žμ— 뢙일 수 μžˆλ‹€. λ§Œμ•½ μƒλž΅ν•˜λ©΄ λͺ¨λ‘ public으둜 κ°„μ£Όν•œλ‹€.

πŸ“š μƒμ„±μžβ€‹

  • νƒ€μž…μŠ€ν¬λ¦½νŠΈ ν΄λž˜μŠ€λŠ” constructorλΌλŠ” μ΄λ¦„μ˜ νŠΉλ³„ν•œ λ©”μ„œλ“œλ₯Ό ν¬ν•¨ν•˜λŠ”λ°, 이λ₯Ό μƒμ„±μžλΌκ³  ν•œλ‹€.
  • λ‹€λ₯Έ 언어와 λ‹€λ₯΄κ²Œ νƒ€μž…μŠ€ν¬λ¦½νŠΈ ν΄λž˜μŠ€λŠ” λ‹€μŒ μ½”λ“œμ²˜λŸΌ 클래슀의 속성(name, age)을 μ„ μ–Έν•  수 μžˆλ‹€.
  • 즉, μ•žμ—μ„œ μž‘μ„±ν•œ Person1ν΄λž˜μŠ€μ™€ λ˜‘κ°™μ΄ λ™μž‘ν•œλ‹€.
class Person2 {
constructor(public name: string, public age?: number) {};
}

let jack2: Person2 = new Person2('Jack', 32);
console.log(jack2); // Person2 { name: 'Jack', age: 32 }
  • νƒ€μž…μŠ€ν¬λ¦½νŠΈλŠ” μƒμ„±μžμ˜ λ§€κ°œλ³€μˆ˜μ— publicκ³Ό 같은 μ ‘κ·Ό μ œν•œμžλ₯Ό 뢙이면 ν•΄λ‹Ή λ§€κ°œλ³€μˆ˜μ˜ 이름을 가진 속성이 ν΄λž˜μŠ€μ— μ„ μ–Έλœ κ²ƒμ²˜λŸΌ λ™μž‘ν•œλ‹€.
  • 즉 λ‹€μŒκ³Ό 같이 μž₯ν™©ν•˜κ²Œ κ΅¬ν˜„λœ 것을 ν•¨μΆ•ν•΄μ„œ κ΅¬ν˜„ν•œ 것이닀.
class Person3 {
name: string;
age?: number;
constructor(name: string, age?: number) {
this.name = name;
this.age = age;
};
}

let jack3: Person3 = new Person3('Jack', 32);
console.log(jack3); // Person3 { name: 'Jack', age: 32 }

πŸ“š μΈν„°νŽ˜μ΄μŠ€ κ΅¬ν˜„β€‹

  • νƒ€μž…μŠ€ν¬λ¦½νŠΈ ν΄λž˜μŠ€λŠ” μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•  수 μžˆλ‹€.
  • ν΄λž˜μŠ€κ°€ μΈν„°νŽ˜μ΄μŠ€λ₯Όκ΅¬ν˜„ν•  λ•ŒλŠ” λ‹€μŒμ²˜λŸΌ implements ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•œλ‹€.
class ν΄λž˜μŠ€μ΄λ¦„ implements μΈν„°νŽ˜μ΄μŠ€μ΄λ¦„ {
//...
}
  • ν•œ 가지 μ•žμœΌλ‘œ κΈ°μ–΅ν•΄ 둬야 ν•  점은 μΈν„°νŽ˜μ΄μŠ€λŠ” μ΄λŸ¬μ΄λŸ¬ν•œ 속성이 μžˆμ–΄μ•Ό ν•œλ‹€λŠ” κ·œμ•½(spec)에 λΆˆκ³Όν•  뿐 물리적으둜 ν•΄λ‹Ή 속성을 λ§Œλ“€μ§€ μ•ŠλŠ”λ‹€λŠ” 점이닀.
  • λ”°λΌμ„œ 클래슀 λͺΈν†΅μ—λŠ” λ°˜λ“œμ‹œ μΈν„°νŽ˜μ΄μŠ€κ°€ μ •μ˜ν•˜κ³  μžˆλŠ” 속성을 멀버 μ†μ„±μœΌλ‘œ 포함해야 ν•œλ‹€.
interface IPerson4 {
name: string;
age?: number;
}

class Person4 implements IPerson4 {
name: string;
age: number;
}
  • λ‹€μŒ μ½”λ“œλŠ” μ•žμ„œ λ³Έ Person2 κ΅¬ν˜„ 방식을 μΈν„°νŽ˜μ΄μŠ€ κ΅¬ν˜„μ— μ‘μš©ν•œ 것이닀.
interface IPerson4 {
name: string;
age?: number;
}

class Person4 implements IPerson4 {
constructor(public name: string, public age?: number) {};
}

export let jack4: IPerson4 = new Person4('Jack', 32);
console.log(jack4); // Person4 { name: 'Jack', age: 32 }

πŸ“š 좔상 ν΄λž˜μŠ€β€‹

  • νƒ€μž…μŠ€ν¬λ¦½νŠΈλŠ” λ‹€λ₯Έ μ–Έμ–΄μ²˜λŸΌ abstract ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•΄ 좔상 클래슀λ₯Ό λ§Œλ“€ 수 μžˆλ‹€.
  • 좔상 ν΄λž˜μŠ€λŠ” μžμ‹ μ˜ μ†μ„±μ΄λ‚˜ λ©”μ„œλ“œ μ•žμ— abstractλ₯Ό λΆ™μ—¬ λ‚˜λ₯Ό μƒμ†ν•˜λŠ” λ‹€λ₯Έ ν΄λž˜μŠ€μ—μ„œ 이 μ†μ„±μ΄λ‚˜ λ©”μ„œλ“œλ₯Ό κ΅¬ν˜„ν•˜κ²Œ ν•œλ‹€.
abstract class ν΄λž˜μŠ€μ΄λ¦„ {
abstract 속성이름: μ†μ„±νƒ€μž…;
abstract λ©”μ„œλ“œμ΄λ¦„() {};
}
  • λ‹€μŒ μ½”λ“œλŠ” name 속성 μ•žμ— abstractκ°€ λΆ™μ—ˆμœΌλ―€λ‘œ new μ—°μ‚°μžλ₯Ό μ μš©ν•΄ 객체λ₯Ό λ§Œλ“€ 수 μ—†λ‹€.
abstract class AbstractPerson5 {
abstract name: string;
constructor(public age?: number) {}
}

πŸ“š 클래슀의 상속​

  • 객체지ν–₯ μ–Έμ–΄λŠ” λΆ€λͺ¨ 클래슀λ₯Ό μƒμ†λ°›λŠ” 상속 클래슀λ₯Ό λ§Œλ“€ 수 μžˆλŠ”λ°, νƒ€μž…μŠ€ν¬λ¦½νŠΈλŠ” λ‹€μŒμ²˜λŸΌ extends ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•΄ 상속 클래슀λ₯Ό λ§Œλ“ λ‹€.
class μƒμ†ν΄λž˜μŠ€ extends λΆ€λͺ¨ν΄λž˜μŠ€ { /*...*/ }
  • λ‹€μŒ Person5 ν΄λž˜μŠ€λŠ” AbstractPerson5 좔상 클래슀λ₯Ό 상속해 AbstractPerson5κ°€ κ΅¬ν˜„ν•œ ageλ₯Ό μ–»κ³ , AbstractPerson5λ₯Ό μƒμ†λ°›λŠ” ν΄λž˜μŠ€κ°€ κ΅¬ν˜„ν•΄μ•Ό ν•  name 속성을 κ΅¬ν˜„ν•œλ‹€.
  • 참고둜 νƒ€μž…μŠ€ν¬λ¦½νŠΈμ—μ„œλŠ” λΆ€λͺ¨ 클래슀의 μƒμ„±μžλ₯Ό super ν‚€μ›Œλ“œλ‘œ ν˜ΈμΆœν•  수 μžˆλ‹€.
abstract class AbstractPerson5 {
abstract name: string;
constructor(public age?: number) {}
}

class Person5 extends AbstractPerson5 {
constructor(public name: string, age?: number) {
super(age);
}
}

let jack5: Person5 = new Person5('Jack', 32);
console.log(jack5); // Person5 { name: 'Jack', age: 32 }

πŸ“š static 속성​

  • νƒ€μž…μŠ€ν¬λ¦½νŠΈ ν΄λž˜μŠ€λŠ” 정적인 속성을 κ°€μ§ˆ 수 μžˆλ‹€.
  • 클래슀의 정적 속성은 λ‹€μŒκ³Ό 같은 ν˜•νƒœλ‘œ μ„ μ–Έν•œλ‹€.
class ν΄λž˜μŠ€μ΄λ¦„ {
static 정적속성이름: μ†μ„±νƒ€μž…
}
  • λ‹€μŒμ²˜λŸΌ 정적 속성은 점 ν‘œκΈ°λ²•μ„ μ‚¬μš©ν•΄ 값을 μ–»κ±°λ‚˜ μ„€μ •ν•  수 μžˆλ‹€.
class A {
static initValue = 1;
}

let initVal = A.initValue; // 1

πŸ¦„ 객체의 비ꡬ쑰화 할당문​

  • λ‹€μŒμ²˜λŸΌ μΈν„°νŽ˜μ΄μŠ€λ‚˜ 클래슀λ₯Ό μ‚¬μš©ν•΄ κ΄€λ ¨λœ 정보λ₯Ό λ¬Άμ–΄ μƒˆλ‘œμš΄ νƒ€μž…μœΌλ‘œ ν‘œν˜„ν•œλ‹€.
  • 이λ₯Ό ꡬ쑰화(structuring)라고 ν•œλ‹€.
export interface IPerson {
name: string;
age: number;
}

export interface ICompany {
name: string;
age: number;
}
  • μ½”λ“œλ₯Ό 이처럼 ꡬ쑰화 ν•˜λ©΄ λ‹€μŒ μ½”λ“œμ—μ„œ 보듯 λΉ„μŠ·ν•œ μœ ν˜•μ˜ λ³€μˆ˜λ₯Ό μ‰½κ²Œ λ§Œλ“€ 수 μžˆλ‹€.
  • 이둜써 μ½”λ“œμ˜ κΈ°λŠ₯ ν™•μž₯이 μˆ˜μ›”ν•΄μ§„λ‹€.
import { IPerson, ICompany } from "./IPerson_ICompany";

let jack: IPerson = { name: 'Jack', age: 32},
jane: IPerson = { name: 'jane', age: 32};

let apple: ICompany = { name: 'Apple', age: 42},
ms: ICompany = { name: 'Microsoft', age: 34};

πŸ“š λΉ„κ΅¬μ‘°ν™”λž€?​

  • κ΅¬μ‘°ν™”λœ 데이터λ₯Ό λΆ„ν•΄ν•˜λŠ” 것을 비ꡬ쑰화(destructuring)라고 ν•œλ‹€.
let name = jack.name;
let age = jack.age;

πŸ“š 비ꡬ쑰화 할당​

  • 비ꡬ쑰화 할당을 객체에 μ μš©ν•˜λ €λ©΄ μ–»κ³  싢은 속성을 μ€‘κ΄„ν˜Έλ‘œ λ¬ΆλŠ”λ‹€.
import { IPerson } from "./IPerson_ICompany";

let jack: IPerson = { name: 'Jack', age: 32};
let {name, age} = jack; // 비ꡬ쑰화 ν• λ‹Ή

console.log(name, age); // Jack 32

πŸ“š μž”μ—¬ μ—°μ‚°μžβ€‹

  • 점을 연이어 3개λ₯Ό μ‚¬μš©ν•˜λŠ” ... μ—°μ‚°μžλŠ” μ‚¬μš©λ˜λŠ” μœ„μΉ˜μ— 따라 μž”μ—¬ μ—°μ‚°μž(rest operator) ν˜Ήμ€ μ „κ°œ μ—°μ‚°μž(spread operator)라고 λΆ€λ₯Έλ‹€.
  • μž”μ—¬ μ—°μ‚°μž 예
let address: any = {
country: 'Korea',
city: 'Seoul',
address1: 'Gangnam-gu',
address2: 'Sinsa-dong',
address3: '123-456',
};

const { country, city, ...detail} = address;

console.log(detail);
// { address1: 'Gangnam-gu', address2: 'Sinsa-dong', address3: '123-456' }

πŸ“š μ „κ°œ μ—°μ‚°μžβ€‹

  • 점 3개 μ—°μ‚°μžκ°€ 비ꡬ쑰화 할당문이 μ•„λ‹Œ κ³³μ—μ„œ μ‚¬μš©λ  λ•Œ 이λ₯Ό μ „κ°œ μ—°μ‚°μžλΌκ³  ν•œλ‹€.
let coord = { ...{ x: 0 }, ...{ y: 0 } };
console.log(coord); // { x: 0, y: 0 }
  • μ „κ°œ μ—°μ‚°μžλŠ” 의미 κ·ΈλŒ€λ‘œ 객체의 속성을 λͺ¨λ‘ μ „κ°œν•΄ μƒˆλ‘œμš΄ 객체둜 λ§Œλ“€μ–΄ μ€€λ‹€.
let part1 = { name: 'jane' };
let part2 = { age: 22 };
let part3 = { city: 'Seoul', country: 'Kr'};

let merged = { ...part1, ...part2, ...part3 };

console.log(merged); // { name: 'jane', age: 22, city: 'Seoul', country: 'Kr' }

πŸ¦„ 객체의 νƒ€μž… λ³€ν™˜β€‹

πŸ“š νƒ€μž… λ³€ν™˜β€‹

  • νƒ€μž…μ΄ μžˆλŠ” 언어듀은 νŠΉμ • νƒ€μž…μ˜ λ³€μˆ«κ°’μ„ λ‹€λ₯Έ νƒ€μž…μ˜ κ°’μœΌλ‘œ λ³€ν™˜ν•  수 μžˆλŠ” κΈ°λŠ₯을 μ œκ³΅ν•œλ‹€.
  • 이λ₯Ό νƒ€μž… λ³€ν™˜(type conversion)이라고 ν•œλ‹€.
  • λ‹€μŒμ€ person λ³€μˆ˜μ˜ νƒ€μž…μ€ object이닀. 그런데 object νƒ€μž…μ€ name 속성을 가지지 μ•ŠμœΌλ―€λ‘œ 였λ₯˜κ°€ λ°œμƒν•œλ‹€.
let person: object = { name: 'Jack', age: 32 };
person.name // 'object' ν˜•μ‹μ— 'name' 속성이 μ—†μŠ΅λ‹ˆλ‹€.
  • λ‹€μŒμ€ 이 였λ₯˜λ₯Ό νƒ€μž… λ³€ν™˜ ꡬ문을 μ‚¬μš©ν•΄ ν•΄κ²°ν•œ 것이닀.
  • person λ³€μˆ˜λ₯Ό μΌμ‹œμ μœΌλ‘œ name 속성이 μžˆλŠ” νƒ€μž…, 즉 {name: string} νƒ€μž…μœΌλ‘œ λ³€ν™˜ν•΄ person.name 속성값을 μ–»κ²Œ ν–ˆλ‹€.
let person: object = { name: 'Jack', age: 32 };

(<{name:string}>person).name;

πŸ“š νƒ€μž… 단언​

  • 그런데 νƒ€μž…μŠ€ν¬λ¦½νŠΈλŠ” νƒ€μž… λ³€ν™˜μ΄ μ•„λ‹Œ νƒ€μž… 단언(type assertion)μ΄λΌλŠ” μš©μ–΄λ₯Ό μ‚¬μš©ν•œλ‹€.
  • νƒ€μž… 단언문은 λ‹€μŒ 두 가지 ν˜•νƒœκ°€ μžˆλ‹€.
(<νƒ€μž…>객체)
(객체 as νƒ€μž…)
  • μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œ INameable.ts νŒŒμΌμ„ λ§Œλ“ λ‹€.
export default interface INameable {
name: string
};
  • λ‹€μŒ μ½”λ“œλŠ” νƒ€μž… λ‹¨μ–Έμ˜ 두 가지 ν˜•νƒœμ΄λ‹€.
import INameable from './INameable';

let obj: object = { name: 'Jack' };

let name1 = (<INameable>obj).name;
let name2 = (obj as INameable).name;

console.log(name1, name2); // Jack Jack
  • λ‘˜μ˜ μ°¨μ΄λŠ” ν˜•νƒœλ§Œ λ‹€λ₯Ό 뿐 λ‚΄μš©μƒμœΌλ‘œλŠ” κ°™λ‹€.