인터페이스

Tags
abstraction
interface
부가 설명
사용명세서 ← 라고 생각하면 쉬움
비고
 
인터페이스는 사용명세서다

인터페이스 장점

  • 추상화
    • 사용자는 인터페이스에 명시된 부분만 보고 기능을 쉽게 파악할 수 있다.
    • 사용자는 구체적인 내부로직은 하나도 모르더라도, 인터페이스만 보고 클래스를 제대로 사용할 수 있다.
    • 개발자에 의해 내부적으로 코드가 바뀌더라도 사용자는 이를 몰라도 된다.
  • 다형성 극대화
    • 주문하기라는 같은 이름의 함수라도, 비빔밥집, 국밥집 등 구현하는 쪽에 따라 동작은 다양하다.
  • 일관성 유지
    • 인터페이스에 선언된 프로퍼티 또는 메소드의 구현을 강제함.
      • ( 이 클래스는 이 인터페이스를 구현했으니 이 함수들이 반드시 있겠군! )
  • 독립적인 프로그래밍 가능
    • 인터페이스를 통해 관계를 맺으면 한 클래스의 변경이 다른 클래스에 영향을 미치지 않는다.
      • ( 클래스끼리 직접적으로 관계를 맺으면 한쪽 클래스 내용 변경 시 관련 클래스들도 다 수정해야함. )
        컴포지션

예시

사용자는 단지 "주문서비스를 구현했으니 주문 함수가 있겠구나!"만 알면 됨.
// 타입 type 음식 = { 이름: string; }; // 인터페이스 // 사용자는 '주문서비스'를 구현한 객체는 '주문하기()' 함수로 '음식'이 나온다는 것만 알면됨. interface 주문서비스 { 주문하기(): 음식; } // 구현 클래스 class 비빔밥집 implements 주문서비스 { 주문하기(): 음식 { this.채소준비(); this.데치기(); this.밥퍼기(); this.참기름추가(); this.고추장추가(); return { 이름: "비빔밥" }; } private 채소준비(): void { // 사용자는 구체적인 내부작업은 몰라도됨. console.log("채소 준비중.."); } private 데치기(): void { // 사용자는 구체적인 내부작업은 몰라도됨. console.log("채소 데치는중.."); } private 밥퍼기(): void { // 사용자는 구체적인 내부작업은 몰라도됨. console.log("밥 퍼는중.."); } private 참기름추가(): void { // 사용자는 구체적인 내부작업은 몰라도됨. console.log("참기름 추가됨"); } private 고추장추가(): void { // 사용자는 구체적인 내부작업은 몰라도됨. console.log("고추장 추가됨"); } }
const 삼대비빔밥 = new 비빔밥집(); const 비빔밥 = 삼대비빔밥.주문하기(); console.log(비빔밥);
notion image