소개
타입스크립트는 자바스크립트에 강력한 타입 시스템을 추가하여 더욱 안전하고 유지보수 가능한 코드를 작성할 수 있도록 지원합니다. 이 중 Class와 Interface는 객체지향 프로그래밍에서 핵심적인 역할을 수행하는 두 가지 개념입니다. 이 글에서는 Class와 Interface의 개념, 차이점, 그리고 사용 예시를 통해 자세히 알아보겠습니다.
Class (클래스)
- 정의: 객체를 생성하기 위한 템플릿입니다. 클래스는 속성(property)과 메서드(method)를 정의하며, 이를 기반으로 객체를 생성할 수 있습니다.
- 특징:
- 상속: 다른 클래스를 상속하여 기능을 확장할 수 있습니다.
- 생성자: 객체 생성 시 초기화 작업을 수행하는 특별한 메서드입니다.
- 접근 제한자: public, private, protected 키워드를 사용하여 멤버에 대한 접근을 제한할 수 있습니다.
- 예시:
class Person {
public name: string;
private age: number;
constructor(name: string, age: number) {
this.name = name;
this.age = age;
}
greet() {
console.log(`Hello, my name is ${this.name}`);
}
}
const person1 = new Person('Alice', 30);
person1.greet (); // Hello, my name is Alice
Interface (인터페이스)
- 정의: 객체가 가져야 할 속성과 메서드의 형태를 정의하는 추상적인 타입입니다. 클래스는 인터페이스를 구현하여 해당 인터페이스에서 정의된 멤버를 가지게 됩니다.
- 특징:
- 구현: 클래스는 implements 키워드를 사용하여 인터페이스를 구현합니다.
- 타입 검사: 인터페이스는 컴파일 시 타입 검사를 강화하여 오류를 미리 방지합니다.
- 다중 상속: 클래스는 여러 개의 인터페이스를 구현할 수 있습니다.
- 예시:
interface Shape {
area(): number;
}
class Circle implements Shape {
radius: number;
constructor(radius: number) {
this.radius = radius;
}
are a(): number {
return Math.PI * this.radius * this. radius;
}
}
const circle = new Circle(5);
console.log(circle.area()); // 78.53981633974483
Class와 Interface의 차이점
특징 Class Interface
개념 | 객체 생성 템플릿 | 객체의 형태 정의 |
구현 | 속성, 메서드를 직접 구현 | 속성, 메서드의 형태만 정의 |
상속 | 다른 클래스 상속 가능 | 클래스가 구현 |
다형성 | 오버라이딩 가능 | 다중 구현 가능 |
인스턴스 생성 | 가능 | 불가능 |
언제 어떤 것을 사용해야 할까요?
- Class:
- 객체를 생성하고 복잡한 로직을 구현해야 할 때
- 상속을 통해 코드를 재사용하고 확장해야 할 때
- Interface:
- 타입을 명확히 하고 코드의 가독성을 높이고 싶을 때
- 다양한 객체들이 공통적으로 가져야 할 형태를 정의하고 싶을 때
- 함수의 매개변수나 반환 값의 타입을 제한하고 싶을 때
결론
Class와 Interface는 타입스크립트에서 객체지향 프로그래밍을 구현하는 데 필수적인 요소입니다. Class를 사용하여 객체를 생성하고, Interface를 사용하여 객체의 형태를 정의함으로써 더욱 안전하고 유지보수 가능한 코드를 작성할 수 있습니다.
주의: 위 예시는 간단한 예시이며, 실제 개발에서는 더욱 복잡하고 다양한 상황에서 Class와 Interface를 활용하게 됩니다.
핵심:
- Class는 객체의 청사진이고, Interface는 객체의 계약입니다.
- Class는 구체적인 구현을 포함하고, Interface는 추상적인 형태만 정의합니다.
- 적절한 Class와 Interface를 사용하여 코드의 가독성과 유지보수성을 높일 수 있습니다.
더 깊이 있는 학습을 위해 추가 학습 요소
1. 추상 클래스 (Abstract Class)
정의: 클래스를 부분적으로 구현하고, 자식 클래스에서 나머지 부분을 구현하도록 강제하는 클래스입니다. 추상 클래스는 직접 인스턴스화할 수 없으며, 자식 클래스에서 상속받아 사용해야 합니다.
특징:
- 추상 메서드: 구현 없이 메서드의 시그니처만 정의하는 메서드입니다. 자식 클래스에서 반드시 구현해야 합니다.
- 부분적인 구현: 추상 클래스는 공통적인 속성과 메서드를 구현하고, 자식 클래스에서 특정 기능을 추가하도록 할 수 있습니다.
abstract class Animal {
name: string;
constructor(name: string) {
this.name = name;
}
abstract makeSound(): void; // 추상 메서드
}
class Dog extends Animal {
makeSound() {
console.log('멍멍');
}
}
const dog = new Dog('멍멍이');
dog.makeSound(); // 멍멍
2. 제네릭 (Generics)
정의: 코드의 재사용성을 높이고, 다양한 타입의 데이터를 안전하게 처리하기 위해 사용되는 기능입니다. 제네릭은 타입을 매개변수처럼 사용하여 코드를 작성할 수 있도록 합니다.
특징:
- 타입 안전성: 컴파일 시 타입 체크를 통해 오류를 미리 방지합니다.
- 코드 재사용성: 다양한 타입의 데이터를 처리하는 함수나 클래스를 하나로 만들 수 있습니다.
function identity<T>(arg: T): T {
return arg;
}
let output = identity<string>("myString"); // 타입을 명시적으로 지정
3. 네임스페이스 (Namespace)
정의: 코드를 논리적으로 분리하고 충돌을 방지하기 위해 사용하는 기능입니다. 네임스페이스는 모듈 시스템이 도입되기 전에 많이 사용되었으며, 여전히 유용한 경우가 있습니다.
특징:
- 코드 조직화: 큰 프로젝트에서 코드를 모듈화하여 관리하기 쉽게 합니다.
- 충돌 방지: 동일한 이름의 변수나 함수를 다른 네임스페이스에 정의하여 이름 충돌을 방지합니다.
namespace MyMath {
export function square(x: number) {
return x * x;
}
}
console.log(MyMath.square(5)); // 25
4. 모듈 (Module)
정의: 코드를 독립적인 단위로 분리하여 관리하는 기능입니다. 모듈은 다른 모듈에 의존하거나, 다른 모듈에 의존될 수 있습니다.
특징:
- 모듈 시스템: CommonJS, AMD, ES Modules 등 다양한 모듈 시스템을 지원합니다.
- 코드 재사용성: 모듈을 재사용하여 대규모 프로젝트를 효율적으로 개발할 수 있습니다.
- 의존성 관리: npm과 같은 패키지 관리 시스템을 사용하여 모듈의 의존성을 관리합니다.
// myModule.ts
export function greet(name: string) {
console.log(`Hello, ${name}!`);
}
// main.ts
import { greet } from './myModule';
greet('Alice');
추가 학습 방향
- 타입스크립트 컴파일 옵션: tsc 컴파일러 옵션을 이용하여 다양한 설정을 할 수 있습니다.
- 데코레이터: 클래스, 메서드, 프로퍼티에 추가적인 메타데이터를 제공하는 기능입니다.
- 믹스인: 여러 클래스의 기능을 합성하여 새로운 클래스를 만들 수 있는 기법입니다.
- 조건부 타입: 타입을 동적으로 조건에 따라 결정할 수 있습니다.
- 매핑된 타입: 기존 타입을 기반으로 새로운 타입을 생성할 수 있습니다.
참고: 위 내용은 타입스크립트의 핵심적인 기능들을 간략하게 설명한 것입니다. 더 자세한 내용은 공식 문서나 관련 자료를 참고하시기 바랍니다.
TypeScript 공식 문서: https://www.typescriptlang.org/docs/handbook/intro.html
'Dev > TypeScript' 카테고리의 다른 글
TypeScript : Namespaces and Modules (2) | 2024.09.30 |
---|---|
TypeScript : Triple-Slash Directives (0) | 2024.09.30 |
TypeScript Call Signatures / Dictionary (0) | 2024.09.27 |
TypeScript / 타입스크립트 개념 및 활용 (0) | 2024.09.26 |
[공식문서-Handbook] Everyday Types(언어의 원시 타입들) (0) | 2023.10.04 |