Programming

; develop a program

Back-End/Java

[Java] 인터페이스(Interface)

Clloud_ 2023. 2. 9. 14:56
반응형

자식 클래스가 여러 부모 클래스를 상속받을 수 있다면, 다양한 동작을 수행할 수 있다.

하지만 클래스를 이용하여 다중 상속을 할 경우 메서드 출처의 모호성 등 여러 가지 문제가 발생할 수 있어 자바에서는 클래스를 통한 다중 상속은 지원하지 않는다.

하지만 다중 상속의 이점을 버릴 수는 없기에 자바에서는 인터페이스라는 것을 통해 다중 상속을 지원하고 있다.

 

이번 포스팅에서는 자바(Java)에서 인터페이스(Interface)에 대하여 공부를 해보고자 한다.

 


인터페이스란

인터페이스란 다른 클래스를 작성할 때 기본이 되는 틀을 제공하면서, 다른 클래스 사이의 중간 매개 역할까지 담당하는 일종의 추상 클래스를 의미한다.

인터페이스는 클래스 혹은 프로그램이 제공하는 기능을 명시적으로 선언하는 역할을 한다.

인터페이스는 추상 메서드와 상수로만 이루어져 있고 구현된 코드가 없기 때문에 인터페이스로 인스턴스를 생성할 수도 없다.

 

인터페이스 생성

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 abstract 예약어를 명시적으로 쓰지 않아도 컴파일 과정에서 자동으로 추상 메서드로 변환된다.
  • 인터페이스에서 선언한 변수는 값이 변하지 않는 상수로 자동 변환 된다.
  • public static final 예약어를 쓰지 않아도 무조건 상수로 인식한다.

 


클래스에서 인터페이스 구현

위에서 선언한 인터페이스를 클래스가 사용하는 것을 '클래스에서 인터페이스를 구현한다.(implements)'라고 표현한다.

인터페이스에서는 인터페이스에 선언한 기능을 클래스가 구현한다는 의미로 implements 예약어를 사용한다.

 

인터페이스를 클래스에서 구현하는 방법

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 인터페이스를 구현했다고 했으므로 추상 메서드 4개[add( ), substract( ), times( ), divide( ) 메서드]를 포함한다.
    (이 추상 메서드를 구현하지 않으면 추상 클래스가 된다.
  • 추상 메서드 times( )와 divide( )를 구현하지 않았으므로 Calculator는 추상 클래스이다.

 

클래스 다이어그램

 

  •  Calc 인터페이스와 Calculator 클래스의 클래스 다이어그램이다.

 


클래스 완성 및 실행

모든 메서드를 구현한 계산기 클래스를 만드려고 한다.

Calculator 추상 클래스를 상속받아 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) {
        if(num2 != 0 )
            return num1/num2;
        else 
            return Calc.ERROR;	//num2가 0, 즉 나누는 수가 0인 경우에 대한 오류 반환
    }

    public void showInfo(){	//CompleteCalc에서 추가로 구현한 메서드
        System.out.println("Calc 인터페이스를 구현하였습니다" );
    }
}
  • 숫자를 0으로 나눌 수 없기 때문에 9행에서 나누는 수 num2가 0이 아닐 때만 나누기 연산을 진행한다.
  • 만약 num2가 0이라면 12행처럼 Calc 인터페이스에서 상수로 선언해 둔 ERROR 메시지를 반환한다.

 

완성한 클래스 실행

public class CalculatorTest {
    public static void main(String[] args) {
        int num1 = 10;
        int num2 = 5;

        CompleteCalc 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.showInfo();
	}
}
  • 10과 5를 덧셈, 뺄셈, 곱셈, 나누셈 연산하고 결과 값을 출력한다.
  • 6행을 보면 구체적인 클래스인 CompleteCalc 클래스만 인스턴스를 생성할 수 있다.
  • Caculator 클래스는 추상 클래스이므로 인스턴스를 생성할 수 없고, Calc 인터페이스는 추상 메서드만으로 선언되었기 때문에 인스턴스를 생성할 수 없다.

 

출력 결과

15
5
50
2
Cal 인터페이스를 구현하였습니다.

 


인터페이스 구현과 형 변환

Calculator 클래스는 인터페이스에서 선언한 추상 메서드 중 일부 메서드만 구현했으므로 추상 클래스이다.

이를 상속받은 CompleteCalc 클래스는 Calculator 클래스에서 구현하지 않은 나머지 추상  메서드를 모두 구현하고 showInfo( ) 메서드를 추가로 구현했다.

 

 

이러한 상속 관계에서 하위 클래스는 상위 클래스 자료형으로 묵시적 형 변환을 할 수 있는데, 인터페이스도 마찬가지이다.

CompleteCalc 클래스는 상위 클래스인 Calculator형이면서, Calc 인터페이스를 구현했으므로 Calc형이기도 한다.

 

따라서 다음처럼 Calc형으로 선언한 변수에 대입할 수 있다.

Calc calc = new CompleteCalc();
  • newCalc 변수가 사용할 수 있는 메서드는 메서드 목록에 Calc에서 선언한 추상 메서드[add( ), substract( ), times( ), divide( )]는 있지만, CompleteCalc 클래스에서 추가로 구현한 showInfo( ) 메서드는 없다.
  • 즉 Calc형으로 선언한 변수에서 사용할 수 있는 메서드는 Calc 인터페이스에 선언한 메서드뿐이다.

 

인터페이스를 구현한 클래스가 있을 때 그 클래스는 해당 인터페이스형으로 묵시적 형 변환이 이루어지며, 형 변환 되었을 때 사용할 수 있는 메서드는 인터페이스에서 선언한 메서드뿐이다.

 

 

각 자료형에서 사용할 수 있는 메서드 범위

 

 


반응형

'Back-End > Java' 카테고리의 다른 글

[Java] 인터페이스 요소  (0) 2023.02.10
[Java] 인터페이스와 다형성  (0) 2023.02.09
[Java] final 예약어  (0) 2023.02.08
[Java] 템플릿 메서드(Template Method)  (0) 2023.02.07
[Java] 추상 클래스(abstract method)  (0) 2023.02.07