[TypeScript] ๐ณ 3.1 ํด๋์ค ์ฌ์ฉ
๐ณ 3์ฅ ํด๋์ค์ ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ
์ด๋ฒ ์ฅ์์๋ ๊ฐ์ฒด์งํฅํ๋ก๊ทธ๋๋ฐ ๊ด์ ์ผ๋ก ํด๋์ค์ ์ธํฐํ์ด์ค๋ฅผ ๋ฐฐ์๋ณผ ๊ฒ์ด๋ค.
๊ฐ์ฒด ์งํฅ ์ธ์ด๋ฅผ ์ฌ์ฉํ๋ ๊ฐ๋ฐ์๋ ํด๋์ค์ ํน์ API๋ฅผ ์ ์ฉํ๋ ๋ฐฉ๋ฒ์ผ๋ก ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํฉ๋๋ค.
๐ณ 3.1 ํด๋์ค ์ฌ์ฉ
๐ 2์ฅ ๋ณต์ต
- ๊ฐ์ฒด ์งํฅ ์ธ์ด๋ ๋ฉค๋ฒ ๋ณ์๋ก ํด๋์ค๋ฅผ ์ ์ธํ ์ ์๋ค.
- JS์์๋ ํด๋์ค ๋ด ์์ฑ์๋ฅผ ์ ์ธํ ์ ์์ผ๋ฉฐ ์ธ์คํด์ค ์์ฑ ์ค ํ๋ฒ๋ง ํธ์ถํ๋ค.
- ์ปดํ์ผ ํ๊ฒ์ด ES5์ธ ๊ฒฝ์ฐ ํ์
์คํฌ๋ฆฝํธ ์ปดํ์ผ๋ฌ๋ ํ์
์คํฌ๋ฆฝํธ ํด๋์ค๋ฅผ ์๋ฐ์คํฌ๋ฆฝํธ ์์ฑ์ ํจ์๋ก ๋ณํํจ.
ES6์ด์์ด๋ฉด ์๋ฐ์คํฌ๋ฆฝํธ ํด๋์ค๋ก ์ปดํ์ผ๋จ.
- ์์ฑ์ ํ๋ผ๋ฏธํฐ๋ฅผ readonly, public, protected, private ํค์๋๋ก ์ ์ํ๋ฉด ํ์
์คํฌ๋ฆฝํธ๋ ๊ฐ ํ๋ผ๋ฏธํฐ์ ๋ํ ํด๋์ค ํ๋กํผํฐ๋ฅผ ๋ง๋ฌ.
๐ 3.1.1 ํด๋์ค ์์
ES6์ด์์ด๋ฉด ์๋ฐ์คํฌ๋ฆฝํธ ํด๋์ค๋ก ์ปดํ์ผ๋จ.
keyword : extends
ํ์ ์คํฌ๋ฆฝํธ๋ ๋ถ๋ชจ๋ก๋ถํฐ ๊ธฐ๋ฅ์ ์์์ ๋ฐ์ต๋๋ค.
๊ธฐ์กด ํด๋์ค๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ ํด๋์ค๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค.
class Person {
firstName = '';
lastName = '';
age =0;
}
class Employee extends Person {
department = '';
}
const empl = new Employee();
// empl.age;
empl. ํ ctrl+Enterํ๋ฉด ์๋์์ฑ ๋ชฉ๋ก์ Person์ ์์๋ค์ด ์๋ ๊ฑธ ๋ณผ ์ ์๋ค.
Personํด๋์ค๋ ๋ถ๋ชจ์ด๊ณ , Employee๋ Person์ ์์๋ฐ์ ์์ํด๋์ค๊ฐ ๋ฉ๋๋ค.
ํด๋์ค๋ ํ๋กํผํฐ ์ธ์๋ ๋ฉ์๋๋ฅผ ๊ฐ์ง๋๋ค.
๋ฉ์๋๋ก ํด๋์ค ๋ด๋ถ์ ์ ์ธ๋ ํจ์๋ฅผ ํธ์ถํฉ๋๋ค. (private๊ฐ ์๋๋ผ๋ฉด ์๋ธํด๋์ค์ ์์๋จ.)
class Person {
firstName = '';
lastName = '';
age =0;
sayHello(): string {
return `My name is ${this.firstName} ${this.lastName}`;
}
}
class Employee extends Person {
department = '';
}
const empl = new Employee();
// empl.sayHello
empl.์์ ์๋์์ฑํ๋ฉด sayHello๊ฐ ๋ฌ๋ค.
๐ 3.1.2 public, private, protected ์ ๊ทผ ์ ์ด์
์ ๊ทผ์ ์ด์๋ก ํด๋์ค ๋ฉค๋ฒ ์ ๊ทผ ๊ถํ์ ์ ์ดํฉ๋๋ค.
- public : ํด๋์ค ๋ฉค๋ฒ๋ ๋ชจ๋ ๋ด๋ถ ๋ฐ ์ธ๋ถ ํด๋์ค ์ ๊ทผ๊ฐ๋ฅ.
- protected : ๋์ผ ํจํค์ง์ ์ํ๋ ํด๋์ค์ ์๋ธ ํด๋์ค ๊ด๊ณ์ผ ๊ฒฝ์ฐ๋ง ์ ๊ทผ๊ฐ๋ฅ
- private : ํด๋์ค ๋ด์์๋ง ์ ๊ทผ๊ฐ๋ฅ.
class Person {
public firstName = '';
public lastName = '';
private age =0;
protected sayHello(): string {
return `My name is ${this.firstName} ${this.lastName}`;
}
}
class Employee extends Person {
department = '';
reviewPerformance(): void {
this.sayHello();
this.increasePay(5);
}
increasePay(percent: number): void{
// this.
}
}
const empl = new Employee();
empl.sayHello(); // ์ค๋ฅ ๋ฐ์
this.์์ ์๋์์ฑ ์ private์ธ age๋ ๋ณด์ด์ง ์๋๊ฒ ๋ณด์ธ๋ค.
sayHello๋ protected๋ก ์ ์ธ ๋์๊ธฐ ๋๋ฌธ์ ํด๋์ค ์ธ์คํด์ค์์๋ ์ ๊ทผ์ด ์๋๋ค.
class Person {
public firstName = '';
public lastName = '';
private age =0;
constructor(firstName: string, lastName: string, age: number){
this.firstName = firstName;
this.lastName = lastName;
this.age = age;
}
}
javascript
class Person {
constructor(public firstName: string,
public lastName: string,
private age: number){ }
}
const pers = new Person('John', 'Smith', 29)
console.log(`${pers.firstName} ${pers.lastName} ${pers.age}`)
js์์ age์์ ๋นจ๊ฐ ์ค์ด ํ์๋๋ค. => private์ด๊ธฐ ๋๋ฌธ.
โ ์ค์ ๋ก ๊ฐ๋ฐ ์ noEmitOnError์ต์ ์ ์ฌ์ฉํ์ฌ ๋ชจ๋ ์ค๋ฅ๊ฐ ์์ผ๋ฉด ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์์ฑํ๋๋ก ์ค์ ํ๋ค.
๐ 3.1.3 ๊ณ ์ ๋ณ์์ ์ฑ๊ธํค
ES6๋ถํฐ ํด๋์ค์ ๊ฐ ์ธ์คํด์ค๊ฐ ์ผ๋ถ ํ๋กํผํฐ๋ฅผ ๊ณต์ ํด์ผํ๋ ๊ฒฝ์ฐ ์ ์ ํ๋กํผํฐ๋ก ์ ์ธํฉ๋๋ค.
ํ์ ์คํฌ๋ฆฝํธ๋ static ํค์๋๋ฅผ ์ง์ํฉ๋๋ค.
static๊ณผ private์์ฑ์๋ก ์ฑ๊ธํค ๋์์ธ ํจํด์ ๊ตฌํํด๋ณด์.
class Gangsta {
static totalBullets = 100;
shoot(){
Gangsta.totalBullets--;
console.log(`Bullets left : ${Gangsta.totalBullets}`);
}
}
const g1 = new Gangsta();
g1.shoot(); // 99
const g2 = new Gangsta();
g2.shoot(); // 98
๋ ์ธ์คํด์ค๋ ๋์ผํ ๋ณ์ totalBullets๋ฅผ ๊ณต์ ํ๋ฏ๋ก 99 -> 98 ๋ก ๋ณํ๋ค.
shoot()์ this.totalBullets๋ ์ธ์คํด์ค ๋ณ์๊ฐ ์๋๊ธฐ ๋๋ฌธ์ ์ฌ์ฉํ์ง ์์์ต๋๋ค. staticํด๋์ค ๋ฉค๋ฒ ์์ ํด๋น ํด๋์ค ์ด๋ฆ์ ๋ถ์ด๋ฉด ์ ๊ทผ ๊ฐ๋ฅํฉ๋๋ค.
โ static์ธ ํด๋์ค ๋ฉค๋ฒ๋ ์๋ธํด๋์ค์ ๊ณต์ ๋์ง ์์ต๋๋ค.
SuperGangstaํด๋์ค๊ฐ Gangsta์ ์๋ธํด๋์ค๋ผ๋ฉด totalBullets ํ๋กํผํฐ๋ฅผ ๋ณต์ฌํด ๊ทธ๋๋ก ๊ฐ์ ธ์ต๋๋ค.
์ฐธ๊ณ : goo.gl/3BSnjZ
ํ ๊ณณ์์๋ง ์ฑ ์ ์ฒด ์ํ๋ฅผ ๊ด๋ฆฌํ๋ฉฐ, ์ธ๋ถ์์ ์ ๊ทผ ๊ฐ๋ฅํ ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด ๋ณด์.
์ ์ฒด ๋ฐ์ดํฐ๋ฅผ ํ ๊ณณ์์ ๊ด๋ฆฌํ๋ ์ฐ๋์น์ ๋จ์ผ ๋ฐ์ดํฐ ์์ค ๋๋ ๋จ์ผ ์ง์ค ๊ณต๊ธ์์ด๋ผ๊ณ ํจ.
๊ฐ์ฒด ์งํฅ ์ธ์ด์์ ๋จ ํ๋์ ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ ๋์์ธ ํจํด์ ์ฑ๊ธํค ์ด๋ผ๊ณ ํฉ๋๋ค.
new ํค์๋๋ก ์ํ๋ ๋งํผ ์ฌ๋ฌ ์ธ์คํด์ค๋ฅผ ์์ฑํ ์ ์๊ธฐ ๋๋ฌธ์ new ํค์๋์ฌ์ฉ์ ๋ง์์ผํฉ๋๋ค.
๋จ์ผ ์ธ์คํด์ค๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ?
ํด๋์ค ์์ฑ์๊ฐ private์ธ ๊ฒฝ์ฐ ํด๋์ค ๋ด์์๋ง ์ ๊ทผ ๊ฐ๋ฅํ๋ค๋ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
staticํค์๋๋ก ํด๋์ค ๋ฉ์๋๋ฅผ ์ ์ ๋ฉ์๋๋ก ๋ง๋ค๋ฉด ํน์ ์ธ์คํด์ค๊ฐ ์๋ ํด๋์ค์๋ง ์ํ๋๋ก ๋ง๋ค ์ ์์
๐ ์์
- AppState ์ฑ๊ธํค ๋์์ธ ํจํด์ผ๋ก counter๋ฅผ ๊ฐ์ง.
- counter๋ ์ธ๋ถ์์ ์ ๊ทผ ๊ฐ๋ฅํ๋ฉฐ ๋จ์ผ ์ธ์คํด์ค์์๋ง ๊ทธ ๊ฐ์ ์ ์ฅํจ.
- counter์ ๊ฐ์ ์ฝ๋ ๋ฉ์๋ ์ญ์ AppState ์ธ์คํด์ค์์ ๊ฐ์ ธ์ด.
class AppState{
counter = 0; // ์ฑ ์ํ๋ฅผ ๋ํ๋.
private static instanceRef: AppState;
private constructor() {}
static getInstance(): AppState{
if(AppState.instanceRef === undefined){
AppState.instanceRef = new AppState();
}
return AppState.instanceRef;
}
}
// const appState = new AppState(); // private ์์ฑ์ ๋๋ฌธ์ ์ค๋ฅ ๋ฐ์
// AppState ์ธ์คํด์ค์ ๋ํ ์ฐธ์กฐ๋ฅผ ๊ฐ์ ธ์ด.
const appState1 = AppState.getInstance();
const appState2 = AppState.getInstance();
appState1.counter++;
appState1.counter++;
appState2.counter++;
appState2.counter++;
console.log(appState1.counter)
console.log(appState2.counter)
AppStateํด๋์ค๋ private ์์ฑ์๊ฐ ์์ผ๋ฏ๋ก new ํค์๋๋ก ์์ฑ์ด ๋ถ๊ฐ.
getInstance() ๋ฉ์๋๋ก ์์ฑ์๋ฅผ ํธ์ถ ๊ฐ๋ฅ.
์ ์ ๋ฉ์๋๋ก ํฌ๋ ์ค ์ธ์คํด์ค๊ฐ ์์ ๋ ๋ฉ์๋๋ฅผ ํธ์ถํ ์ ์๋ค.
๐ 3.1.4 super() ๋ฉ์๋์ superํค์๋
- ์ํผํด๋์ค์ ์๋ธํด๋์ค๊ฐ ๊ฐ์์ด๋ฆ์ ๋ฉ์๋๋ฅผ ๊ฐ์ง๊ณ ์๋ค๋ฉด??
- ๋ ๋ค ๋ชจ๋ ์์ฑ์๊ฐ ์๋ค๋ฉด??
=> ๋ ๋ค ์์ฑ์๊ฐ ์๋ ๊ฒฝ์ฐ ์๋ธํด๋์ค์ ์์ฑ์๋ super()๋ฉ์๋๋ก ์ํผ ํด๋์ค์ ์์ฑ์๋ฅผ ํธ์ถํด์ผํจ.
// 3_3.ts
class Person3_3{
constructor(public firstname: string,
public lastName: string,
private age: number){} // ์ํผํด๋์ค Person์ ์์ฑ์
}
class Employee3_3 extends Person3_3{ // ์๋ธํด๋์ค Employee
constructor(firstName: string, lastName: string,
age: number, public department: string){ // employee ์์ฑ์
super(firstName, lastName, age); // ์ํผํด๋์ค ์์ฑ์๋ฅผ ํธ์ถํจ.
}
}
const empl = new Employee3_3('Joe', 'Smith', 29, 'Accounting'); // ์๋ธ ํด๋์ค๋ฅผ ์ธ์คํด์ค๋ฅผ ์์ฑํจ.
console.log(empl);
// ๊ฒฐ๊ณผ
/*
Employee3_3 {
firstname: 'Joe',
lastName: 'Smith',
age: 29,
department: 'Accounting'
}
*/
๋ ํด๋์ค ๋ชจ๋ ์์ฑ์๊ฐ ์์ผ๋ฉฐ, ๊ฐ ํ๋ผ๋ฏธํฐ๊ฐ ํ์ ํ๋ผ๋ฏธํฐ๋ก ํธ์ถ๋๋์ง ํ์ธํด์ผํจ.
Employee์ ์์ฑ์๋ new ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ ๋ ๋ง๋ค ์๋์ผ๋ก ํธ์ถ๋๋ฉฐ ์ํผ ํด๋์ค Person์ ์์ฑ์ ํธ์ถ์ ์ผ์ผ์ด ํด์ค์ผํจ.
department๋ฅผ ์ ์ธํ๊ณ ๋ Person๊ฐ์ฒด๋ฅผ ๊ตฌ์ฑํ๊ธฐ ์ํ ๊ฒ์ผ๋ก super()๋ฉ์๋๋ฅผ ํธ์ถํด Person์ ์ ๋ฌํจ.
๋์ผํ ์ด๋ฆ์ ๊ฐ์ง ์ํผ ํด๋์ค์ ๋ฉ์๋๋ฅผ ํธ์ถ ์ this๋์ super์ฌ์ฉโ
// 3_4.ts
class Person3_4{
constructor(public firstName: string,
public lastName: string,
private age: number){}
sellStock(symbol: string, numberOfShares: number){ // ๋ถ๋ชจ์ sellStock()
console.log(`Selling ${numberOfShares} of ${symbol}`);
}
}
class Employee3_4 extends Person3_4{
constructor(firstName: string, lastName: string,
age: number, public department: string){
super(firstName, lastName, age); // ๋ถ๋ชจ ์์ฑ์ ํธ์ถ
}
sellStock(symbol: string, shares: number){ // ์์์ sellStock()
super.sellStock(symbol, shares); // ๋ถ๋ชจ์์ sellStock() ํธ์ถ
this.reportToCompliance(symbol, shares);
}
private reportToCompliance(symbol: string, shares: number){ // reportToCompliance()๋ private ๋ฉ์๋
console.log(`${this.lastName} from ${this.department} sold ${shares} shares of ${symbol}`);
}
}
const empl3_4 = new Employee3_4('Joe', 'Smith', 29, 'Accounting');
empl3_4.sellStock('IBM', 100); // Employee ์์ sellStock ํธ์ถ.
// ๊ฒฐ๊ณผ
/*
Selling 100 of IBM
Smith from Accounting sold 100 shares of IBM
*/
reportToCompliance()๋ ํด๋์ค๋ด๋ถ์์๋ง ํธ์ถ๋ฉ๋๋ค.
superํค์๋๋ฅผ ํ์ฉํด ์ํผ ํด๋์ค์์ ์ ์ธํ ๋ฉ์๋์ ๊ธฐ๋ฅ์ ์ฌ์ฌ์ฉํ์ฌ ๋์์ ์๊ธฐ๋ฅ์ ์ถ๊ฐํจ.
์ ๋ฆฌ
๋ง์ง๋ง ์ค์ sellStock๋ก Employee3_4์ sellStock์ผ๋ก๊ฐ๊ณ , superํค์๋๋ฅผ ์ด์ฉํด Person3_4์ sellStock์ ์คํํ ํ Employee3_4์์ ์๋ reportToCompliance๋ฅผ ์คํ
๐ 3.1.5 ์ถ์ ํด๋์ค
์ถ์ ํด๋์ค๋ ๊ฐ์ฒด๋ก ๋ง๋ค ์ ์๋ ์ถ์์ ์ธ ๊ฐ๋ ์ผ๋ก ์ผ์กฐ์ผ์ด ์ค๊ณ๋ ์ญํ .
abstract ํค์๋๋ก ์ ์ธํจ.
์ถ์ ํด๋์ค๋ก๋ถํฐ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ฏ๋ก ์ธ์คํด์คํ ํ ์ ์๊ณ , ํ๋กํผํฐ์ ๋ฉ์๋๋ abstract๋ก ์ ์ธ ๊ฐ๋ฅ
โ why need?
๊ตฌ์ฒด์ ์ด์ง ์์ ๋ฉ์๋๋ฅผ ์๋ธ ํด๋์ค์ ์์ํด ํ์์์ ๋ ์์ธํ ๊ตฌํํ ์ ์๋ค.
๐ Example
Aํ์ฌ์์ ์ง์์ ์ ๊ท์ง๊ณผ ๊ณ์ฝ์ง์ผ๋ก ๊ตฌ๋ถ๋จ.
- constructor(name: string)
- changeAddress(newAddress: string)
- giveDayOff()
- promote(percent: number)
promote() ๋ฉ์๋๋ ํด์ผ์ ํ๋ฃจ ๋ ๋ถ์ฌํ๊ณ , ์ ํด์ง ๋น์จ๋งํผ ๊ธ์ฌ๋ฅผ ์ธ์ํฉ๋๋ค. - increasePay(percent: number)
increasePay() ๋ฉ์๋๋ ์ผ๋ฐ ์ ๊ท์ง ์ง์์ ๊ฒฝ์ฐ ์ฐ๊ฐ ๊ธ์ฌ๋ฅผ, ๊ณ์ฝ์ง์ ๊ฒฝ์ฐ ์๊ฐ๋น ๊ธ์ฌ๋ฅผ ์ธ์
์ ๋ฉ์๋๋ฅผ ํฌํจ์์ผ ์ง์์ ๊ฐ๋ฆฌํค๋ ํด๋์ค๋ฅผ ์ค๊ณํฉ๋๋ค.
์ด ๋ ๋จ ํ๋์ console.log()๋ง ์ฌ์ฉํ ์ ์์ต๋๋ค.
// 3_5.ts
abstract class Person3_5{
constructor(public name: string){};
changeAddress(newAddress: string){
console.log(`Changing address to ${newAddress}`);
}
giveDayOff(){
console.log(`Giving a day off to ${this.name}`);
}
promote(percent: number){
this.giveDayOff();
this.increasePay(percent); // ์ถ์๋ฉ์๋ ํธ์ถ
}
abstract increasePay(percent: number): void; // ์ถ์ ๋ฉ์๋๋ฅผ ์ ์ธ
}
giveDayOff()๋ฉ์๋๋ฅผ ์ธ๋ถ์์ ํธ์ถํ๋ ๊ฒ์ ๋ง์ผ๋ ค๋ฉด private๋ฅผ ์ ์ธํด์ผํจ.
giveDayOff()๋ฅผ Personํด๋์ค์ ์์ํด๋์ค์์๋ง ํธ์ถ์ ํ์ฉํ ๊ฒฝ์ฐ protected
์ค์ํ ์ ์ ์ถ์ ๋ฉ์๋๋ฅผ "ํธ์ถ"ํ๋ ๋ช ๋ น๋ฌธ์ ์์ฑํ ์ ์๋ค๋ ๊ฒ.
์ถ์ ํด๋์ค๋ ์ธ์คํด์คํํ ์ ์์ผ๋ ์ถ์ ๋ฉค๋ฒ(๊ตฌํ๋์ง ์์ ๋ฉ์๋)๋ ์ ๋ ํธ์ถ ์์.
์ธ์คํด์คํ ๊ฐ๋ฅํ ์ถ์ ํด๋์ค์ ์์์ ์์ฑํ๋ ค๋ฉด ๋ถ๋ชจ์ ๋ชจ๋ ์ถ์ ๋ฉ์๋๋ฅผ ๊ตฌํํด์ผํจ.
// 3_6.ts
class Employee3_6 extends Person3_5{
increasePay(percent: number){ // Employee๋ฅผ ์ํ increasePay()๋ฉ์๋๋ฅผ ๊ตฌํํจ.
console.log(`Increasing the salary of ${this.name} by ${percent}%`);
}
}
class Contractor3_6 extends Person3_5{
increasePay(percent: number){ // Contracte๋ฅผ ์ํ increasePay() ๋ฉ์๋๋ฅผ ๊ตฌํ
console.log(`Increasing the hourly rate of ${this.name} by ${percent}%`);
}
}
class A extends class B์ ๊ฒฝ์ฐ A๊ฐ B๋ฅผ ํ์ฅํ๋ค๋ ๋ป์ผ๋ก A๊ฐ ๋ ๋ง์ ํ๋กํผํฐ๋ฅผ ๊ฐ์ง๊ธฐ ๋๋ฌธ์ B๊ฐ ๋ ์ผ๋ฐ์ ์ด๊ณ , A๊ฐ ๋ ์์ธํ๋ค๊ณ ํ ์ ์์ต๋๋ค.
// 3_7.ts
// ... 3_5์ Person๊ณผ 3_6์ employee, contractor ์ฌ์ฉ.
const workers3_7: Person3_7[] = []; // ์๋ธ ํด๋์ค ํ์
์ ๋ฐฐ์ด๋ก ์ ์ธ.
workers3_7[0] = new Employee3_7('John');
workers3_7[1] = new Contractor3_7('Mary');
workers3_7.forEach(worker => worker.promote(5)); // ๊ฐ ๊ฐ์ฒด๋ง๋ค promote() ์คํ
// ๊ฒฐ๊ณผ
/*
Giving a day off to John
Increasing the salary of John by 5%
Giving a day off to Mary
Increasing the hourly rate of Mary by 5%
*/
๋ฐฐ์ด workers๋ personํ์ ์ ๋ฐฐ์ด๋ก ์์ ๊ฐ์ฒด์ ์ธ์คํด์ค๋ฅผ ์ ์ฅํจ.
โ Person์ ์์์ ์ค์ค๋ก ์์ฑ์๋ฅผ ์ ์ธํ์ง ์๊ธฐ ๋๋ฌธ์ Employee์ Contrator๊ฐ ์์ฑ๋ ๋ ๋ถ๋ชจ์ ์์ฑ์๊ฐ ์๋์ผ๋ก ํธ์ถ๋ฉ๋๋ค. ์ด๋ ์์๋ ์์ฑ์๋ฅผ ๊ฐ๊ณ ์์ง ์๋ค๋ฉด super()๋ก person์ ์์ฑ์๋ฅผ ํธ์ถํฉ๋๋ค.
์ด์ฒ๋ผ ์์์ ํตํด ๊ธฐ๋ฅ์ ํ์ฅํ๊ฑฐ๋ ๋ณ๊ฒฝํ๋ ๊ฒ์ ๋คํ์ฑ ์ด๋ผ๊ณ ํ๋ฉฐ ๊ฐ์ฒด ์งํฅ ์ธ์ด์ ํน์ง ์ค ํ๋์.
โ ์ธ์คํด์คํ ํ ์ ์๋ ํด๋์ค๋ฅผ ์ ์ธํด์ผ ํ์ง๋ง, ์๋ธ ํด๋์ค๋ ์ธ์คํด์คํ๊ฐ ๊ฐ๋ฅํจ.
์ํผ ํด๋์ค์ protected์์ฑ์๋ฅผ ์ ์ธํ๊ณ ์๋ธ ํด๋์ค ์์ฑ์์์ super() ๋ฉ์๋๋ก ํธ์ถ ๊ฐ๋ฅ.
์ถ์ ํด๋์ค ๊ธฐ๋ฅ์ ๋ชจ๋ฐฉํ ๋ฐฉ๋ฒ์ ๋๋ค.
protected์์ฑ์๋ฅผ ๊ฐ์ง ํด๋์ค๋ฅผ ๊ทธ ์์ฒด๋ก ์ถ์์ผ๋ก ์ ์ธํด์ผ ์ถ์ ๋ฉ์๋๋ฅผ ์ ์ธํ ์ ์์ต๋๋ค.
๐ 3.1.6 ๋ฉ์๋ ์ค๋ฒ๋ก๋ฉ
๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ ๋ฉ์๋ ์ค๋ฒ๋ก๋ฉ์ ์ง์ํจ.
ํ๋ผ๋ฏธํฐ์ ์ ํ๊ณผ ๊ฐ์๋ ๋ค๋ฅด์ง๋ง ์ด๋ฆ์ด ๊ฐ์ ๋ฉ์๋๋ฅผ ์ฌ๋ฌ๊ฐ ๊ฐ์ง์ ์๊ฒ ๋ง๋๋ ๊ฒ.
ํ์ ์ธ์ด์์ ํ์ ์ด ์๋ ํ๋ผ๋ฏธํฐ๋ฅผ ๊ฐ์ง ํด๋์ค ๋ฉ์๋๋ฅผ ํธ์ถํ ์ ์์ผ๋ฏ๋ก ํ๋ผ๋ฏธํฐ ํ์ ๊ณผ ๋ฐํ๊ฐ์ ๋ช ์ํ์ฌ ๋ฉ์๋๋ฅผ ๋ง๋ค์ด์ผํจ.
ํ์
์คํฌ๋ฆฝํธ๋ ํจ์ ๋ด ํ๋ผ๋ฏธํฐ ๊ฐ์๋ฅผ ์ฒ์๋ณด๋ค ๋ ๋ง์ด ํน์ ๋ ์ ๊ฒ ๋ง๋ค ์ ์์ต๋๋ค.
๋ฌผ๋ก ๋ฉ์๋๋ด์์ ์ ๋ฌ๋ ๊ฐ์ฒด๊ฐ ๋ฌธ์ ๊ฐ ์๋ค๋ฉด ๋ฐํ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
// 3_8.ts
class ProductService3_8{
getProducts(){ // getProducts ๋ฉ์๋๋ ํ๋ผ๋ฏธํฐ๊ฐ ์์
console.log(`Getting all products`);
}
getProducts(id: number){ // ์ค๋ฅ๋ฐ์ -> getProducts()๋ฉ์๋๋ 1๊ฐ ํ๋ผ๋ฏธํฐ๋ฅผ ๊ฐ์ง.
console.log(`Getting the product info for ${id}`);
}
}
const prodService = new ProductService3_8();
prodService.getProducts(123);
prodService.getProducts();
์ค๋ณต ํจ์ ๊ตฌํ์ค๋ฅ๋ฅผ ์ผ์ผํด.
์ค๋ฅ๊ฐ ์๋ TS์ง๋ง, JS์์๋ ์ ํจํจ.
class ProductService3_9{
// ํ์ฉ๊ฐ๋ฅํ ๋ฉ์๋๋ค์ ์ ์ธ
getProducts();
getProducts(id: number);
// ๋ฉ์๋๋ฅผ ๊ตฌํ
getProducts(id?: number){ // ์ค๋ฅ๋ฐ์ -> getProducts()๋ฉ์๋๋ 1๊ฐ ํ๋ผ๋ฏธํฐ๋ฅผ ๊ฐ์ง.
typeof id === 'number' ? console.log(`Getting the product info for ${id}`) : console.log(`Getting all Products`)
}
}
const prodService = new ProductService3_9();
prodService.getProducts(123);
prodService.getProducts();
getProducts(id?: number)
?๋ ํด๋น ํ๋ผ๋ฏธํฐ๋ฅผ ์ ํ ์ฌํญ์ผ๋ก ์ ์ธํ๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
์๋ต์ Overload signature is not compatible with function implementation
์ด๋ผ๋ ์ค๋ฅ ๋ฐ์.
! ์์ชฝ์ ๋จผ์ ์ ์ธํ ํ์ฉ ๊ฐ๋ฅํ ๋ฉ์๋๋ค์ ์๋ตํด๋ ํ๋ก๊ทธ๋จ ๋์์ ๋ณํ์ง ์์.
IDE๋ด getProducts()ํจ์์ ์๋ ์์ฑ ๊ธฐ๋ฅ์ ๋์์ฃผ๋ ์ญํ ์ ํจ.
์์ฑ๋ JSํ์ผ์ ๋ด๋ getProducts(id)๋ง ๋จ์์์
๋ฉ์๋ ์๊ทธ๋์ณ๋ฅผ ์ค๋ฒ๋ก๋ํด ๋ค๋ฅธ ํ๋ผ๋ฏธํฐ๋ฅผ ๊ฐ์ง ์ ์์ ๋ฟ ์๋๋ผ ๋ค๋ฅธ ํ์ ๊ฐ์ ๋ฐํํ ์ ์์.
๋ค์ ์ฝ๋๋ 2๊ฐ์ง ๋ฐฉ๋ฒ์ผ๋ก ํธ์ถ ๊ฐ๋ฅ.
- product์ description์ ์ ๋ฌํ๊ณ Productํ์ ์ธ ๋ฐฐ์ด์ ๋ฐํ.
- product์ id๋ฅผ ์ ๋ฌํ๊ณ Product ํ์ ์ธ ๊ฐ์ฒด๋ฅผ ๋ฐํ
// 3_10.ts
interface Product3_10{
id: number;
description: string;
}
class ProductService3_10{
getProducts(description: string): Product3_10[]; // ์ฒซ๋ฒ์งธ
getProducts(id:number): Product3_10; // ๋๋ฒ์งธ
getProducts(product: number | string): Product3_10[] | Product3_10{ // ๋ฉ์๋๊ตฌํ
if(typeof product === 'number'){ // id๋ก ๋ฉ์๋๊ฐ ํธ์ถ๋์๋์ง ํ์ธ
console.log(`Getting the product info for id ${product}`);
return {id: product, description: 'great product'};
}else if(typeof product ==='string'){ // description์ผ๋ก ํธ์ถ๋์๋์ง ํ์ธ
console.log(`Getting product with description ${product}`);
return [{id: 123, description: 'blue jeans'}, {id: 789, description: 'blue jeans'}];
} else{
return {
id: -1,
description: 'Error: getProducts() accept only number or string as args'
}
}
}
}
const prodService3_10 = new ProductService3_10();
console.log(prodService3_10.getProducts(123));
console.log(prodService3_10.getProducts('blue jeans'));
๋ฐํ๋ ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ฉด, ๊ฐ์ฒด์ ๋ฐฐ์ด๋ก ๋ฐํ๋๊ฑธ ๋ณผ ์ ์์ต๋๋ค.
๐ ์ค๋ฒ๋ก๋ฉ ์์ฑ์
ํ์ ์คํฌ๋ฆฝํธ ํด๋์ค๋ constructor ํค์๋๋ก ์์ฑ์๋ฅผ ๋ง๋ ๋ค.
// 3_11.ts
class Product3_11{
id: number;
description: string;
constructor(); // ์์ฑ์ ์ ์ธ ๋ด ํ๋ผ๋ฏธํฐ๊ฐ ์์. (์์ฑ์ ์ ์ธ)
constructor(id: number); // ์์ฑ์ ์ ์ธ ๋ด ํ๊ฐ์ ํ๋ผ๋ฏธํฐ๊ฐ ์์. (์์ฑ์ ์ ์ธ)
constructor(id: number, description: string); // 2๊ฐ์ ํ๋ผ๋ฏธํฐ๊ฐ ์์. (์์ฑ์ ์ ์ธ)
constructor(id?: number, description?: string){
// ์ด๊ณณ์ ์์ฑ์๋ฅผ ๊ตฌํ
// ๋ชจ๋ ๊ฐ๋ฅํ ํ๋ฆฌ๋ฏธํฐ๋ฅผ ๋ค๋ฃจ๋ ์์ฑ์๋ฅผ ๊ตฌํ (์์ฑ์ ์ ์ธ)
}
}
ํ๋ผ๋ฏธํฐ๊ฐ ์๋ ์์ฑ์๋ ํ์ฉํ๊ธฐ ๋๋ฌธ์ ์์ฑ์ ๊ตฌํ์์ ๋ชจ๋ ํ๋ผ๋ฏธํฐ๋ฅผ ์ ํ๊ฐใน ์ ์๊ฒ ๋ง๋ค์์.
๊ฐ์ฒด ์์ฑ ์ด๊ธฐํ๋ฅผ ์ํด ์ค๋ฒ๋ก๋ฉ ์์ฑ์๊ฐ ์ ์ผํ ์ ๋ต์ ์๋๋ค.
์๋ฅผ ๋ค์ด ์์ฑ์์ ์ฌ์ฉ๋๋ ๋ชจ๋ ํ๋ผ๋ฏธํฐ๋ฅผ ๋ํ๋ด๋ ใด์ธํฐํ์ด์ค๋ฅผ ์ ์ธํ ์ ์๋ค.
์ธํฐํ์ด์ค๋ ์ ํ์ ํ๋กํผํฐ๋ฅผ, ํฌ๋ ์ค๋ ์ ํ์ ํ๋ผ๋ฏธํฐ๋ฅผ ์ทจํ๋ ๋จ์ผ ์์ฑ์๋ฅผ ๊ฐ์ง.
// 3_12.ts
interface ProductProperties3_12{ // ProductProperties๋ ๋ ๊ฐ์ ์ ํ์ ํ๋ผ๋ฏธํฐ๋ฅผ ๊ฐ์ง
id?: number,
description?: string;
}
class Product3_12{
id: number;
description: string;
constructor(properties?: ProductProperties3_12){
// ํด๋์ค ์์ฑ์๋ ProductProperties ํ์
์ธ ์ ํ์ ํ๋ผ๋ฏธํฐ๋ฅผ ๊ฐ์ง.
// ์ด๊ณณ์ ์์ฑ์๋ฅผ ๊ตฌํ
}
}
์ ๋ฆฌ
ํ์ ์คํฌ๋ฆฝํธ์์ ์ค๋ฒ๋ก๋ฉ ๋ฉ์๋๋ ์์ฑ์๋ฅผ ์ฌ์ฉํ ๋ ์ฃผ์๊ฐ ํ์ํจ.
์ค๋ฒ๋ก๋ฉ์ ์ฌ์ฉํ๋ฉด ์ฌ๋ฌ ๋ฐฉ๋ฒ์ผ๋ก ๋ฉ์๋๋ฅผ ํธ์ถํ ์ ์์ง๋ง, ๋ก์ง์ ์ฝ๊ณ ํ๋จํ๊ธฐ ํ๋ค์ด ์ง ์ ์์ต๋๋ค.
์ค๋ฒ๋ก๋ฉ ์ฌ์ฉ์ ์ ์ ํ๋ ๊ฒ์ด ์ผ๋ฐ์ .
Author And Source
์ด ๋ฌธ์ ์ ๊ดํ์ฌ([TypeScript] ๐ณ 3.1 ํด๋์ค ์ฌ์ฉ), ์ฐ๋ฆฌ๋ ์ด๊ณณ์์ ๋ ๋ง์ ์๋ฃ๋ฅผ ๋ฐ๊ฒฌํ๊ณ ๋งํฌ๋ฅผ ํด๋ฆญํ์ฌ ๋ณด์๋ค https://velog.io/@cjh951114/TypeScript-3.1-ํด๋์ค-์ฌ์ฉ์ ์ ๊ท์: ์์์ ์ ๋ณด๊ฐ ์์์ URL์ ํฌํจ๋์ด ์์ผ๋ฉฐ ์ ์๊ถ์ ์์์ ์์ ์ ๋๋ค.
์ฐ์ํ ๊ฐ๋ฐ์ ์ฝํ ์ธ ๋ฐ๊ฒฌ์ ์ ๋ (Collection and Share based on the CC Protocol.)
์ข์ ์นํ์ด์ง ์ฆ๊ฒจ์ฐพ๊ธฐ
๊ฐ๋ฐ์ ์ฐ์ ์ฌ์ดํธ ์์ง
๊ฐ๋ฐ์๊ฐ ์์์ผ ํ ํ์ ์ฌ์ดํธ 100์ ์ถ์ฒ ์ฐ๋ฆฌ๋ ๋น์ ์ ์ํด 100๊ฐ์ ์์ฃผ ์ฌ์ฉํ๋ ๊ฐ๋ฐ์ ํ์ต ์ฌ์ดํธ๋ฅผ ์ ๋ฆฌํ์ต๋๋ค