인터페이스 ( interface )란?
인터페이스란 다른 클래스를 작성할 때 기본이 되는 틀을 제공하면서, 다른 클래스 사이의 중간 역할까지 담당하는 추상 클래스를 의미한다.
자식 클래스가 여러 부모 클래스를 상속 받을 수 있다면 다양한 동작을 수행할 수 있다는 장점이 있지만, 클래스를 이용하여 다중 상속을 할 경우 출처의 모호성과 코드를 작성할 때 방어적 코드를 함께 적어주어야 된다는 단점이 있어 자바에서는 클래스를 통한 다중 상속은 지원하지 않는다. 하지만 다중 상속의 장점을 버릴 수 없어 인터페이스라는 것을 통해 다중 상속을 지원하고 있다.
인터페이스는 오로지 추상 메서드와 상수만을 포함할 수 있다.
인터페이스 특징
- 추상 메서드 : 인터페이스는 추상 메서드(구현부가 없는 메서드)만을 가질 수 있다. 자바 8부터는 default 메서드와 static메서드를 가질 수 있게 되었다.
- 다중 상속 : 클래스는 여러 인터페이스를 구현할 수 있으므로, 다중 상속의 효과를 낼 수 있다.
- 구현 : 클래스가 인터페이스를 구현할 때는 implements 키워드를 사용한다.
인터페이스가 하는 일
- 클래스나 프로그램이 제공하는 기능을 명시적으로 선언한다.
- 일종의 클라이언트 코드와의 약속이며 클래스나 프로그램이 제공하는 명세서(specification)이다.
- 클라이언트 프로그램은 인터페이스에 선언된 메서드 명세만 보고 이를 구현한 클래스를 사용할 수 있다.
- 어떤 객체가 하나의 인터페이스 타입이라는 것은 그 인터페이스가 제공하는 모든 메서드를 구현했다는 의미이다.
- 인터페이스를 구현한 다양한 객체를 사용한다 -> 다형성
명세서(specification)
전달 전에 제품에 포함되어야 하는 기능이나 특성을 자세히 설명하는 문서이다. 웹을 설명하는 맥락에서, '명세서(spec)' 라는 용어는 일반적으로 언어, 기술 또는 전체 개방형 웹 기술 세트를 구성하는 API를 설명하는 문서를 의미한다.
인터페이스 구현과 형 변환
- 인터페이스를 구현한 클래스는 인터페이스 형으로 선언한 변수로 형 변환 할 수 있다.
- Calc calc = new CompleteCalc();
- 상속에서의 형 변환과 동일한 의미이다.
- 클래스 상속과 달리 구현 코드가 없으므로 여러 인터페이스를 구현할 수 있다. (cf.extends)
- 형 변환되는 경우 인터페이스에 선언된 메서드만 사용 가능하다.
형변환
((CompleteCalc) calc).showInfo();
package basic.ch22;
public interface Calc {
public abstract int add(int n1, int n2);
public abstract int substract(int n1, int n2);
public abstract int times(int n1, int n2);
public abstract double divide(int n1, int n2);
}
package basic.ch22;
public abstract class Calculator implements Calc{
// 만약 n1 / n2를 나누면 0으로 나눌 수 없습니다 라고 sysout
// 예상 테스트 값 n1 = 10, n2 = 0
@Override
public double divide(int n1, int n2) {
if(n1 == 0 || n2 == 0) {
System.out.println("0으로 나눌 수 없습니다.");
return 0.0;
}
return n1 / n2;
}
}
package basic.ch22;
public class CompleteCalc extends Calculator{
@Override
public int add(int n1, int n2) {
return n1 + n2;
}
@Override
public int substract(int n1, int n2) {
return n1 - n2;
}
@Override
public int times(int n1, int n2) {
return n1 * n2;
}
public void showInfo() {
System.out.println("계산 완료");
}
// 코드 테스트 메인 함수
public static void main(String[] args) {
Calc calc = new CompleteCalc(); // 업캐스팅된 상태
System.out.println(calc.add(10, 10));
System.out.println(calc.divide(10, 0));
System.out.println("-------------------------");
((CompleteCalc)calc).showInfo();
// 반복문, 제어문을 활용한다면 instanceof 연산자를 기억하자
if(calc instanceof CompleteCalc) {
((CompleteCalc) calc).showInfo();
}
}// end of main
}
728x90
'Java' 카테고리의 다른 글
Object 클래스와 equals 메서드 (0) | 2024.04.25 |
---|---|
인터페이스 ( interface ) 고찰 (0) | 2024.04.25 |
다형성 ( Polymorphism ) (0) | 2024.04.24 |
의존 관계 ( Dependency ) (0) | 2024.04.24 |
연관 관계 ( Association )란? (1) | 2024.04.23 |