2023. 3. 19. 18:21γμΈμ΄/Javascript(Node, TS...)
νμ μ€ν¬λ¦½νΈμ μΈν°νμ΄μ€μ μλ°μ μΈν°νμ΄μ€λ μλ‘ μ μ¬ν ꡬ쑰μ λͺ©νλ₯Ό κ°μ§λ§,
μ΄μ© λ°©μκ³Ό λλΆμ΄ μΈμ΄μ μ°¨μ΄μμ μ€λ μλ λ°©μμμ μ°¨μ΄κ° μ‘΄μ¬νμ¬ μ΄λ₯Ό μ 리νκ³ μ νλ€.
Interfaceλ?
μΈν°νμ΄μ€λ κ°μ²΄μ§ν₯ ν¨λ¬λ€μμμ λ‘μ§μ ꡬμ±ν λ μΆμνμ μμ‘΄ν μ μκ² ν΄μ£Όμ΄
κ²°κ³Όμ μΌλ‘ μΊ‘μν, λ€νμ±μ λ¬μ±νκΈ° μ½κ² ν΄μ£Όλ λꡬμ΄λ€.
ꡬ체μ μΌλ‘,
μΈν°νμ΄μ€λ μ΄λ₯Ό ꡬ체νν κ°μ²΄κ° κ°μ ΈμΌ ν λ©μλ(νλ)μ νμ μ 보λ₯Ό λͺ μνλ μν μ νλ€.
μ€μ ꡬνμ ν¬ν¨μν€μ§ μμΌλ©°, μ½λ μμμλ μ€μ ꡬν체λ₯Ό μ§μ μμ‘΄νλ κ²μ΄ μλ μΆμν μΈν°νμ΄μ€λ₯Ό μμ‘΄νκ² λ‘μ§μ μμ±νμ¬
μμ‘΄νλ κ°μ²΄λ‘ νμ¬κΈ ν΄λΉ κ°μ²΄μ μΈλΆ ꡬνμ μμ§ λͺ»ν΄λ νλ ₯μ΄ κ°λ₯νλλ‘ λλλ€.(μΊ‘μν)
μΈν°νμ΄μ€μ μΈν°νμ΄μ€μ ꡬν체μ κ΄κ³λ₯Ό has-A κ΄κ³λΌκ³ νλλ°,
μ΄λ νΉμ ꡬνμ²΄κ° λμμ λ€μν μΈν°νμ΄μ€λ₯Ό μμν μ μμμ λ΄ν¬νλ€.
TS vs Java
μ»΄νμΌ νμμ νμ κ²μ¬ λ°©μ
// Typescript
interface Human {
name: string;
job: string;
setInfo(name: string, job: string): void;
introduce(): string;
}
// Java
interface Human {
int MAX_AGE = 100;
void setInfo(String name, String job);
String introduce();
}
νμ μ€ν¬λ¦½νΈμ μλ°μμ μΈν°νμ΄μ€λ₯Ό μ μΈνλ λ°©μμ μμ κ°λ€.
λμ λͺ¨λ Human μΈν°νμ΄μ€λ₯Ό ꡬνν κ°μ²΄κ° κ°μ ΈμΌ ν λ©μλλ₯Ό λͺ μμ μΌλ‘ μ μΈνκ³ μλ€.
μ μ½λλ₯Ό ν΅ν΄ μ μ μλ μ°¨μ΄μ μ,
νμ μ€ν¬λ¦½νΈμμλ μΈν°νμ΄μ€μμ μΈλΆλ‘ λ ΈμΆν νλ‘νΌν°μ λν μ€μ λ κ°λ₯ν λ°λ©΄, μλ°μμλ λΆκ°λ₯νλ€λ μ κ³Ό
νμ μ€ν¬λ¦½νΈμμλ μΈν°νμ΄μ€ λ΄μμ μΈν°νμ΄μ€μ μμλ₯Ό μ μΈν μ μμ§λ§, μλ°μμλ μμ μ μΈμ΄ κ°λ₯νλ€λ μ μ΄λ€.
(μ μΈμ΄ λ¨μ intλ‘ λμ΄ μμ§λ§ μ»΄νμΌ λ¨κ³μμ μ μ λ‘ static finalμ΄ μΆκ°λμ΄ μμκ° λλ€.)
λν μ μ½λ μμμλ νμΈν μ μλ μ°¨μ΄μ λ μ‘΄μ¬νλ€.
첫λ²μ§Έλ λ°λ‘ μ»΄νμΌ μ νμ κ²μ¬λ₯Ό μννλ λ°©μμ μ°¨μ΄μ΄λ€.
κ²°λ‘ λΆν° λ§νμλ©΄
νμ μ€ν¬λ¦½νΈλ ꡬ쑰μ νμ΄ν(Structural Typing) λ°©μμΌλ‘ κ²μ¬λ₯Ό μννλ λ°λ©΄,
μλ°λ λͺ λͺ©μ νμ΄ν(Nominal Typing) λ°©μμΌλ‘ κ²μ¬λ₯Ό μννλ€.
λ¨Όμ νμ μ€ν¬λ¦½νΈμ κ²½μ°μ΄λ€.
// Typescript
interface IHuman {
name: string;
job: string;
setInfo(name: string, job: string):void;
introduce(): string;
}
class Student {
name: string = "";
job: string = "";
setInfo(name: string, job: string) {
this.name = name;
this.job = job;
}
introduce() {
return `my name is ${this.name} and my job is ${this.job}`;
}
}
// Studentκ° μ§μ μ μΌλ‘ IHumanμ μμνμ§ μμμμλ νμ
λ°μΈλ©μ λ¬Έμ x
const student: IHuman = new Student();
student.setInfo("Luka", "developer");
console.log(student.introduce());
μμ λ³΄μΈ Human μΈν°νμ΄μ€μ
μ΄λ₯Ό μ§μ μ μΌλ‘ μμ(implements)νμ§λ μμμ§λ§ κ·Έμ λ§κ² λ΄λΆ ꡬνμ ꡬμ±ν Student ν΄λμ€κ° μλ€.
μ΄ λ μ¬λ°λ κ²μ μ½λ νλ¨μ student λ³μμ ν΄λμ€μΈ Studentκ° IHuman μΈν°νμ΄μ€λ₯Ό μ§μ μ μΌλ‘ μμνμ§ μμμμλ, λ΄λΆ ꡬνμ΄ μ΄λ₯Ό λ§μ‘±νλ€λ κ²λ§μΌλ‘ νμ λ°μΈλ©μ΄ κ°λ₯νλ€.
μ΄λ¬ν νΉμ±μ ꡬ쑰μ νμ΄ν(Strutural Typing)μ΄λΌκ³ νλ€.
λ€μμ μλ°μ κ²½μ°μ΄λ€.
// IHuman.java
interface IHuman {
int MAX_AGE = 100;
void setInfo(String name, String job);
String introduce();
}
// Student.java
class Student {
static final int MAX_AGE = 100;
String name;
String job;
void setInfo(String name, String job) {
this.name = name;
this.job = job;
}
String introduce() {
return "my name is " + this.name + " and my job is " + this.job;
}
}
// Test.java
public class Test {
public static void main(String[] args) {
// IHuman νμ
μ Student μΈμ€ν΄μ€λ₯Ό λ°μΈλ©ν μ μλ€λ μ»΄νμΌ μλ¬ λ°μ
IHuman student = new Student();
student.setInfo("luka","developer");
System.out.println(student.introduce());
}
}
μμ λμΌνκ² μλ°μ κ²½μ°μμλ IHuman μΈν°νμ΄μ€λ₯Ό μ§μ μμνμ§λ μμ§λ§,
λ΄λΆ ꡬνμ κ·Έλλ‘ λ°λ₯΄λ Student ν΄λμ€λ₯Ό λ§λ€μλ€.
μ΄ λ μλ°μμλ νμ μ€ν¬λ¦½νΈμλ λ¬λ¦¬ μ»΄νμΌ μλ¬κ° λ°μνλ€.
μλ°μμλ μ»΄νμΌ νμμμ νμ κ²μ¬ μ μΈν°νμ΄μ€μ λ΄λΆ ꡬ쑰λ₯Ό λ°λ₯΄λμ§ νμΈμ νλ κ²μ΄ μλ, μΈν°νμ΄μ€μ μ΄λ¦ μ체λ₯Ό κ°μ§κ³ κ²μ¬λ₯Ό μννκΈ° λλ¬Έμ΄λ€.
μ΄λ¬ν νΉμ±μ λͺ λͺ©μ νμ΄ν(Nominal Typing)μ΄λΌκ³ νλ€.
λ°νμμμμ μ‘΄μ¬ μ¬λΆ
μΈν°νμ΄μ€μ λν΄ μλ°μ νμ μ€ν¬λ¦½νΈκ° κ°λ λλ²μ§Έ μ°¨μ΄λ λ°λ‘ λ°νμμμμ μ‘΄μ¬ μ¬λΆμ΄λ€.
νμ μ€ν¬λ¦½νΈμμ μΈν°νμ΄μ€λ₯Ό μμ±νμ¬ μλ°μ€ν¬λ¦½νΈλ‘ μ»΄νμΌνλ©΄ μ΄λ»κ² λ κΉ?
// human.interface.ts
interface Human {
name: string;
job: string;
setInfo(name: string, job: string): void;
introduce(): string;
}
μ μ½λλ₯Ό μ»΄νμΌν κ²½μ° λ€μμ κ²°κ³Όλ¬Όμ΄ λνλλ€.
// human.interface.js
"use_strict"
(μ무 κ²λ μλ€!)
κ²°κ³Όλ¬Όμμ μ μ μλ―μ΄ νμ μ€ν¬λ¦½νΈμμ μΈν°νμ΄μ€λ μ»΄νμΌ μ μ¬λΌμ Έ λ²λ¦°λ€.
μ¦ μ»΄νμΌ νμκΉμ§λ§ μ ν¨ν κ°λ μ΄κ³ , λ°νμμμλ μ½λλ‘μ μ‘΄μ¬νμ§ μλλ€.
νμ μ€ν¬λ¦½νΈλ₯Ό ν΅ν΄ λ‘μ§μ μμ±ν΄λ³΄μλ€λ©΄, λꡬλ νμ κ°λλ₯Ό νλ² μ―€μ μμ±ν΄λ³΄μμ κ²μ΄λ€.
νμ κ°λλ λ°νμμμ νΉμ κ°μ²΄κ° ν΄λΉ κ°μ²΄μ νμ μ΄ κ°μ ΈμΌ ν λ©μλμ νλ‘νΌν°κ° λͺ¨λ μ μ‘΄μ¬νλμ§ νμΈνκ³
κ·Έ κ²°κ³Όμ λ°λΌ booleanμ λ°ννλ μΌμ’ μ λ°νμ νμ κ²μ¬λ₯Ό μννλ λ‘μ§μ΄λΌ μκ°νλ©΄ λλ€.
νμ μ€ν¬λ¦½νΈμμ νμ κ°λλ₯Ό λ°λ‘ μμ±ν΄μ£Όμ΄μΌ νλ κΉλμ, κ²°κ΅ λ°νμμμ μΈν°νμ΄μ€μ κ°μ νμ μ΄ μ‘΄μ¬νμ§ μκΈ° λλ¬Έμ΄λ€.
κ·Έλ λ€λ©΄ μλ°μ κ²½μ°μλ μ΄λ¨κΉ.
μλ°μ κ²½μ°, μΈν°νμ΄μ€κ° λ°νμμμ λ°μ΄νΈ μ½λμ ννλ‘ μ‘΄μ¬νλ€.
λ°λΌμ μλμ κ°μ λ‘μ§λ κ°λ₯νλ€.
// Student ν΄λμ€κ° Human μΈν°νμ΄μ€μ ꡬν체λΌκ³ κ°μ
const student = new Student();
// studentκ° Humanμ μ€μ²΄νμΈμ§ νμΈ
if(student instanceof Human) {
...
} else {
...
}
λ§μ½ νμ μ€ν¬λ¦½νΈμλ€λ©΄,
if λ¬Έ λ΄μμ student μΈμ€ν΄μ€κ° Humanμμ μ μν νΉμ±λ€μ λͺ¨λ ꡬννκ³ μλμ§ μΌμΌμ΄ νμΈνμ΄μΌ ν κ²μ΄λ€.
'μΈμ΄ > Javascript(Node, TS...)' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
Interface vs Abstract Class (in Typescript) (0) | 2023.03.19 |
---|---|
TypeScript νμ : any, unknown, never (0) | 2023.03.09 |
NodeJS Child_processμ spawn(), exec(), fork() (0) | 2023.03.05 |