티스토리 뷰

자바의 인터페이스가 무엇인지 이해하기가 쉽진 않다. 학생들 중에는 자바의 인터페이스를 메소드 선언부만 가지는 클래스? 또는 다중상속이 가능하게 해주는 것, 정적 필드만 가지는 클래스 등 단편적인 사실로 알고 있는 경우가 많다. 사실 자바에서 인터페이스란 다중 상속보다 훨씬 더 광범위하고 중요한 개념이다. 

클래스가 실제 세계의 객체를 나타낸다면 인터페이스는 성질, 기능 또는 역할을 모델링한다. 데이터는 고려하지 않고 기능(하는 일)만 모델링하는 것인데, 예를 들면 어떤 물건이 판매되기 위해 필요한 기능은 가격을 물어보고 판매하고 상태를 물어보는 등의 기능이 필요하다. 가격이나 상태 등의 데이터를 가져야 할 것 같지만, 데이터를 생각하지 않고 기능만 생각하는 것이 인터페이스다. 실세계에서 회사의 업무처리를 예로 들어보자. 어떤 일을 계획할 때 다른 부분에서 어떤 일을 해 줄 꺼라고 보고 계획할 때가 많다. 그럼 그 담당자(또는 부서나 업체)에게 해줄 일을 요청하고 언제까지 결과를 받는다 치고 나머지 일은 계획된다. (실제 누가 할지 예산이 있는지 일을 할 여건이 되는지 등) 그런 건 "위"에서 알아서 해 줄 꺼라고 보고 나는 내가 할 일을 계획한다. 이것이 인터페이스의 역할이다. 우리는 인터페이스에 따라 어떤 클래스가 됐든 그런 일을 해 줄 꺼라고 보고 코드를 작성한다. 실제 사용될 클래스에서 그 인터페이스를 알아서 구현한다. 

그럼 이것을 어디다 쓰느냐고? 예를 들어 가게에서 팔릴 수 있는 물건들을 나타내고 싶다고 해 보자. 팔아야 할 물건, 또는 팔릴 수 있는 물건은 무척 다양하고 온갖 클래스 객체가 다 팔릴 수 있는데, 우리는 그게 어떤 물건인지 상관없이 팔릴 수 있다고 하는 성질만 이용하고 싶다. 팔릴 수 있으면 가게에 들어올 수 있다. 그 물건이 어떤 데이터를 가지든 어떤 메소드를 가지든 상관없이 팔리기 위해 필요한 메소드만 있다면 판매될 수 있다. 가게 클래스는 물품의 가격을 물어보고(getPrice) 판매하고(Sell) 상태를 물어보는(getState) 메소드만 이용할 수 있다면 어떤 물건이든 팔 수 있다.

즉 어떤 객체가 판매되기 위해서는 그 클래스가 판매하는데 필요한 메소드를 제공하면 된다. 우리는 판매되는데 필요한 메소드를 Sellable이라고 정의하고 팔릴 수 있는 클래스는 원래 어떤 클래스든 상관없이 이 인터페이스에 있는 메소드들을 implements하게 할 수 있다. 

interface Sellable { String getName(); int getPrice(); boolean sell(); String getState(); } class SaleCar extends Car implements Sellable { public String getName() { ... public int getPrice() { ... public boolean sell() { ... public String getState() { ... }

이와 같이 SaleCar를 정의하면 우리는 원래 Car가 가지고 있던 필드와 메소드를 가지는 객체를 판매할 수 있게 된다. 여기서 getName(), getState()는 Car 클래스의 필드를 이용해서 적절한 메시지를 제공해야 할 것이다. getPrice()도 차종이나 연비, 연도 등에 의해 가격을 정할 수 있을 것이다. 이렇게 해서 SaleCar는 팔릴 수 있는 차 클래스가 된다. 다른 클래스도 이와 같이 Sellable을 구현하면 팔릴 수 있는 물건이 된다. 

그럼 Store 클래스는 이러한 물건들을 모아서 판매한다.

ArrayList<Sellable> itemList = new ArrayList<>();

여기에는 팔릴 수 있는 물건들은 다 들어갈 수 있고 다 각자의 방식으로 가격도 정하고 판매도 될 수 있다. 이렇게 Store 클래스를 만들면 우리는 그 클래스를 서점에도 쓸 수 있고 자동차 판매점에도 쓸 수 있다. Store 클래스는 모든 가게가 가질 공통기능만 구현하게 된다. 물건을 검색하고 상세정보를 보고 주문하고 결재하는 등의 기능을 제공한다. 그리고 서점(BookStore)은 일반 Store가 가진 기능 이외에도 추가적으로 몇 가지 기능을 더 가질 수 있다. 예를 들면 도서 주문이라든가 도서 환불, 도서에 대한 좀더 복잡한 검색 기능 등을 가질 수 있다. 그러면 BookStore는 Store를 상속하여 구현될 것이다.

여기까지가 인터페이스의 개념이다. 그런데 실제 세계는 그렇게 간단하진 않다. Sellable 인터페이스로 가게를 구현하고 팔릴 물건들은 Sellable을 구현하면 되지만, 물건에 해당하는 객체를 어디선가는 생성해야 한다. 이건 실제 객체가 생겨야 하므로 인터페이스 만으로 해결이 안 된다. 앞에서 본 회사 업무의 예에서 누군가 그 일을 할 사람이나 부서/업체가 있다 치고 일을 "계획할" 수는 있지만 그걸 할 주체가 없으면 실제로 일을 "할" 수는 없다. 인터페이스는 실제 객체를 만들지는 못한다. 자바에서 new는 정말 객체가 될 수 있는 클래스(구체 concrete 클래스)에 대해서만 적용할 수 있다. new 다음에는 추상클래스도 안 되고 인터페이스도 안 된다. 이것을 위해 다음 포스트에서는 실제로 인터페이스로 시스템을 구축하려면 필요한 사항들 몇 가지를 예제를 통해 알아본다.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함