타입스크립트에서 상속은 어떻게 이루어지나요?
_____A1: 타입스크립트에서는 `extends` 키워드를 사용해 클래스 간 상속을 선언합니다. 예를 들어,
```typescript
class Parent {
greet() {
console.log("Hello from Parent");
}
}
class Child extends Parent {
// Child는 Parent의 greet 메서드를 상속합니다.
}
```
Q2: 상속받은 클래스에서 부모 생성자를 호출하려면 어떻게 해야 하나요?
A2: 자식 클래스 생성자에서 `super()`를 호출하여 부모 클래스의 생성자를 실행해야 합니다. 예:
```typescript
class Parent {
constructor(public name: string) {}
}
class Child extends Parent {
constructor(name: string, public age: number) {
super(name); // 부모 생성자 호출
}
}
```
Q3: 메서드 오버라이딩은 어떻게 하나요?
A3: 자식 클래스 내에서 부모 클래스와 동일한 이름의 메서드를 다시 정의하면 오버라이딩 됩니다. 예:
```typescript
class Parent {
greet() {
console.log("Hello from Parent");
}
}
class Child extends Parent {
greet() {
console.log("Hello from Child");
}
}
```
Q4: 부모 클래스 메서드를 오버라이드 하면서 호출하는 방법은?
A4: 자식 클래스 메서드 내에서 `super.메서드명()`을 사용해 부모 메서드를 호출할 수 있습니다. 예:
```typescript
class Parent {
greet() {
console.log("Hello from Parent");
}
}
class Child extends Parent {
greet() {
super.greet(); // 부모 메서드 호출
console.log("Hello from Child");
}
```
Q5: 상속받은 프로퍼티는 어떻게 접근하나요?
A5: 부모 클래스의 프로퍼티는 자식 클래스 내에서 `this` 키워드를 통해 접근할 수 있습니다.
```typescript
class Parent {
protected name: string = "Parent";
}
class Child extends Parent {
showName() {
console.log(this.name); // "Parent"
}
}
```
Q6: 타입스크립트에서 다중 상속이 가능한가요?
A6: 클래스는 단일 상속만 지원하며, 다중 상속은 불가능합니다. 하지만 인터페이스를 다중 구현하는 방식으로 유사한 효과를 낼 수 있습니다.
```typescript
interface A { /* ... */ }
interface B { /* ... */ }
class C implements A, B { /* ... */ }
```
Q7: 상속받은 클래스의 접근 제한자 규칙은 어떻게 되나요?
A7:
- `public`: 어디서나 접근 가능
- `protected`: 자식 클래스 및 해당 클래스 내에서만 접근 가능
- `private`: 해당 클래스 내에서만 접근 가능, 자식 클래스에서는 접근 불가
Q8: 추상 클래스를 상속받는 방법은?
A8: 추상 클래스는 `abstract` 키워드를 붙이며, 추상 메서드를 자식 클래스가 반드시 구현해야 합니다. 예:
```typescript
abstract class Animal {
abstract makeSound(): void;
move(): void {
console.log("Moving...");
}
}
class Dog extends Animal {
makeSound() {
console.log("Bark");
}
}
```
Q9: 부모 클래스의 생성자가 없는 경우에도 상속이 가능한가요?
A9: 네, 부모 클래스에 생성자가 없으면 기본 생성자가 자동으로 생성되므로 자식 클래스가 `super()`를 호출하면 문제없이 상속할 수 있습니다.
Q10: 상속과 인터페이스 구현의 차이점은?
A10:
- 상속(`extends`)은 코드 구현을 물려받고 사용할 수 있게 합니다.
- 인터페이스 구현(`implements`)은 클래스가 특정 타입 구조를 만족하도록 강제하는 역할이며, 실제 구현 코드를 제공하지 않습니다.
타입스크립트는 자바스크립트를 기반으로 하므로, 자바스크립트의 프로토타입 기반 상속과 클래스 기반 상속을 모두 지원합니다.
여기서는 클래스 기반 상속에 대해 자세히 설명하겠습니다.
1. 클래스 정의 타입스크립트에서 클래스를 정의하는 기본 문법은 다음과 같습니다: ```typescript class Animal { constructor(public name: string) {} speak() { console.log(`${this.name} makes a noise.`); } } ``` 위의 코드에서 `Animal` 클래스는 `name`이라는 속성을 가지고 있으며, `speak`라는 메서드를 정의하고 있습니다.
2. 상속 상속을 구현하기 위해서는 `extends` 키워드를 사용합니다.
자식 클래스는 부모 클래스의 속성과 메서드를 상속받으며, 필요에 따라 추가적인 속성이나 메서드를 정의할 수 있습니다.
```typescript class Dog extends Animal { speak() { console.log(`${this.name} barks.`); } } ``` 위의 코드에서 `Dog` 클래스는 `Animal` 클래스를 상속받고, `speak` 메서드를 오버라이드(재정의)하여 개의 소리를 출력하도록 변경했습니다.
3. 생성자와 super() 자식 클래스에서 생성자를 정의할 때는 반드시 부모 클래스의 생성자를 호출해야 합니다.
이를 위해 `super()` 함수를 사용합니다.
```typescript class Cat extends Animal { constructor(name: string) { super(name); // 부모 클래스의 생성자 호출 } speak() { console.log(`${this.name} meows.`); } } ``` 위의 `Cat` 클래스는 `Animal` 클래스를 상속받으며, 생성자에서 `super(name)`을 호출하여 부모 클래스의 생성자를 실행합니다.
4. 접근 제어자 타입스크립트는 `public`, `private`, `protected`와 같은 접근 제어자를 지원합니다.
이를 통해 클래스의 속성과 메서드에 대한 접근을 제어할 수 있습니다.
- `public`: 모든 클래스에서 접근 가능 - `private`: 해당 클래스 내에서만 접근 가능 - `protected`: 해당 클래스와 그 자식 클래스에서 접근 가능 ```typescript class Animal { protected name: string; constructor(name: string) { this.name = name; } } class Dog extends Animal { speak() { console.log(`${this.name} barks.`); } } ``` 위의 코드에서 `name` 속성은 `protected`로 선언되어, `Animal` 클래스와 `Dog` 클래스에서 접근할 수 있지만, 외부에서는 접근할 수 없습니다.
5. 다중 상속 타입스크립트는 클래스의 다중 상속을 지원하지 않습니다.
그러나 인터페이스를 사용하여 다중 상속의 효과를 낼 수 있습니다.
여러 인터페이스를 구현하는 클래스를 정의할 수 있습니다.
```typescript interface CanRun { run(): void; } interface CanBark { bark(): void; } class Dog implements CanRun, CanBark { run() { console.log("Dog is running."); } bark() { console.log("Dog barks."); } } ``` 위의 코드에서 `Dog` 클래스는 `CanRun`과 `CanBark` 두 개의 인터페이스를 구현하고 있습니다.
6. 정적 메서드와 속성 정적 메서드와 속성은 클래스의 인스턴스가 아닌 클래스 자체에 속합니다.
상속받은 클래스에서도 정적 메서드와 속성을 사용할 수 있습니다.
```typescript class Animal { static numberOfLegs: number = 4; static getLegs() { return this.numberOfLegs; } } class Dog extends Animal {} console.log(Dog.getLegs()); // 4 ```
7. 타입스크립트에서 상속은 코드의 재사용성을 높이고, 객체 지향 프로그래밍의 원칙을 따르는 데 중요한 역할을 합니다.
클래스와 인터페이스를 통해 상속을 구현함으로써, 더 구조적이고 유지보수하기 쉬운 코드를 작성할 수 있습니다.
상속을 적절히 활용하면 코드의 중복을 줄이고, 기능을 확장하는 데 유용합니다.
작성자:
최지윤 [비회원]
| 작성일자: 1년 전
2024-09-10 05:32:09
조회수: 119 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
조회수: 119 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
내용이 부정확하다면 싫어요를 클릭해주세요.