TypeScript와 Java의 interface는 몇 가지 유사점과 차이점이 있습니다. 두 언어 모두 인터페이스를 사용하여 객체의 구조를 정의하고, 특정 계약을 강제하는 데 사용하지만, 구현 방식과 기능에는 차이가 있습니다.
계약 정의: 두 언어 모두 인터페이스를 사용하여 클래스가 구현해야 하는 메서드와 속성을 정의합니다. 이는 코드의 일관성을 유지하고, 특정 기능을 강제하는 데 유용합니다.
TypeScript
// TypeScript
interface Animal {
name: string;
makeSound(): void;
}
Java
// Java
public interface Animal {
String getName();
void makeSound();
}
TypeScript: 인터페이스는 객체의 구조를 정의하는 데 사용되며, 실제 구현은 포함하지 않습니다. 인터페이스는 타입 검사 시에만 사용됩니다.
TypeScript
interface Animal {
name: string;
makeSound(): void;
}
class Dog implements Animal {
name: string;
constructor(name: string) {
this.name = name;
}
makeSound() {
console.log("Woof!");
}
}
Java: 인터페이스는 메서드의 시그니처만 정의하며, 실제 구현은 포함하지 않습니다. 클래스는 implements 키워드를 사용하여 인터페이스를 구현합니다.
Java
public interface Animal {
String getName();
void makeSound();
}
public class Dog implements Animal {
private String name;
public Dog(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void makeSound() {
System.out.println("Woof!");
}
}
TypeScript: 인터페이스는 다중 상속을 지원합니다. 여러 인터페이스를 확장할 수 있습니다.
TypeScript
interface Animal {
name: string;
makeSound(): void;
}
interface Pet {
owner: string;
}
interface Dog extends Animal, Pet {
breed: string;
}
Java: 인터페이스는 다중 상속을 지원하지만, 클래스는 단일 상속만 가능합니다. 여러 인터페이스를 구현할 수 있습니다.
Java
public interface Animal {
String getName();
void makeSound();
}
public interface Pet {
String getOwner();
}
public class Dog implements Animal, Pet {
private String name;
private String owner;
public Dog(String name, String owner) {
this.name = name;
this.owner = owner;
}
public String getName() {
return name;
}
public void makeSound() {
System.out.println("Woof!");
}
public String getOwner() {
return owner;
}
}
TypeScript: 인터페이스는 타입 시스템의 일부로, 컴파일 타임에만 존재합니다. 런타임에는 제거됩니다1.
Java: 인터페이스는 런타임에도 존재하며, 리플렉션(reflection) 등을 통해 인터페이스 정보를 조회할 수 있습니다2.
유사점: 계약 정의, 다형성 지원
차이점: 구현 방식, 다중 상속 지원, 타입 시스템