[TypeScript] OOP 관행, 클래스 및 상속

이번 글에서는 클래스와 상속을 중심으로 객체 지향 프로그래밍(OOP) 사례를 살펴봅니다. 이러한 개념을 통해 실제 엔티티를 구조화되고 유지 관리 가능한 방식으로 모델링할 수 있습니다. 모듈식 재사용 가능한 코드 작성에 대한 인사이트를 제공하는 TypeScript에서 OOP의 심층적인 내용을 살펴보세요.

1. 클래스

클래스는 프로퍼티와 메서드가 있는 객체를 만들기 위한 청사진입니다. 코드에서 실제 엔티티를 모델링하는 방법을 제공합니다.

기본 클래스 예제:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Animal {
// 속성
name: string;
age: number;

// 생성자
constructor(name: string, age: number) {
this.name = name;
this.age = age;
}

// 메서드
makeSound(): void {
console.log('Some generic sound');
}
}

// Animal 클래스의 인스턴스 생성
const myAnimal = new Animal('Leo', 5);

console.log(myAnimal.name); // Output: Leo

myAnimal.makeSound(); // Output: Some generic sound

이 예제에서 Animal은 속성(nameage), 이러한 속성을 초기화하는 생성자, 메서드(makeSound)를 가진 클래스입니다.

2. 상속

상속을 사용하면 클래스가 다른 클래스로부터 프로퍼티와 메서드를 상속하여 코드 재사용을 촉진하고 계층적 관계를 만들 수 있습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
class Dog extends Animal {
// 추가 속성
breed: string;

// 생성자
constructor(name: string, age: number, breed: string) {
// 기본 클래스(Animal)의 생성자 호출하기
super(name, age);

// 파생 클래스 속성 초기화
this.breed = breed;
}

// makeSound 메서드 재정의
makeSound(): void {
console.log('Woof! Woof!');
}

// Dog 전용 추가 메서드
fetch(): void {
console.log('Fetching the ball!');
}
}

// Dog 클래스의 인스턴스 생성
const myDog = new Dog('Buddy', 3, 'Labrador');

console.log(myDog.name); // Output: Buddy
console.log(myDog.breed); // Output: Labrador

myDog.makeSound(); // Output: Woof! Woof!
myDog.fetch(); // Output: Fetching the ball!

이 예제에서 DogAnimal의 서브클래스입니다. Animal의 프로퍼티와 메서드를 상속받으며 자체 프로퍼티와 메서드를 가질 수도 있습니다. super 키워드는 기본 클래스의 생성자를 호출하는 데 사용됩니다.

3. 접근 제어자

접근 제어자(Access Modifier)는 클래스 멤버(프로퍼티 및 메서드)의 표시 여부를 제어합니다. 타입스크립트는 public, private, protected 접근 제어자를 지원합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Person {
private age: number;

constructor(private name: string, age: number) {
this.age = age;
}

getDetails(): string {
return `${this.name}, ${this.age} years old.`;
}
}

const john = new Person('John', 30);

console.log(john.getDetails()); // Output: John, 30 years old.

// console.log(john.age); // Error: Property 'age' is private and only accessible within class 'Person'.

이 예제에서 ageprivate로 표시되어 Person 클래스 내에서만 액세스할 수 있습니다.

4. 추상 클래스

추상 클래스는 인스턴스화할 수 없는 클래스이며 다른 클래스의 베이스 클래스로 사용되는 경우가 많습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
abstract class Shape {
abstract calculateArea(): number;
}

class Circle extends Shape {
constructor(private radius: number) {
super();
}
calculateArea(): number {
return Math.PI * this.radius ** 2;
}
}

const myCircle = new Circle(5);
console.log(myCircle.calculateArea()); // Output: 78.53981633974483

여기서 ShapecalculateArea() 추상 메서드를 가진 추상 클래스입니다. Circle 클래스는 Shape를 확장하고 calculateArea()에 대한 구현을 제공합니다.

결론

타입스크립트에서 클래스와 상속을 사용하는 이러한 OOP 관행을 사용하면 모듈화되고 재사용 가능하며 체계적으로 정리된 코드를 만들 수 있습니다. 이를 통해 실제 엔티티와 관계를 반영하는 방식으로 복잡한 시스템을 모델링할 수 있습니다.

Share