[TS] 인터페이스 (Interface)



01


인터페이스 (Interface)

인터페이스는 타입을 정의할 때 사용하는 문법 중 하나이며, 타입 별칭과 비슷한 기능을 합니다.

하지만 인터페이스는 상속이나 합침 같은 특수한 기능을 제공합니다.

1. 선택적 프로퍼티

인터페이스에서는 ?를 사용하여 선택적 프로퍼티,

즉 해당 프로퍼티가 있어도 되고, 없어도 되는 경우를 정의할 수 있습니다.

interface Person {
  name: string;
  age?: number;  // age는 선택적 프로퍼티
}

const person1: Person = { name: "John" }; // age가 없어도 됨
const person2: Person = { name: "Jane", age: 25 }; // age가 있어도 됨

 

2. 읽기 전용 프로퍼티

readonly 키워드를 사용하면 해당 프로퍼티는 읽기 전용이 됩니다. 즉, 한 번 값이 설정되면 변경할 수 없습니다.

interface Person {
  readonly name: string;
}

const person: Person = { name: "John" };
// person.name = "Jane";  // ❌ 오류: name은 읽기 전용이라 값을 변경할 수 없음

 

3. 메서드 타입 정의

인터페이스에서는 메서드의 타입도 정의할 수 있습니다.

 

✅ 함수 타입 표현식

interface Person {
  name: string;
  sayHi: () => void; // 함수 타입 표현식
}

 

✅ 호출 시그니처

interface Person {
  name: string;
  sayHi(): void;  // 호출 시그니처
}

 

이렇게 두 방식 모두 메서드의 타입을 정의하는 방식인데, 호출 시그니처를 사용하면 메서드 오버로딩이 가능해집니다.

 

 

4. 메서드 오버로딩

인터페이스에서 함수 타입 표현식을 사용하면 오버로딩이 불가능합니다.

그러나 호출 시그니처를 사용하면 오버로딩을 구현할 수 있습니다.

interface Person {
  name: string;
  sayHi(): void;              // 기본 sayHi
  sayHi(a: number): void;     // 매개변수 하나를 받는 sayHi
  sayHi(a: number, b: number): void;  // 매개변수 두 개를 받는 sayHi
}

 

5. 하이브리드 타입

인터페이스는 함수이자 객체하이브리드 타입을 정의할 수 있습니다.

interface Func2 {
  (a: number): string;  // 함수
  b: boolean;            // 객체
}

const func: Func2 = (a) => "hello";
func.b = true;


02


인터페이스 확장하기

1. 인터페이스 확장

인터페이스는 다른 인터페이스를 확장할 수 있습니다. 확장을 하면 중복된 코드를 줄일 수 있습니다.

interface Animal {
  name: string;
  color: string;
}

interface Dog extends Animal {
  breed: string;
}

const dog: Dog = {
  name: "돌돌이",
  color: "brown",
  breed: "진도",
};

 

2. 인터페이스 확장 시 프로퍼티 재정의

확장하면서 기존 프로퍼티의 타입을 재정의할 수 있습니다. 단, 기존 타입보다 좁은 타입으로만 재정의 가능합니다.

interface Animal {
  name: string;
  color: string;
}

interface Dog extends Animal {
  name: "doldol"; // "doldol"로 타입을 고정
  breed: string;
}

이와 같은 방식으로 재정의가 가능하지만,

타입이 확장되는 과정에서 재정의된 타입더 좁은 타입이어야 한다는 점을 유의해야 합니다.

 

기존 타입보다 더 좁은 타입으로만 재정의할 수 있습니다.

interface Dog extends Animal {
  name: number; // ❌ 오류 발생
}

 

3. 타입 별칭 확장

인터페이스는 타입 별칭으로 정의된 객체도 확장할 수 있습니다.

type Animal = {
  name: string;
  color: string;
};

interface Dog extends Animal {
  breed: string;
}

 

4. 다중 확장

인터페이스는 여러 개의 인터페이스를 동시에 확장할 수도 있습니다.

interface DogCat extends Dog, Cat {}


03


인터페이스 선언 합치기

인터페이스는 선언 합침을 지원합니다. 같은 이름의 인터페이스가 여러 번 선언되면, 그 내용이 자동으로 합쳐집니다.

interface Person {
  name: string;
}

interface Person {
  age: number;
}

const person: Person = {
  name: "이정환",
  age: 27,
};

 

하지만, 같은 프로퍼티가 다른 타입으로 정의되면 충돌이 발생하여 오류가 납니다.

interface Person {
  name: string;
}

interface Person {
  name: number; // ❌ 오류 발생
}


03


마무리

인터페이스는 타입 정의 시 매우 유용한 도구입니다. 선택적 프로퍼티, 읽기 전용, 메서드 정의, 하이브리드 타입 등 다양한 기능을 제공하며, 확장합침을 통해 코드의 재사용성과 유연성을 높일 수 있습니다.

기능 설명 상세 내용
선택적 프로퍼티 프로퍼티를 필수로 지정하지 않음 `age?: number;`처럼 정의하고, 객체에 해당 프로퍼티를 생략할 수 있음
읽기 전용 프로퍼티 한 번 설정된 값을 변경할 수 없음 `readonly` 키워드로 값을 읽기 전용으로 설정할 수 있음
메서드 타입 정의 메서드의 타입을 정의함 함수 타입 표현식 또는 호출 시그니처로 메서드 타입을 정의
메서드 오버로딩 메서드의 여러 버전을 정의할 수 있음 호출 시그니처를 사용하면 메서드 오버로딩이 가능
하이브리드 타입 함수이자 객체인 타입 정의 함수처럼 사용하면서도 속성을 가질 수 있는 타입을 정의 가능
인터페이스 확장 기존 인터페이스를 확장하여 코드 재사용 `extends` 키워드를 사용해 다른 인터페이스를 확장할 수 있음
다중 확장 여러 개의 인터페이스를 동시에 확장할 수 있음 `extends`를 사용해 여러 인터페이스를 동시에 확장 가능
선언 합침 같은 이름의 인터페이스가 여러 번 선언되면 합쳐짐 같은 이름의 인터페이스를 여러 번 선언하면 자동으로 합쳐짐

 

 

 

'DEVELOPMENT > Typescript' 카테고리의 다른 글

[TS] 제네릭 (Generics)  (1) 2025.03.03
[TS] 클래스 (class)  (1) 2025.03.01
[TS] 함수와 타입  (1) 2025.02.27
[TS] 타입 시스템  (0) 2025.02.26
[TS] 타입 계층과 변환 개념 (업캐스팅, 다운캐스팅, unknown, never)  (0) 2025.02.25