본문 바로가기

개발/Java

인터페이스(interface)

인터페이스란?


  • 모든 메서드가 추상 메서드로 선언됨 public abstract
  • 모든 변수는 상수로 선언됨 public static final
 interfacce 인터페이스 이름 {

    public static final float pi = 3.14F;
    public void makeSomething( );
}
자바 8부터 디폴트 메서드(default method)와 정적 메서드(static method) 기능의 제공으로 일부 구현 코드가 있음

 

인터페이스 정의와 구현

예제 클래스 구조

 


1. Interface Calc

public interface Calc {

	double PI = 3.14;
	int ERROR = -999999999;
	
	int add(int num1, int num2);
	int substract(int num1, int num2);
	int times(int num1, int num2);
	int divide(int num1, int num2);
		
}
  • 구현부가 없는 메서드만 선언
  • 모든 변수는 상수로 선언( public static final )
  • 위처럼 클래스 이름 앞에 interface를 적는다.

 

2. Implements하는 Calculator

public abstract class Calculator implements Calc{

	@Override
	public int add(int num1, int num2) {
		return num1 + num2;
	}

	@Override
	public int substract(int num1, int num2) {
		return num1 - num2;
	}

}
  • Calculator 클래스는 Calc의 메서드를 구현해준다.
  • implements를 적어준다.
  • 인터페이스의 메서드를 다 구현해야 하지만 위처럼 선택적으로 구현이 가능하다
  • 대신 abstract class가 된다.

 

3. CompleteCalc

public class CompleteCalc extends Calculator {

	@Override
	public int times(int num1, int num2) {
		return num1 * num2;
	}

	@Override
	public int divide(int num1, int num2) {

		//분모가 0이면 안되기 때문에 만약 0이면 오류
		if ( num2 == 0) {
			return ERROR;
		}
		return num1/ num2;
	}
	
	public void showInfo() {
		
		System.out.println("모두 구현했습니다.");
	}
	
}
  • CompleteCalc는 추상 클래스 Calculator가 다 구현하지 않은 메서드를 상속받아 추가로 구현한다.
  • CompleteCalc 클래스 내에 자체적으로 메서드를 만들 수도 있다.

 

4. 결과

public class CalcTest {

	public static void main(String[] args) {

		int num1 = 10;
		int num2 = 2;
		
		Calc calc = new CompleteCalc();
		System.out.println(calc.add(num1, num2));
		System.out.println(calc.substract(num1, num2));
		System.out.println(calc.times(num1, num2));
		System.out.println(calc.divide(num1, num2));
			
	}

}

위 소스의 결과

▲ Calc 인터페이스와 Calculator는 추상 클래스이며 구현이 없는 클래스 이기에 인스턴스 생성을 못한다.

따라서 CompleteCalc클래스를 통해 만들지만 데이터 타입으로는 인터페이스인 Calc로 형 변환이 가능하다.

 

인터페이스 구현과 형 변환

  • 인터페이스를 구현한 클래스는 인터페이스 형으로 선언한 변수로 형 변환할 수 있음                                        ( ex. Calc calc = new CompleteCalc( ); )
  • 상속에서의 형 변환과 동일한 의미
  • 클래스 상속과 달리 구현 코드가 없으므로 여러 인터페이스를 구현할 수 있음 ( cf. extends )
  • 형 변환되는 경우 인터페이스에 선언된 메서드만을 사용 가능

 

타입 구현

 


 

인터페이스의 여러가지 요소


1. 상수

모든 변수는 상수 변환 됨 public static final

double PI = 3.14;
int ERRor = -99999999999;

 

2. 추상 메서드

모든 선언된 메서드는 추상 메서드 public abstract 

 

3. 디폴트(default) 메서드 

자바 8 이후
  • 구현을 가지는 메서드, 인터페이스를 구현하는 클래스들에게 공통으로 사용할 수 있는 기본 메서드
  • default 키워드 사용
ex )
default void description( ) {
         System.out.println("정수 계산기를 구현합니다.");
         myMethod( );
}
  • 구현 하는 클래스에서 재정의 할 수 있음
@Override
public void description( ) {
        System.out.println("CompleteCalc에서 재정의한 default 메서드");
        //super.description();
}
  • 인터페이스를 구현한 클래스의 인스턴스가 생성 되어야 사용 가능

 

4. 정적(Static) 메서드

자바 8 이후 
  • 인스턴스 생성과 상관 없이 인터페이스 타입으로 사용할 수 있는 메서드
ex )
static int total(int[ ] arr) {
         int total = 0;
         
         for( int i : arr ) {
                     total += 1;
         }
         mystaticMethod( );
         return total;
}

 

5.  private 메서드

자바 9 이후
  • 인터페이스를 구현한 클래스에서 사용하거나 재정의 할 수 없음
  • 인터페이스 내부에서만 사용하기 위해 구현하는 메서드
  • default 메서드나 static 메서드에서 사용
ex)
private void myMethod( ) {
          System.out.println("private method");
}

private static void mystaticMethod( ) {
          System.out.println("private static method");
}

 

반응형