인터페이스의 필요성
- 구현의 강제로 통일성 향상(=표준화)
- 인터페이스를 통한 간접적인 클래스 사용으로 모듈 교체가 용이 => 특정 클래스를 직접 다루는 대신, 부모 인터페이스 타입으로 클래스를 다루게 되면 실제 인스턴스가 바뀌더라도 기존 코드를 수정할 필요가 없어짐
- 서로 상속 관계가 없는 클래스간의 인터페이스를 통한 상속 관계 부여 => 다형성 확장
- 모듈간 독립적 프로그래밍으로 인한 개발 기간 단축
2. 인터페이스를 통한 간접적인 클래스를 사용으로 모듈 교체가 용이
➡️인터페이스 사용 시 손쉬운 모듈 교체를 지원한다!
/*
* 문서 등을 프린터로 출력하기 위한 각 프린터 클래스 정의
* => 각 프린터의 출력 기능을 갖는 printer 인터페이스를 정의하고 각 프린터 클래스에서 상속받아 구ㅕㄴ
*/
interface Printer { //프린터
//프린터기의 공통 기능인 출력(print()) 기능을 추상메서드 정의
public abstract void print(String fileName);
}
class LaserPrinter implements Printer { //레이저프린터
// 파일(String 타입 fileName)을 전달받아 출력 작업을 수행하는 print() 메서드 정의
// => Printer 인터페이스로부터 상속받아 구혀
@Override
public void print(String fileName) {
System.out.println("LaserPrinter로 " + fileName + "출력하기!");
}
}
class InkjetPrinter implements Printer { // 잉크젯프린터
@Override
public void print(String fileName) {
System.out.println("InkjetPrinter로 " + fileName + "출력하기!");
}
}
class DotPrinter implements Printer { // 도트 프린터
@Override
public void print(String fileName) {
System.out.println("DotPrinter로 " + fileName + "출력하기!");
}
}
LaserPrinter lp = new LaserPrinter();
lp.print("a.txt");
InkjetPrinter ip = new InkjetPrinter();
ip.print("b.txt");
DotPrinter dp = new DotPrinter();
dp.print("c.txt");
Printer p = lp; //업캐스팅
p.print("d.txt");
→ 기존에 해왔던 방식이라면,
2.인터페이스를 통한 간접적인 클래스를 사용으로 모듈 교체가 용이 방법은
PrinterClient pc = new PrinterClient();
//PrintClient 인스턴스의 setPrint() 메서드를 호출하여
//각 프린터기 인스턴스를 파라미터로 전달하면 업캐스팅 일어남
pc.setPrinter(new LaserPrinter()); // LaserPrinter -> Printer 업캐스팅
//=> setPrinter(Printer printer)로 정의되어 있으므로
// Printer printer = new LaserPrinter();가 됨
// 좌변이 타입이 부모클래스 타입이고, 오른쪽의 인스턴스 생성이 자식클래스라면
// 묵시적 형변환 즉, 업캐스팅이 일어남!
pc.print("Hello.java");
//=> PrinterClient 인스턴스의 print() 메서드를 호출하면
// 인스턴스 내의 Printer 타입 변수에 저장된 인스턴스 print() 호출됨
// => 결국 실제 저장된 LaserPrinter 인스턴스의 print() 메서드가 호출됨
// 현재 LaserPrinter를 InkjetPrinter로 교체 시
// setPrinter() 메서드에 InkjetPrinter 인스턴스만 전달하면
// 자동으로 출력 대상이 변경됨
pc.setPrinter(new InkjetPrinter()); // InkjetPrinter -> Printer 업캐스팅
pc.print("Hello.java");
pc.setPrinter(new DotPrinter()); // DotPrinter -> Printer 업캐스팅
pc.print("Hello.java");
위 방법으로 표현할 수 있다.
'JAVA' 카테고리의 다른 글
[JAVA] 인터페이스 ⑤ - 인터페이스의 필요성(3) (0) | 2023.10.11 |
---|---|
[JAVA] 인터페이스 ④ - 인터페이스의 필요성(2) (1) | 2023.10.10 |
[JAVA] 인터페이스 ② 다이아몬드 상속에서의 문제점(이슈)와 예제 (0) | 2023.10.10 |
[JAVA] 예제로 알아보는 인터페이스(Interface) ① (0) | 2023.10.10 |
[JAVA] 레퍼런스 형변환에 대해 알아보자 (0) | 2023.09.26 |