💻 인터페이스(Interface)
인터페이스란?
- 구현하는(상속받는) 클래스의 "기본 설계도"의 역할
- 기능을 사용하는 방법을 명시
- 자바의 다형성을 극대화하여 개발코드 수정을 줄이고 프로그램 유지 보수성을 높이기 위해 인터페이스를 사용한다.
➡️ 수정, 보완 효율적, 유지 보수 용이
➡️ 다형성(Polymorphism) : 여러가지 형태를 가질 수 있는 능력 / 조상 타입 참조 변수로 자손 타입 객체를 다루는 것
- 클래스가 인터페이스를 상속하는 행위를 ‘상속’이 아닌 ‘구현(implements)’이라 한다.
- 인터페이스를 구현한 클래스의 생성자를 호출해서 인터페이스의 객체를 생성할 수 있다.
- 인터페이스 단독으로 객체 생성은 불가함
➡️ 생성자를 호출 해야 하기 때문(내부 생성자 없음!)
- 인터페이스를 이용해서 서로가 동일한 메소드를 만들도록 규약을 만들어서 공유한 결과, 각자가 상대의 일정이나 구현하는 방식에 덜 영향을 받으면서 에플리케이션을 구축 할 수 있다.
- 클래스를 구현할 때 사용하는 규약
➡️ 해당 인터페이스를 사용하는 클래스는 인터페이스 내에 정의된 메소드를 반드시 구현해야한다.
ㅤ
💡 인터페이스의 특징
- 하나의 클래스가 여러개의 인터페이스를 구현 할 수 있다.
- 인터페이스도 상속이 가능하다.
- 인터페이스의 맴버는 반드시 public이다.
- 인터페이스는 그 인터페이스를 구현한 클래스를 어떻게 조작할 것인가를 규정한다. 그렇기 때문에 외부에서 제어 할 수 있는 가장 개방적인 접근 제어자인 public만을 허용한다. public을 생략하면 접근 제어자 default가 되는 것이 아니라 public이 된다. 왜냐하면 인터페이스의 맴버는 무조건 public이기 때문이다.
- abstract vs interface
- 인터페이스와 추상 클래스는 서로 비슷한 듯 다른 기능이다. 인터페이스는 클래스가 아닌 인터페이스라는 고유한 형태를 가지고 있는 반면 추상 클래스는 일반적인 클래스다. 또 인터페이스는 구체적인 로직이나 상태를 가지고 있을 수 없고, 추상 클래스는 구체적인 로직이나 상태를 가지고 있을 수 있다.
ㅤ
🗒️ 예제 - Printer test
- 'LG프린트'와 '삼성프린트' 클래스가 각각 존재하며, 각 프린트 클래스에는 흑백, 컬러 출력 기능이 있다고 가정.
- '프린터 테스트' 클래스에서는 각 사의 프린터를 사용하여 '컬러 출력'과 '흑백 출력' 기능을 사용하고자 함.
- 인터페이스를 사용하면 프린터 테스트의 기존 코드 변경을 최소화, 효율적으로 클래스에 정의된 '컬러', '흑백' 출력 기능을 사용할 수 있음.
1. lg프린트
public class LgPrinter implements MyPrinter{
public void grayPrint(){
System.out.println("엘지프린터-흑백 출력");
}
public void colorPrint(){
System.out.println("엘지프린터-컬러 출력");
}
}
2. 삼성프린트
public class SamsungPrinter implements MyPrinter{
public void grayPrint(){
System.out.println("삼성프린터-흑백 출력");
}
public void colorPrint(){
System.out.println("삼성프린터-컬러 출력");
}
}
3. myPRINT - 인터페이스 생성
// printer 클래스를 구현할 때 사용하는 규약
// 해당 인터페이스를 사용하는 클래스는 반드시
// 인터페이스 내에 정의된 메소드를 반드시 구현
public interface MyPrinter {
void grayPrint();
void colorPrint();
}
4. 프린터 테스트
- 인터페이스는 외부에서 클래스가 사용하는 방법을 명시하는 것이므로 외부에서 사용할 수 있게 public으로 인식함.
public class PrinterTest {
public void setPrinter(){
//인터페이스 사용
Map<String, String> map1 = new HashMap<>();
HashMap<String, String> map2 = new HashMap<>();
ItemService i1 = new ItemServiceImpl();
ItemServiceImpl i2 = new ItemServiceImpl();
//인터페이스를 구현한 클래스의 생성자를 호출해서
//인터페이스의 객체를 생성할 수 있다.
//인터페이스 단독으로 객체 생성 불가(생성자 호출 해야 하기 때문/내부 생성자 없음)
//MyPrinter p1 = new MyPrinter(); => 생성 불가
MyPrinter printer1 = new LgPrinter();
LgPrinter printer2 = new LgPrinter();
SamsungPrinter printer3 = new SamsungPrinter();
printer1.grayPrint();
printer1.colorPrint();
}
}
ㅤ
🔍 참고