인터페이스란
예전에 처음 자바를 공부 하면서 C와 C++만 공부 했었던 저에게 가장 생소한 개념은 인터페이스 였습니다.
일단 C와 C++에는 없는 개념이기도 했고, 아무리 읽어봐도 뭔지는 알겠는데 이걸 대체 왜 사용해야하는지에 대한 의문이 들었습니다. 시간이 조금 지나고 이를 사용하는 이유에 대해 이해 하였는데 책에서의 불친절한 설명과 단순한 기능 정리 만으로는 이해하기 힘들지 않나 싶어서 내용을 정리해 봅니다.
일단 위키백과에서 인터페이스 자체에 대한 정의를 살펴 보겠습니다.
인터페이스
여기서 한 부분을 짚고 넘어 가겠습니다.
'마우스나 마이크로폰과 같은 장치들은 오직 시스템에 데이터를 전송만 하는 인터페이스를 제공한다' 입니다.
- 마우스나 마이크로폰 같은 장치들은 오직 시스템에 데이터를 전송만 하는 인터페이스를 제공 : 이 말은 어떠한 관계 간(위 에서는 마우스와 PC, 마이크로폰과 PC)에 데이터를 주고 받을 때 '명확하게 주고 받을 값이 정해져있다.' 라고 볼 수 있습니다. 이를 프로그래밍 적으로 생각하면 주고 받을 매개 변수와 리턴 값이 명확하게 정해져 있다고 생각할 수 있습니다.
위 내용을 기반으로 인터페이스에 대한 예를 들어보겠습니다.
예를들어서 모니터를 생각해 보겠습니다. 모니터는 일반적으로 PC와 연결되어 여러가지 정보를 받습니다. 그 정보를 기반으로 모니터는 화면을 출력합니다. 여기서 다시 한 대의 모니티가 아닌 여러개의 모니터가 있다고 생각해 보겠습니다. 그렇다면 여기서 화면을 출력하기 위한 정보가 각각 모니터 마다 다르다면 PC는 하나하나의 모니터를 위한 전용 정보를 보낼 수 있어야 합니다. 이런게 만약 한 개 혹은 두 개 많이 잡아서 열 개 정도라면? 뭐 그 정도까지는 제공 해줄 수 있습니다. 각 모니터에 맞는 전용 입출력 선을 제공 하면 되겠죠.
하지만, 모니터의 갯 수가 10,000개가 넘어간다면? 하나의 컴퓨터가 이 모든 요구 사항을 다 맞출수 있을까요? 네. 많은 돈을 쓴다면 불가능 하진 않겠죠. 그렇지만 그 비용과 컴퓨터의 크기가 기하급수 적으로 커질 것이고, 배 보다 배꼽이 더 크다란 말이 어울릴 만한 상황이 됩니다. 그렇다면 어떠한 방식으로 이를 해결할 수 있을까요?
"서로간 주고 받을 수 있는 정보를 정해서 표준화 한다."
이 문제를 해결하기 위해 선택한 방법입니다. 표준이 정해지면 모든 모니터와 PC는 그 표준에 맞춰서 제품을 제작하면 서로간 제대로 된 정보를 주고 받을 수 있고, 모니터는 사용자에게 화면을 제공할 수 있게 되는 겁니다. 이러한 표준들이 모니터와 PC로 생각했을땐 RGB, HDMI, DVI, DP등 인터페이스 케이블이 되겠죠.
마찬가지로 소프트웨어에서도 이러한 방법으로 매개변수와 리턴 값이 정해진다면 어떠한 프로그래머가 어떤 모듈을 만들든 이 규칙을 지킬 수 있게 됩니다. 그렇다면 어떤 값이 넘어 오는지는 모르더라도 일단 서로 정해놓은 방법에서 값을 주고 받기 때문에 문제가 생기지 않습니다. 이러한 것을 가능하게 해주는것이 인터페이스인 것 입니다.
소프트웨어적으로 예를 들어보면 두 개의 프로그램이 모두 DB에서 값을 읽어오는 프로그램입니다. 이 두 프로그램은 같은 방식으로 동작하지만 서로 다른 DB에서 값을 읽어옵니다. 그러면 서로 DB에 커넥팅 하는 방법이 달라지게 될 것입니다. 이런 경우 DB커넥션을 위한 인터페이스를 만들어 두고, 양식을 정해둔다면 객체를 교체해가며 사용함으로써 상황을 해결 할 수 있게 됩니다.
코드로 표현해 본다면
//DB 커넥션으로 사용할 인터페이스
public interface DBConnection {
//DB커넥션 용으로 사용할 메소드
public Connection makeConnection();
}
//오라클 DB에 연결하는 클래스
public class OracleDBConnection implement DBConnection {
public Connection makeConnection() {
//오라클 DB 연결 코드..
}
}
//MySql DB에 연결하는 클래스
public class MySqlDBConnection implement DBConnection {
public Connection makeConnection() {
//MySql DB 연결 코드..
}
}
public class CRUD {
private DBConnection;
public void Connection( ) {
if(오라클에 연결) {
DBConnection = new OracleDBConnection();
} else if(MySQL에 연결) {
DBConnection = new MySqlDBConnection();
}
//메소드 호출하여 실질적 연결.
DBConnection.makeConnection();
}
//나머지 CRUD 코드
}
위와 같은 방식으로 인터페이스로 변수를 선언하여 객체의 할당하는 클래스를 바꿔줌으로써 코드는 한결 유연해지게 됩니다. 또한 이러한 방법으로 인해서 위 부분의 연결 부분을 사용자에게 넘길 수 있게되고 사용자는 자신의 입맛에 맞게 연결부분을 정해줄수 있습니다.
이 외에도 인터페이스를 사용함으로써 얻을 수 있는 장점들(다중 상속등..)이 더 있으나 가장 큰 사용목적은 위 내용이라고 생각해서 이정도로 정리를 마치겠습니다. 혹시 잘못된 부분 등이 있으면 댓글남겨주시면 확인 후 수정하겠습니다. 감사합니다.
'IT 관련 기타 > 개발 상식' 카테고리의 다른 글
[개발상식]설정 파일 정리 (0) | 2020.05.19 |
---|---|
JAVA 지역 변수의 범위 최소화 (0) | 2019.10.01 |
자바 SE, EE, ME (0) | 2018.11.22 |
객체지향 프로그래밍 (0) | 2018.05.08 |