본문 바로가기

Java

인터페이스 ( interface )

인터페이스 ( 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