본문 바로가기

JAVA/OOP

인터페이스

반응형

인터페이스의 개념


인터페이스의 정의

인터페이스 - 사물간 또는 사물간의 인간 사이의 의사소통이 가능하도록 일시적 혹은 영구적 접근을 목적으로 만들어진 물리적, 가상적 매체를 의미


예) TV 리모콘(시청자와 TV 수상기와의 상호작용을 위한 인터페이스)


컴퓨터 하드웨어 분야에서는 인터페이스르 물리적 매체로 나타내지만, 소프트웨어서는 특정 기능을 위한 관련된 함수들의 집합이라고 표현


객체지향에서 다루는 인터페이스 개념은 소프트웨어에서 다루는 인터페이스 개념을 의미.

인터페이스는 특정 기능 또는 특정 서비스 수행에 필요한 함수들을 선언만 하고 있기 때문에 이 선언된 함수들에 대한 구현은 클래스나 컴포넌트를 통해서 구현하게 된다.

따라서 인터페이스에대한 명세가 잘 정의되면 구현은 인터페이스와 분리되어서 다양하게 구현할 수 있게 된다.

이렇게 함으로써 명세와 구현이 분리도이ㅓ 소프트웨어에 대한 재사용성이 높아진다.


예) 워드프로세서의 인쇄기능이 문제가 발생했다고 해서 워드 프로세스의 모든 프로그램을 수정할 필요없이 인쇄 기능에 대한 모듈(컴포넌트)구현만 새로운 것으로 교체하면 된다.


예) 마우스가 고장났다고 해서 컴퓨터 전부를 교체하는 것이 아니라 마우스만 새로운 것으로 교체하면된다.

또한 마우스를 이전 회사으이 제품과 동일한 마우스로 교체해야하는 것이 아니라 포트만 동일하면 다른 회사 제품의 마우스로 교체해도 시스템 작동에는 아무런 문제가 없다.

포트 개념이 소프트웨어에서 말하는 인터페이스다.

인터페이스는 소프트웨어의 독립적 서비스에 대한 명세라고 할 수 있다.


인터페이스의 특성

1. 함수의 선언만 표현한다.

- 함수 선언의 집합이기 때문에 인터페이스 내에는 함수에 대한 구현부분은 전혀 존재할 수 없다.

인터페이스 내의 함수들은 모두 외부에서 접근이 가능해야 하기 때문에 모두 public 함수들이어야 한다.


2. 객체를 생성할 수 없다.

- 함수들에 대한 구현 부분이 전혀 존재하지 않기 때문에 추상클래스처럼 객체를 생성할 수 없다.

따라서 인터페이스 내의 선언된 함수들을 지닌 객체를 생성하고 싶을 경우는 해당 인터페이스를 구현하는 클래스를 정의한 후, 해당 클래스로부터 객체를 생성하면 된다.


3. 클래스와 상속 관계를 맺을 수 없다.

- 클래스와 추상 클래스 간에는 서로 상속 관계를 맺을 수 있으나 반면에 인터페이스는 클래스와 서로 상속 관계를 맺을 수 없다.

인터페이스의 부모가 클래스가 될수 없을 뿐만 아니라 클래스의 부모 또한 인터페이스가 될 수 없다.


4. 변수를 포함할 수 없다.

- 추상 ㅋ르래스는 내부에 변수를 포함할 수 있지만, 인터페이스는 변수를 정의 할 수 없다. 다만 상수만 정의 가능하다.


5. 명세와 구현을 분리할 수 있다.

- 인터페이스는 소프트웨어 공학에서 말하는 관심 분리(Separate of Concern)의 원칙을 반영한 장치이다.

즉, 인터페이스는 명세를 표현하는 장치이고, 이를 구현하는 것은 클래스 혹은 컴포넌트가 된다.

따라서 인터페이스에 명세된 함수들은 클래스에 의해 구현이 되며, 컴포넌트에서는 이러한 구현 부분을 외부에 노출시키지 않고 은폐시킨다. 따라서 컴포넌트를 사용하는 사용자 관점에서는 컴포넌트의 인터페이스만 보이면 인터페이스를 통해 컴포넌트 내부 기능들을 호출하게 된다.


UML

<<interface>> 스테페오 타입을 명시하여 인터페이스임을 정의한다.


클래스가 구현클래스를 직접 호출한다면, 클래스를 수정해야하는 유지보수의 어려움을 발생시키며 객체의 독립성을 어렵게 만들어, 결국 개발의 생산성을 감소시킨다.


인터페이스에 의해 구현된 다양한 클래스의 변경에도 다른 클래스에 영향을 주지 않기 위해서는 구현 클래스를 직접호출하지 않고 인터페이스를 통해 간접 호출한다.

구현 클래스가 변경되더라도 호출하는 클래스는 전혀 변경할 필요가 없다.

이것이 인터페이스를 통해 유지보수성을 향상시켜줄수 있는 방법이다.


// 인터페이스

public interface IShoppingCart {

public void addItem(Item item); //서비스 명세(구현되지 않음)

public void deleteItem(String id);

}


//구현클래스

public class ShoppingCart implements IShoppingCart {

public void addItem(Item item) { ... } //구현함수

public void deleteItem(String id) { ... }

}



//인터페이스의 구현 클래스의 직접 호출

public class Order {

ShoppingCartA cart = new ShoppingCartA();

cart.addItem(item);

}


Order 클래스에서 ShoppingCartA 클래스를 생성하여 직접호출하는 경우 새로운 사이트 쇼핑몰B와 쇼핑몰C를 지원하기 위해 Order 클래스를 수정해야 하므로 유지보수의 복잡성이 발생한다.



//인터페이스의 구현 클래스의 간접 호출

public class Order {

IShoppingCart cart = new ShoppingCartFactory.getInstance();

cart.addItem(item);

}


Order 클래스에서 IShoppingCart 인터페이스를 구현한 클래스를 직접 호출하지 않고 구현 클래스를 관리하는 ShoppingCartFactory 클래스를 통해 얻은 구현 클래스를 통해 호출한다.

이렇게 호출된 클래스는 IShoppingCart 인터페이스로 casting되어 Order 클래스 내부에서 이용될 수 있다.

이와 같이 어떤 클래스로 변경되더라도 이를 허용하는 다른 클래스는 인터페이스의 의해 영향을 받지 않고 변경할 수 있다.



정리

- 인터페이스는 의사소통을 위한 물리적, 가상적 매체이다.

- 인터페이스는 특정 기능을 수행하기 위해 선언된 함수들의 집합이다.

- 인터페이스는 소프트웨어 서비스에 대한 명세이다.

- 인터페이스는 함수의 선언만 표현한다.

- 인터페이스는 객체를 생성할 수 없다.

- 인터페이스는 클래스와 상속 관계를 맺을 수 없다.

- 인터페이스는 변수를 포함할 수 없다.

- 인터페이스는 명세와 구현을 분리할 수 있다.

- UML에서는 클래스 표기 <<interface>>라는 스테페오 타입을 명세하여 인터페이스를 정의 한다.

- Java 언에서는 interface 예약어를 사용하여 인터페이슬 정의하며, 정의된 인터페이스는 클래스가 implements 예약어를 사용하여 인터페이스에 선언된 함수들을 구현해야 한다.


출처-UML과 JAVA로 배우는 객체지향 설계 및 구현

반응형

'JAVA > OOP' 카테고리의 다른 글

컴포넌트  (0) 2018.04.21
다형성  (0) 2018.04.20
추상클래스  (0) 2018.04.18
상속  (0) 2018.04.17
복합객체  (0) 2018.04.17