이번 포스팅에서는 "인터페이스(interface)"라는 것에 대해 알아보고자 한다.
< 목차 >
- 인터페이스란?
- API
- 프로그래밍에서의 interface
1. 인터페이스란?
인터페이스(Interface)는 다양한 맥락에서 사용되는 개념이다. 실제로 위키백과에는 인터페이스에 대해 다음과 같이 정의되어 있다.
인터페이스(interface)는 서로 다른 두 개의 시스템, 장치 사이에서 정보나 신호를 주고받는 경우의 접점이나 경계면이다. 즉, 사용자가 기기를 쉽게 동작시키는데 도움을 주는 시스템을 의미한다. 컴퓨팅에서 컴퓨터 시스템끼리 정보를 교환하는 공유 경계이다. 이러한 교환은 소프트웨어, 컴퓨터 하드웨어, 주변기기, 사람 간에 이루어질 수 있으며, 서로 복합적으로 이루어질 수도 있다. '터치스크린'과 같은 일부 컴퓨터 하드웨어 장치들은 인터페이스를 통해 데이터를 송수신 할 수 있으며 마우스나 마이크로폰과 같은 장치들은 오직 시스템에 데이터를 전송만 하는 인터페이스를 제공한다.
출처 : 위키백과
어떻게 보면 프로그래밍을 처음 공부하는 입장에서 가장 난해한 용어가 바로 "인터페이스"라는 생각이 든다. (실제 필자의 경우 그러하였다,,,) 너무나도 다양한 맥락 속에서 "인터페이스"라는 용어를 사용하기 때문에 정확하게 "이것이다"라는 정의를 내리는 것은 쉽지 않겠지만, 적어도 "인터페이스"라는 개념을 어떻게 받아들이고 이해해야 하는지에 대해 얘기해 보고자 한다.
인터페이스는 여러 구성 요소 간에 정보를 전달하는 방법을 정의하는 명세 혹은 규약이다. 컴퓨터 과학에서 인터페이스는 주로 두 가지 맥락에서 사용된다. 바로 하드웨어적 관점의 인터페이스와 소프트웨어적 관점의 인터페이스이다. 우선 하드웨어적 관점은 다음과 같다.
하드웨어 인터페이스
컴퓨터 하드웨어의 다양한 부분들이 서로 어떻게 통신하고 상호작용 하는지를 정의하는 규칙이나 표준을 나타낸다. 예를 들어 USB는 컴퓨터와 장치 간의 연결을 가능하게 하는 하드웨어 인터페이스이다. 이는 키보드, 마우스, 프린터 등 다양한 장치들과 컴퓨터 사이에서 데이터를 전송하는 방법을 정의한다.
애플리케이션을 개발하는 개발자의 입장에서는 위와 같은 하드웨어적 관점의 인터페이스 보다는 소프트웨어적인 관점에서의 인터페이스 개념이 조금 더 친숙할 것이다. 다음으로 소프트웨어적인 관점에서 바라보는 인터페이스를 살펴보자.
소프트웨어 인터페이스
소프트웨어 모듈이나 시스템이 서로 통신하는 방법을 정의한다. 소프트웨어 인터페이스는 일반적으로 API (Application Programming Interface) 형태로 제공되며 함수나 메소드의 집합으로 구성되어 있다. 이들 함수나 메소드는 특정 동작을 수행하거나 필요한 정보를 제공하는 역할을 한다.
어김없이 API 라는 용어가 등장하였다. 소프트웨어적으로 접근했을 때, "인터페이스"를 이야기하면 빠짐없이 등장하는 것이 바로 API 즉, Application Programming Interface 이다. API의 인터페이스는 무엇을 의미하는지 조금 더 알아보도록 하자.
2. API
실제로 소프트웨어적 관점에서 인터페이스의 개념을 살펴보다 보면 빠지지 않고 등장하는 것이 바로 API 이다. 그렇다면 Application Programming Interface 라는 용어 안의 인터페이스는 무엇을 의미하는 것일까?
API 는 소프트웨어 또는 시스템 간에 상호작용을 가능하게 하는 일련의 함수, 메소드, 프로토콜 및 도구들의 집합을 일컫는다. API를 사용하면 서로 다른 소프트웨어나 서비스 간에 데이터를 교환하거나 기능을 공유할 수 있다. 실제로 백엔드 쪽 개발을 진행하다 보면 "이러이러한 API 하나 만들어 주세요~" 라는 요청을 프론트엔드 개발자로부터 받기도 한다. API를 통해 사용자가 특정 작업을 수행하거나 정보를 가져오기 위해 호출할 수 있는 함수와 메소드를 제공하는 것이다.
또 다른 예를 들어보면, 소셜 미디어 플랫폼은 사용자의 타임라인에 게시물을 작성하거나 팔로우 목록을 가져오는 등의 작업을 할 수 있도록 API를 제공할 수 있다. 그리고 이러한 API는 개발자가 원하는 작업을 수행하기 위해 호출할 수 있는 함수들의 목록과 그러한 함수들이 어떤 데이터를 입력으로 받아들이고 어떤 데이터를 반환하는지에 대한 정보를 포함하게 된다.
다음은 API가 가지는 특징들을 정리해본 것이다.
1. 함수와 메소드
API는 사용자가 특정 작업을 수행하거나 정보를 가져오기 위해 호출할 수 있는 함수와 메소드를 제공한다. 예를 들어, 날씨 API는 특정 지역의 현재 날씨 정보를 반환하는 함수를 제공할 수 있다.
2. 프로토콜과 데이터 형식
API는 통신을 위한 프로토콜과 데이터 형식을 정의한다. 예를 들어, 웹 API는 주로 HTTP 프로토콜을 사용하며 데이터 형식으로는 JSON 또는 XML을 사용한다. 이를 통해 API 사용자는 서버와 클라이언트 간의 통신 방법을 알 수 있다.
3. 인증과 권한
API는 사용자의 인증 및 권한을 관리하는 방법을 정의한다. 이를 통해 개발자는 API를 안전하게 사용할 수 있으며, 서비스 제공자는 리소스에 대한 접근을 제어할 수 있다. 일반적인 인증 방법으로는 API key, OAuth, JWT 등이 사용된다.
4. 문서화
API는 개발자가 사용하기 쉽도록 문서화 되어야 한다. API 문서는 사용 가능한 함수와 메소드, 프로토콜, 데이터 형식, 인증 방법 등에 대한 정보를 제공한다. 이를 통해 개발자는 API를 쉽게 이해하고 사용할 수 있다.
5. 오류 및 예외 처리
API는 호출 시 발생할 수 있는 오류와 예외 상황을 정의하고 그에 대한 처리 방법을 제공한다. 이를 통해 개발자는 API 사용시 발생할 수 있는 문제를 미리 인지하고 적절한 처리를 할 수 있다.
다시한번 정리해보면, API의 인터페이스는 다양한 소프트웨어, 서비스, 시스템 간의 상호 작용을 가능하게 하는 규격이다. 인터페이스를 통해 개발자는 특정 기능을 사용하거나 정보를 가져오는 방법을 명확하게 알 수 있으며 이를 통해 서로 다른 소프트웨어나 서비스 간에 데이터를 교환하거나 기능을 공유할 수 있다.
3. 프로그래밍에서의 interface
이제 인터페이스란 것이 무엇인지에 대해 조금은 이해가 되었기를 희망한다. 마지막으로 프로그래밍 언어에서의 인터페이스(interface)에 대해 얘기해 보고자 한다. 위에서 이야기 했던 인터페이스의 의미들이 코드 상에도 반영된다고 생각할 수 있다. 인터페이스는 주로 객체지향 프로그래밍과 타입 시스템이 있는 프로그래밍 언어에서 사용되며 인터페이스를 사용하여 코드의 구조와 기능을 정의할 수 있다.
프로그래밍 언어에서 인터페이스는 일종의 규격이다. 인터페이스는 객체, 클래스, 구조체, 함수 등이 가져야 하는 속성, 메소드, 이벤트 등의 형태와 기능을 정의한다. 인터페이스는 구현 세부 사항을 제공하지 않고, 오직 구조와 기능의 명세만을 제공한다. 이를 통해 코드의 일관성과 가독성을 높이며, 다형성 및 추상화를 지원한다. 다음은 프로그래밍에서 인터페이스를 사용하는 목적이다.
1. 코드의 일관성과 가독성
인터페이스를 사용하면 코드의 구조와 기능을 명확하게 정의할 수 있으며, 다른 개발자들이 이해하기 쉽게 만들 수 있다.
2. 추상화
인터페이스를 사용하면 구현 세부 사항을 숨기고 관심사를 분리할 수 있다. 이를 통해 유지 보수와 코드의 확장성을 높일 수 있게 된다.
3. 다형성
인터페이스를 구현(implements)하는 여러 클래스나 객체들은 동일한 인터페이스를 공유하므로 상호 교환 가능하게 사용될 수 있다. 이를 통해 유연한 코드 작성이 가능해진다.
4. 코드 재사용
인터페이스를 사용하여 공통 기능을 정의하고, 이를 여러 클래스나 객체에서 구현함으로써 코드를 재사용 할 수 있다.
이해를 돕기 위해 짧막하게 TypeScript에서 인터페이스가 사용되는 방식을 살펴보도록 하자.
인터페이스는 객체의 구조를 정의하는 방법을 제공한다. 인터페이스는 타입 검사를 위한 코드에만 존재하며, 컴파일된 JavaScript 코드에는 포함되지 않는다. 인터페이스를 사용하면 코드의 일관성과 가독성을 높일 수 있으며 다른 개발자와 협업시 명확한 객체 구조를 공유할 수 있다.
👉 객체의 구조를 정의
interface Person {
name: string;
age: number;
}
const person: Person = {
name: 'Jay',
age: 30,
};
👉 선택적 속성을 정의
interface Person {
name: string;
age: number;
address?: string; // 선택적 속성은 ?를 사용하여 정의한다.
}
const person: Person = {
name: 'Jay',
age: 30,
// address 속성은 생략 가능
};
👉 함수 타입을 정의
interface Greeting {
(name: string, age: number): string;
}
const greet: Greeting = (name: string, age: number) => {
return `Hello, my name is ${name} and I am ${age} years old.`;
};
👉 인덱싱 가능 타입을 정의
interface StringArray {
[index: number]: string;
}
const myArray: StringArray = ['Ingoo', 'Jay', 'Soon'];
👉 클래스에서 인터페이스를 구현
interface Animal {
name: string;
makeSound(): void;
}
class Cat implements Animal {
name: string;
constructor(_name: string) {
this.name = _name;
}
makeSound() {
console.log('Meow~');
}
}
const myCat = new Cat('Huchu');
다시 본론으로 돌아가서 우리의 처음 관심사였던 "인터페이스"에 대해 마지막 정리를 해보도록 하자.
API 즉, Application Programming Interface에서의 인터페이스는 소프트웨어 또는 시스템 간에 상호 작용을 가능하게 하는 일련의 함수, 메소드, 프로토콜 및 도구들의 집합을 일컬었다. 그리고 앞서 살펴본 프로그래밍 언어에서의 인터페이스는 객체, 클래스, 구조체 등이 가져야 하는 속성과 메소드 등의 형태와 기능을 정의했다. 얼핏 봐서는 서로 다른듯 하지만 둘 다 "인터페이스"라는 용어를 사용하는 것 답게 어느 정도는 공통적인 특징들도 가지고 있다. 두 종류의 인터페이스 모두 다음과 같은 공통점을 갖는다.
- 명세 또는 규칙을 제공하여 개발자가 코드를 작성할 때 기능을 쉽게 이해하고 사용할 수 있게 한다.
- 일관된 인터페이스를 통해 개발자가 효율적으로 작업할 수 있도록 한다.
- 서로 다른 구현이나 시스템 간에 상호 작용을 가능하게 한다.
주의할 점은, API의 인터페이스는 주로 소프트웨어 간의 통신과 상호 작용을 위한 것이고 프로그래밍 언어에서의 인터페이스는 코드 구조와 클래스 간의 관계를 정의하는데 사용된다는 것이다. 목적과 사용 방식 등은 다르지만 서로 다른 시스템, 모듈, 객체, 하드웨어 등이 통신하고 상호 작용하기 위한 규약 이라는 의미에서 "인터페이스"를 이해할 수 있지 않을까,, 생각해본다.
'ABOUT CS' 카테고리의 다른 글
ABOUT.Series (12) IoC (Inversion of Control; 제어의 역전) & DI (Dependency Injection; 의존성 주입) (1) | 2023.08.17 |
---|---|
ABOUT.Series (10) 디자인 패턴 (0) | 2023.05.01 |
ABOUT.Series (9) 운영체제(OS) (0) | 2023.04.10 |
ABOUT.Series (7) HTTP 헤더 - 인증 / 쿠키 (0) | 2023.03.08 |
ABOUT.Series (6) HTTP 헤더 (0) | 2022.12.30 |