Interface vs Abstract Class (in Typescript)

2023. 3. 19. 19:39ㆍ언어/Javascript(Node, TS...)

객체지ν–₯ νŒ¨λŸ¬λ‹€μž„μ—μ„œ 빼놓을 수 μ—†λŠ” κ°œλ…μ΄ λ°”λ‘œ μΈν„°νŽ˜μ΄μŠ€μ™€ 좔상 ν΄λž˜μŠ€μ΄λ‹€.

이듀은 λͺ¨λ‘ 각자λ₯Ό 상속할 κ΅¬ν˜„μ²΄κ°€ μˆ˜ν–‰ν•  행동을 μΆ”μƒν™”ν•˜μ—¬ λͺ…μ‹œν•˜κ³  이λ₯Ό ꡬ체화할 것을 κ°•μ œν•œλ‹€.

λ˜ν•œ μ΄λ“€λ§ŒμœΌλ‘œλŠ” μΈμŠ€ν„΄μŠ€λ₯Ό 생성할 수 μ—†λ‹€λŠ” 곡톡점도 μ‘΄μž¬ν•œλ‹€.

κ²°κ΅­ νŠΉμ • μΈμŠ€ν„΄μŠ€κ°€ 좔상화에 μ˜μ‘΄ν•˜κ²Œ ν•˜μ—¬,

결둠적으둜 객체지ν–₯ νŒ¨λŸ¬λ‹€μž„μ˜ λ‹€ν˜•μ„±, μΊ‘μŠν™”λΌλŠ” κ³΅ν†΅μ˜ λͺ©ν‘œλ₯Ό μ†μ‰½κ²Œ λ‹¬μ„±ν•˜κ²Œ ν•΄ μ€€λ‹€.

λ‹€λ§Œ 이듀 κ°„μ—λŠ” λΆ„λͺ…ν•œ 차이가 μ‘΄μž¬ν•˜κΈ° λ•Œλ¬Έμ—

이λ₯Ό μ˜ˆμ‹œλ₯Ό 톡해 μ •λ¦¬ν•˜κ³ μž ν•œλ‹€.

 

Interface vs Abstract Class

μ˜ˆμ‹œλ₯Ό μœ„ν•΄ μœ„ UML의 관계λ₯Ό κ΅¬ν˜„ν•˜κ² λ‹€.

Interface μ˜ˆμ‹œ

// μΈν„°νŽ˜μ΄μŠ€
interface IHuman {
    spendOneDay(): void;
    work(): string;
}

// μΈν„°νŽ˜μ΄μŠ€ κ΅¬ν˜„
class Student implements IHuman {
    spendOneDay(): void {
        console.log("기상...!");

        console.log(this.work());

        console.log("수면...!");
    }

    work() {
        return "ν•™κ΅μ—μ„œ κ³΅λΆ€ν•©λ‹ˆλ‹€.";
    }
}

// μΈν„°νŽ˜μ΄μŠ€(좔상화)에 νƒ€μž… 의쑴
const student:IHuman = new Student();
student.spendOneDay();

// 컴파일 μ—λŸ¬ λ°œμƒ 
console.log(student instanceof IHuman);

Abstract Class μ˜ˆμ‹œ

// 좔상 클래슀
abstract class Human {
    spendOneDay() {
        console.log("기상...!");

        console.log(this.work());

        console.log("수면...!");
    }

    abstract work(): string;
}

// 좔상 ν΄λž˜μŠ€μ— λŒ€ν•œ μžμ‹ 클래슀(κ΅¬ν˜„)
class Student extends Human{
    work() {
        return "ν•™κ΅μ—μ„œ κ³΅λΆ€ν•©λ‹ˆλ‹€.";
    }
}

// 좔상 클래슀(좔상화)에 νƒ€μž… 의쑴
const student: Human = new Student();
student.spendOneDay();

// μ •μƒμ μœΌλ‘œ true λ°˜ν™˜
console.log(student instanceof Human);

비ꡐ

1. λ‚΄λΆ€ 둜직 포함 μ—¬λΆ€

μΈν„°νŽ˜μ΄μŠ€ μ˜ˆμ‹œλ₯Ό 듀여닀보면 μΈν„°νŽ˜μ΄μŠ€ λ‚΄μ—λŠ” ν•΄λ‹Ή μΈν„°νŽ˜μ΄μŠ€κ°€ κ΅¬ν˜„μ„ κ°•μ œν•  λ©”μ„œλ“œμ˜ 이름과 인자, λ°˜ν™˜ νƒ€μž… 만이 λͺ…μ‹œλ˜μ–΄μžˆλ‹€.

그와 달리 좔상 클래슀 λ‚΄μ—λŠ” μΈν„°νŽ˜μ΄μŠ€μ™€ λ§ˆμ°¬κ°€μ§€μΈ λ©”μ„œλ“œλ„ μ‘΄μž¬ν•˜λŠ” 반면(abstract λ©”μ„œλ“œ), μ‹€μ œ 둜직이 μž‘μ„±λœ λ©”μ„œλ“œλ„ μ‘΄μž¬ν•œλ‹€.

λ”°λΌμ„œ 첫번째 μ°¨μ΄λŠ” μ‹€μ œ λŸ°νƒ€μž„μ—μ„œ μž‘λ™ν•˜λŠ” μ½”λ“œκ°€ ν¬ν•¨λ˜μ–΄ μžˆλŠ”μ§€ 여뢀이닀.

좔상 ν΄λž˜μŠ€λŠ” 보톡 μžμ‹ ν΄λž˜μŠ€μ—μ„œ κ³΅μœ ν•  곡톡 λ‘œμ§μ„ λΆ€λͺ¨ 좔상 ν΄λž˜μŠ€μ— μž‘μ„±ν•˜μ—¬

λΆˆν•„μš”ν•œ μ½”λ“œ 재반볡 및 ν–₯ν›„ μˆ˜μ • μ†Œμš”λ₯Ό μ€„μ΄λŠ” λ°©μ‹μœΌλ‘œ ν™œμš©ν•œλ‹€.

 

2. μžμ‹ 클래슀 κ΅¬ν˜„ 방식

μΈν„°νŽ˜μ΄μŠ€ μ˜ˆμ‹œλ₯Ό 보면, Student ν΄λž˜μŠ€κ°€ IHuman μΈν„°νŽ˜μ΄μŠ€μ— μ˜μ‘΄ν•œλ‹€λŠ” 것을 λͺ…μ‹œν•˜κΈ° μœ„ν•΄ implementsλ₯Ό μ‚¬μš©ν•œλ‹€. 

반면 좔상 클래슀 λ°©μ‹μ—μ„œλŠ” extendsλ₯Ό μ‚¬μš©ν•˜μ—¬ λΆ€λͺ¨ 클래슀λ₯Ό μƒμ†ν•˜κ²Œ λœλ‹€.

μ—¬κΈ°μ„œ μ•Œ 수 μžˆλŠ” λ‘λ²ˆμ§Έ μ°¨μ΄λŠ” μžμ‹ 클래슀 κ΅¬ν˜„ μ‹œ μ‚¬μš©ν•˜λŠ” implements, extends 여뢀이닀.

implements와 extendsμ—λŠ” 차이가 μ‘΄μž¬ν•˜λŠ”λ°,

implementsλ₯Ό ν†΅ν•΄μ„œλŠ” μ—¬λŸ¬ μΈν„°νŽ˜μ΄μŠ€λ₯Ό λ™μ‹œμ— 상속할 수 μžˆλŠ” 반면 extendsλ₯Ό ν†΅ν•΄μ„œλŠ” 였직 ν•˜λ‚˜μ˜ λΆ€λͺ¨ 클래슀λ₯Ό κ°€μ§ˆ 수 μžˆλ‹€.

λ”°λΌμ„œ implementsλ₯Ό μ‚¬μš©ν•˜λŠ” 관계λ₯Ό has-A 관계,

extendsλ₯Ό μ‚¬μš©ν•˜λŠ” 관계λ₯Ό is-A 관계라고 ν•œλ‹€.

 

3. λŸ°νƒ€μž„μ— 쑴재 μ—¬λΆ€

각 μ˜ˆμ‹œμ˜ κ°€μž₯ λ§ˆμ§€λ§‰ 라인을 보면 instanceof λ₯Ό μ΄μš©ν•˜μ—¬ ν•΄λ‹Ή μΈμŠ€ν„΄μŠ€κ°€ λ¬΄μ—‡μ—μ„œ νŒŒμƒλœ μΈμŠ€ν„΄μŠ€μΈμ§€ ν™•μΈν•˜λŠ” 둜직이 μ‘΄μž¬ν•œλ‹€.

ν•΄λ‹Ή λ‘œμ§μ€ 좔상 클래슀 λ°©μ‹μ—μ„œλŠ” λ¬Έμ œμ—†μ΄ μž‘λ™ν•˜μ§€λ§Œ,

μΈν„°νŽ˜μ΄μŠ€ λ°©μ‹μ—μ„œλŠ” 컴파일 μ—λŸ¬κ°€ λ°œμƒν•œλ‹€.

μ΄μœ λŠ” λ°”λ‘œ μΈν„°νŽ˜μ΄μŠ€λŠ” 컴파일 μ‹œ μ‚¬λΌμ§€λŠ”, λŸ°νƒ€μž„μ—μ„œ μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” μ½”λ“œμ΄κΈ° λ•Œλ¬Έμ΄λ‹€.

μžλ°”μ™€ 같은 언어와 달리, νƒ€μž…μŠ€ν¬λ¦½νŠΈμ—μ„œλŠ” μΈν„°νŽ˜μ΄μŠ€κ°€ 컴파일 νƒ€μž„μ—λ§Œ μ‘΄μž¬ν•˜κ²Œ λœλ‹€. 

λ”°λΌμ„œ μΈν„°νŽ˜μ΄μŠ€λ₯Ό ν†΅ν•œ 좔상화λ₯Ό κ΅¬ν˜„ν•œ λ‘œμ§μ—μ„œ ν•΄λ‹Ή 객체가 μ–΄λ–€ μΈν„°νŽ˜μ΄μŠ€μ˜ κ΅¬ν˜„μ²΄μΈμ§€ ν™•μΈν•˜κΈ° μœ„ν•΄μ„œλŠ” 

νƒ€μž… κ°€λ“œλ₯Ό λ”°λ‘œ μž‘μ„±ν•΄μ£Όμ–΄μ•Όν•œλ‹€.

반면 좔상 ν΄λž˜μŠ€λŠ” 컴파일 μ‹œ 일반 클래슀둜 λ³€ν™˜λ˜μ–΄ λŸ°νƒ€μž„μ—λ„ μ‘΄μž¬ν•˜κΈ° λ•Œλ¬Έμ— instanceofλ₯Ό ν†΅ν•œ κ°„νŽΈν•œ νƒ€μž… 비ꡐ가 κ°€λŠ₯ν•˜λ‹€.

즉 μ„Έλ²ˆμ§Έ μ°¨μ΄λŠ” λŸ°νƒ€μž„μ— μ½”λ“œκ°€ μ‘΄μž¬ν•˜λŠ”μ§€μ— λŒ€ν•œ 여뢀이닀.

 

κ²°λ‘ 

μΈν„°νŽ˜μ΄μŠ€μ™€ 좔상 클래슀 λͺ¨λ‘ νƒ€μž…μŠ€ν¬λ¦½νŠΈ ν™˜κ²½μ—μ„œ 좔상화에 μ˜μ‘΄ν•œ λ‘œμ§μ„ μž‘μ„±ν•  수 있게 λ„μ™€μ£ΌλŠ” 도ꡬ이닀.

이λ₯Ό 잘 ν™œμš©ν•˜λ©΄, ν–₯ν›„ μ„ΈλΆ€ μš”κ΅¬μ‚¬ν•­μ΄ μΆ”κ°€λ˜λ”λΌλ„ κΈ°μ‘΄ μ½”λ“œλ₯Ό μˆ˜μ •ν•˜μ§€ μ•ŠλŠ” μ„ μ—μ„œ λŒ€μ²˜κ°€ κ°€λŠ₯ν•˜λ‹€.

기쑴에 잘 μž‘λ™ν•˜κ³  μžˆλŠ” μ½”λ“œλ₯Ό μˆ˜μ •ν•˜λŠ” 것은 항상 μ—λŸ¬λ₯Ό μˆ˜λ°˜ν•˜κΈ° λ•Œλ¬Έμ— ν™•μž₯성을 κ³ λ €ν•œ μ½”λ“œλ₯Ό μž‘μ„±ν•˜λŠ” 것은 맀우 μ€‘μš”ν•˜λ‹€.

μž‘μ„±λœ 글을 보면 좔상 클래슀 방식이 더 이점이 λ§Žλ‹€κ³  착각할 수 μžˆμ§€λ§Œ,

좔상 클래슀 방식도 κ²°κ΅­ λΆ€λͺ¨μ™€ μžμ‹ κ°„μ˜ 결합도λ₯Ό λ†’μ΄λŠ” 섀계이기 λ•Œλ¬Έμ—

μΆ”κ°€ μš”κ΅¬ 사항에 μ˜ν•΄ λΆ€λͺ¨ 클래슀의 둜직이 μˆ˜μ •λ˜μ–΄μ•Ό ν•˜λŠ” 상황이 왔을 λ•Œ μœ μ—°ν•œ λŒ€μ²˜κ°€ νž˜λ“€ μˆ˜λ„ μžˆλ‹€.

λ”°λΌμ„œ νŠΈλ ˆμ΄λ“œμ˜€ν”„λ₯Ό 잘 κ³ λ €ν•˜μ—¬ μ μ ˆν•œ 섀계λ₯Ό ν•˜λŠ” 것이 μ€‘μš”ν•˜λ‹€.

'μ–Έμ–΄ > Javascript(Node, TS...)' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

Interface in TS (vs Java)  (0) 2023.03.19
TypeScript νƒ€μž…: any, unknown, never  (0) 2023.03.09
NodeJS Child_process의 spawn(), exec(), fork()  (0) 2023.03.05