인터페이스(interface)는 서로 다른 두 개의 시스템, 장치 사이에서 정보나 신호를 주고받는 경우의 접점이나 경계면이다. 즉, 사용자가 기기를 쉽게 동작시키는데 도움을 주는 시스템을 의미한다. 컴퓨팅에서 "컴퓨터 시스템끼리 정보를 교환하는 공유 경계"이다.
"서로 다른" => Adapter와 다르게 구체적인 데이터 타입이 명시되지 않아도 된다는 특징이 있습니다.
"인터페이스 유형의 값은 해당 메소드를 구현하는 모든 값을 보유 할 수 있습니다."
Go를 향한 여행
=> 들어오는 값의 데이터 타입을 모르지만 받고 싶을 때 사용합니다.
package main
import (
"fmt"
"math"
)
type I interface {
M()
}
// P 구조체 선언
type P struct {
S string
// TMI : 구조체 안에 인터페이스 데이터 타입을 넣을 수도 있습니다!
}
// P 데이터 타입을 입력 받았을 때의 M 함수
func (t *P) M() {
fmt.Println(t.S)
}
// F 커스텀 타입 선언
type F float64
// F 데이터 타입을 입력 받았을 때의 M 함수
// 같은 이름의 M 함수가 있어도 입력받는 데이터 타입이 다르기 때문에 선언할 수 있습니다!
func (f F) M() {
fmt.Println(f)
}
func main() {
// 인터페이스 I의 데이터 타입으로 변수 i를 선언합니다
var i I
// P의 데이터 타입(구조체)으로 "Hello" 데이터를 i 변수에 담습니다
i = &P{"Hello"}
describe(i) // (&{Hello}, *main.P)
// M 함수를 실행합니다
i.M() // Hello
// 변수 i는 데이터 타입이 인터페이스 I이기 때문에
// F의 데이터 타입으로 math.Pi 데이터를 i 변수에 담아도 오류가 나지 않습니다!
i = F(math.Pi)
describe(i) // (3.141592653589793, main.F)
i.M() // 3.141592653589793
// a 변수에 숫자 33을 담고-> b 변수에 문자열로 데이터 타입을 변환시켜서-> 출력
a := 33
b := string(a)
fmt.Println(b) // ! 출력 (아스키 코드: 33)
}
func describe(i I) {
fmt.Printf("(%v, %T)\n", i, i)
}
extends로 확장이 가능한 구조체와 비슷한 개념으로
인터페이스 객체 안에는 함수를 넣을 수 없습니다!
하지만 함수형 인터페이스를 만들 수는 있습니다.
// 인터페이스 선언
interface I<t> {
p1: string;
p2: number;
p3?: t;
}
const test: I = {
p1: "value",
p2: 0,
}
// T : 확장된 I 인터페이스
interface T extends I<string> {
p4: boolean;
}
const test2: T = {
p1: "value",
p2: 0,
p4: true,
}
// 인터페이스 내부에서도 확장 가능합니다!
interface G <g extends string | number> {
P1 : U;
p2 : U extends string ? number : string ;
p3? : null | undifined;
}
📌 아래 코드 출처: https://poiemaweb.com/typescript-interface
// 함수 인터페이스의 정의
interface SquareFunc {
(num: number): number;
}
// 함수 인테페이스를 구현하는 함수는 인터페이스를 준수하여야 한다.
const squareFunc: SquareFunc = function (num: number) {
return num * num;
}
console.log(squareFunc(10)); // 100
저도 나중에 기회되면 GO랑 TypeScript 배워보고싶네요👏