[Chap 10] 인터페이스
인터페이스란?
인터페이스는 클래스 혹은 프로그램이 제공하는 기능을 명식적으로 선언하는 역할을 한다. 인터페이스는 추상 메서드와 상수로만 이루어져 있다.
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 = {1, 2, 3, 4, 5}; //인터페이스 이름으로 직접 참조 System.out.println(Calc.total(arr)); } } | cs |
private 메서드
private 메서드란 인터페이스를 구현한 클래스에서 사용하거나 재정의 할 수 없다. 따라서 기존에 구현된 코드를 변경하지 않고 인터페이스를 구현한 클래스에서 공통으로 사용하는 경우에 사용된다.
댓글남기기