최대 1 분 소요

인터페이스란?

인터페이스는 클래스 혹은 프로그램이 제공하는 기능을 명식적으로 선언하는 역할을 한다. 인터페이스는 추상 메서드와 상수로만 이루어져 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//Calc.java (최상위 클래스)
public interface Calc {
    
    //선언된 변수는 컴파일을 통해서 상수로 변환됨
    double PI = 3.14;
    int ERROR = -99999999;
 
    //인터페이스에서 선언한 메서드는 컴파일 과정에서 추상 메서드로 변환됨
    int add(int num1, int num2);
    int substract(int num1, int num2);
    int times(int num1, int num2);
    int divide(int num1, int num2);
    
}
 
cs


인터페이스에서는 인터페이스에 선언한 기능을 클래스가 구현한다는 의미로 implements 에약어 를 사용한다. 상속한다는 의미인 extends와 기능은 비슷하지만, 인터페이스에서 상복받았다는 의미로 implements 예약어를 사용한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//Calculator.java (인터페이스인 Calc.java 를 상속받음)
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;
    }
 
}
 
cs


근데 인터페이스에서는 4개의 추상 메서드를 만들었는데, Calculator.java 에서는 2개의 메서드만 구현 메서드로 바꾸었으므로 이 클래스 역시 추상 클래스가 된다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//CompleteCalc.java (Calculator.java 의 하위 클래스)
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;
    }
 
    public void showInfo() {
        System.out.println("Calc 인터페이스를 구현하였습니다.");
    }
}
 
cs


인터페이스를 왜 사용할까?

이 프로그램이 어떤 메서드를 제공하는지 미리 안려주는 명세 또는 약속의 역할을 한다. 대충 인터페이스의 선언부만 봐도 이 클래스가 무슨 역할을 하는지 짐작할 수 있다.

디폴트 메서드

디폴트 메서드란 말 그대로 기본으로 제공되는 메서드이다. 대폴트 메서드는 인터페이스에서 구현하지만, 이후 인터페이스를 구현한 클래스가 생성되면 그 클래스에서 사용할 기본 기능이다. 디폴트 메서드를 선언할 때는 default 예약어 를 사용한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//Calc.java 
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();
        calc.description();
    }
}
 
cs


정적 메서드

정적 메서드는 static 예약어 를 사용하여 선언하며 클래스 생성과 무관하게 사용할 수 있다. 정적 메서드를 사용할 때는 인터페이스 이름으로 직접 참조하여 사용한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
//Calc.java 수정
public interface Calc {
    
    //선언된 변수는 컴파일을 통해서 상수로 변환됨
    double PI = 3.14;
    int ERROR = -99999999;
 
    //인터페이스에서 선언한 메서드는 컴파일 과정에서 추상 메서드로 변환됨
    int add(int num1, int num2);
    int substract(int num1, int num2);
    int times(int num1, int num2);
    int divide(int num1, int num2);
    
    //디폴트 메서드
    default void description() {
        System.out.println("정수 계산기를 구현합니다.");
    }
    
    //정적 메서드
    static int total(int[] arr) {
        int total = 0;
 
        for (int i : arr) {
            total += i;
        }
        return total;
    }
}
 
cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//CalculatorTest.java
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();
        calc.description();
        int[] arr = {12345};
        //인터페이스 이름으로 직접 참조
        System.out.println(Calc.total(arr));
    }
}
 
cs

private 메서드

private 메서드란 인터페이스를 구현한 클래스에서 사용하거나 재정의 할 수 없다. 따라서 기존에 구현된 코드를 변경하지 않고 인터페이스를 구현한 클래스에서 공통으로 사용하는 경우에 사용된다.

태그:

카테고리:

업데이트:

댓글남기기