TypeScript의 interface는 객체의 구조를 정의하는 데 사용되는 문법입니다. 이는 클래스나 객체가 특정한 형태를 따르도록 강제할 수 있어, 코드의 일관성을 유지하고 오류를 줄이는 데 도움이 됩니다. interface를 사용하면 객체의 타입을 명확하게 정의하고, 해당 객체가 가져야 할 프로퍼티와 메서드를 선언할 수 있습니다.
주요 역할
타입 검사: 객체가 특정 구조를 따르는지 확인하여 타입 안전성을 보장합니다.
코드 가독성 향상: 객체의 형태를 명확히 정의하여 코드의 가독성과 유지보수성을 향상시킵니다.
재사용성: 동일한 구조를 따르는 여러 객체에서 인터페이스를 재사용할 수 있습니다.
기본 사용법
인터페이스 정의
interface User {
name: string;
age: number;
email?: string; // 선택적 프로퍼티
}
위 인터페이스는 User라는 이름으로 정의되었으며, name, age, 그리고 선택적인 email 프로퍼티를 갖습니다.
인터페이스 사용
코드 복사
const user1: User = {
name: "John",
age: 30,
email: "john@example.com",
};
const user2: User = {
name: "Jane",
age: 25,
};
위 예제에서 user1과 user2 객체는 User 인터페이스를 따르므로, TypeScript는 이들이 User 구조를 만족하는지 확인합니다.
인터페이스의 확장
인터페이스는 상속을 통해 다른 인터페이스를 확장할 수 있습니다.
코드 복사
interface Person {
name: string;
age: number;
}
interface Employee extends Person {
employeeId: number;
}
const employee: Employee = {
name: "Alice",
age: 28,
employeeId: 1234,
};
위 예제에서 Employee 인터페이스는 Person 인터페이스를 확장하므로, Person의 모든 프로퍼티와 employeeId 프로퍼티를 포함합니다.
함수 타입 정의
인터페이스는 함수 타입도 정의할 수 있습니다.
코드 복사
interface Greet {
(name: string): string;
}
const sayHello: Greet = (name: string) => {
return `Hello, ${name}`;
};
위 예제에서 Greet 인터페이스는 문자열을 인수로 받아 문자열을 반환하는 함수 타입을 정의합니다.
클래스와 인터페이스
클래스는 인터페이스를 구현할 수 있습니다. 이는 클래스가 인터페이스의 구조를 따르도록 강제합니다.
코드 복사
interface Animal {
name: string;
makeSound(): void;
}
class Dog implements Animal {
name: string;
constructor(name: string) {
this.name = name;
}
makeSound() {
console.log("Woof! Woof!");
}
}
const myDog = new Dog("Buddy");
myDog.makeSound(); // Woof! Woof!
위 예제에서 Dog 클래스는 Animal 인터페이스를 구현하여 name 프로퍼티와 makeSound 메서드를 정의합니다.
인터페이스의 합침
인터페이스는 동일한 이름으로 여러 번 선언할 수 있으며, TypeScript는 이를 자동으로 병합합니다.
코드 복사
interface Box {
height: number;
width: number;
}
interface Box {
color: string;
}
const myBox: Box = {
height: 20,
width: 10,
color: "red",
};
위 예제에서 Box 인터페이스는 두 번 선언되었지만, TypeScript는 이를 하나의 인터페이스로 병합합니다.
요약
TypeScript의 interface는 객체의 구조를 정의하고 타입 검사를 통해 코드의 안정성과 일관성을 높이는 데 중요한 역할을 합니다. 인터페이스는 객체, 함수, 클래스와 함께 사용되며, 상속, 확장, 병합 등의 기능을 통해 유연하고 재사용 가능한 코드를 작성하는 데 기여합니다.