Java(31) - 인터페이스를 활용한 다형성 구현
1. 인터페이스의 역할
인터페이스는 디폴트메서드, 정적메서드, private메서드를 제외하면 껍데기입니다.
그러면 이런 인터페이스를 어떻게 어디서 사용하는지에 대해 알아보겠습니다.
- 인터페이스는 클라이언트 프로그램에 어떤 메서드를 제공하는지 알려주는 명세,
(specification) 또는 약속입니다.
즉 클래스나 프로그램이 제공하는 기능을 명시적으로 선언합니다. - 한 객체가 어떤 인터페이스의 타입이라 함은 그 인터페이스의 메서드를 구현했다는 의미입니다.
- 클라이언트 프로그램은 실제 구현 내용을 몰라도 인터페이스의 정의만 알면 그 객체를 사용할 수 있습니다.
즉 클라이언트 프로그램은 인터페이스에 선언된 메서드 명세만 보고 이를 구현한 클래스를 사용할 수 있습니다. - 인터페이스를 구현해 놓은 다양한 객체를 사용합니다.
(다형성, ex) JDBC를 구현한 오라클, MSSQL 라이브러리 등)
ABC라는 인터페이스가 있고 a(), b(), c()라는 추상 메서드가 있다고 가정합시다.
이 인터페이스를 알파, 베타, 감마라는 모듈(클래스, 라이브러리)가 구현한다고 했을 때
인터페이스는 해당 인터페이스에 맞는 모듈이 되려면 각 메서드를 구현하라 라는 선언을 해놓은 것입니다.
2. 클라이언트 프로그램
인터페이스를 구현한 모듈들을 가져다 쓰는 쪽을 클라이언트 프로그램이라고 합니다.
(Web, Mobile)
갖다 쓰는 입장에서는 각 모듈들이 어떻게 구현됐는지를 일일이 알고 가져다 쓰지 않습니다.
클라이언트 입장에서는 인터페이스만을 봅니다.
인자와 반환타입을 보고 어떻게 써야겠다라는 일종의 명세를 제공해주는 것입니다.
ABC abc;
abc = new 알파();
abc = new 베타();
abc = new 감마();
이런식으로 필요에 따라 구현된 부분을 인터페이스 타입으로 new 해서 사용합니다.
그러나 호출은 abc.a(), abc.b(), abc.c()등으로 합니다.
즉 구현의 내용은 어떤 인스턴스가 대입됐느냐에 따라 달라집니다.
(알파인지 베타인지 감마인지.)
정리를 하자면,
인터페이스는 어떠한 모듈이 되려면 각 메서드를 구현해라 라는 선언을 해주는 부분입니다.
이렇게 선언이 되어서 구현이 된 모듈들을 클라이언트가 가져다 사용합니다.
클라이언트가 사용할 때 어떻게 구현됐는지는 알 수도, 모를 수도 있습니다.
그러나 클라이언트가 꼭 알 필요는 없고, 가져다 쓸 때는 인터페이스에 있는 명세 부분만 보면 됩니다.
추상클래스와의 차이점은 추상클래스는 공통되는 모듈이 있을 수도 없을 수도 있고, 클래스이기 떄문에
1개만 상속을 받습니다.(다중상속 불가)
그러나 인터페이스는 순수하게 명세만 되어있기 때문에 여러개를 상속 받을 수 있습니다.
default 메서드가 추가되면서 재정의해야 할 부분이 추가되기도 합니다.
(나중에 다루겠습니다.)
간단하게 말하면
추상 클래스는 미완성 설계도
인터페이스는 기본 설계도입니다.
3. 인터페이스 사용 예시
오라클, mssql를 구현한 모듈 셋이 있다고 했을때 이것들도 인터페이스를 기반으로
구현됐다고 했을 때 우리가 한개를 선택하면 그것대로 돌아가게 됩니다.
4. 인터페이스와 strategy pattern
인터페이스를 활용하면 다양한 정책이나 알고리즘을 프로그램의 큰 수정 없이 적용, 확장이 가능합니다.
댓글남기기