개발을 하다 보면 "인터페이스(interface)"라는 단어를 정말 자주 듣습니다.
“이 클래스는 인터페이스를 구현해야 해”, “두 시스템 간 인터페이스 정의가 필요해” 등 상황에 따라 인터페이스라는 단어가 조금씩 다르게 사용되는 걸 느끼셨을 겁니다.
이번 글에서는 우리가 흔히 사용하는 객체 지향 프로그래밍(OOP)과 소프트웨어 공학(개발론)에서의 인터페이스가 어떻게 다르고, 어떤 공통점과 차이점이 있는지를 정리해 보겠습니다.
1. 객체 지향에서의 인터페이스란?
객체 지향 프로그래밍에서의 인터페이스는 클래스가 반드시 구현해야 할 메서드 목록, 즉 행동의 명세(Contract)를 정의하는 추상적인 구조입니다.
특징
- 메서드 시그니처만 정의하고, 구현은 없음
- 다형성을 가능하게 함
- 여러 클래스가 동일한 인터페이스를 구현하여 유연한 구조 제공
예시
public interface Animal {
void sound();
}
public class Dog implements Animal {
public void sound() {
System.out.println("멍멍");
}
}
Animal 인터페이스는 sound()라는 행동을 강제하고, Dog는 이를 구체적으로 구현합니다.
이런 구조 덕분에 Animal 타입으로 Dog나 Cat을 다룰 수 있게 되어 코드의 확장성과 유연성이 높아집니다.
2. 소프트웨어 공학에서의 인터페이스란?
여기서 말하는 인터페이스는 시스템 간, 모듈 간 상호작용을 위한 연결 지점을 의미합니다.
예를 들어, 백엔드 서버와 프론트엔드가 데이터를 주고받는 API 명세도 일종의 인터페이스입니다.
또한, 프론트엔드와 앱 간 브릿지를 통해 연결하는 경우도 인터페이스입니다.
특징
- 시스템 간 데이터 포맷, 통신 프로토콜, 호출 방식 등을 정의
- 일반적으로 문서화(API 명세서, 시퀀스 다이어그램 등)
- 구현보다는 계약/명세에 초점
예시
웹과 앱의 인터페이스를 예를 들어 설명해 보겠습니다.
// 웹 (JavaScript)
window.AndroidBridge.loginSuccess("홍길동");
@JavascriptInterface
fun loginSuccess(username: String) {
Toast.makeText(context, "$username님 로그인 성공", Toast.LENGTH_SHORT).show()
}
AndroidBridge는 웹과 앱 간 통신을 위한 인터페이스 역할을 하며, loginSuccess()는 웹이 앱에게 특 정 동작을 요구하는 명세입니다.
웹은 내부 구현을 몰라도 AndroidBridge.loginSuccess()만 알고 있으면 앱과 소통이 가능합니다.
이러한 구조 덕분에 웹과 앱은 서로의 내부 로직을 몰라도 명확한 약속(인터페이스)을 기준으로 유지보수성과 확장성이 높은 구조를 가질 수 있습니다.
간단하게 표로 정리하면 아래와 같습니다.
| 구분 | 객체 지향의 인터페이스 | 소프트웨어 공학의 인터페이스 |
| 관점 | 코드(클래스, 객체) 중심 | 시스템, 컴포넌트 중심 |
| 역할 | 메서드 명세 (계약) | 시스템 간 상호작용 규약 |
| 구현 여부 | 없음 (실제 구현은 클래스가 담당) | 없음 (실제 구현은 각 시스템이 담당) |
결론적으로 "계약"이라는 공통점을 갖고, "관점"에서 차이가 있다 정도로 정리할 수 있을 것 같습니다.
두 인터페이스 모두 약속된 형태로 동작해야 한다는 공통점이 있습니다. 하지만, 객체 지향은 클래스와 객체 사이, 소프트웨어 공학은 시스템 또는 모듈 사이의 약속을 다룬다는 점에서 차이가 있습니다.
실제 개발을 하다 보면 두 개념이 혼용되는 경우도 많습니다. 하지만, 정확한 개념을 알고 있으면 문서 작성이나 시스템 설계 시 더 명확한 커뮤니케이션이 가능합니다.
마치며
앞으로 “이거 인터페이스 정의해 줘”라는 말을 들었을 때, 그게 코드 레벨의 인터페이스인지, 아니면 시스템 레벨의 인터페이스인지를 정확히 구분하고 대응한다면 커뮤니케이션에 큰 도움이 될 것입니다.