인터페이스의 요소들 ( 명세 , 설계도)
상수 : 선언된 모든 변수는 상수로 처리된다.
메소드 : 모든 메소드는 추상 메소드 이다.
디폴트 메소드 : 기본 구현을 가지는 메소드 구현하는 클래스에서 재정의 할수 있다.(java 8)
정적 메소드 : 인스턴스 생성과 상관없이 인터페이스 타입으로 호출하는 메소드(java 8)
private 메소드 : 인터페이스 내에서 사용하기 위해 구현한 메소드 구현하는 클래스에서 재정의 할수 없다.
여러 개의 인터페이스 구현하기
인터페이스는 구현 코드가 없으므로 하나의 클래스가 인터페이스를 구현 할수 있다
디폴트 메소드의 이름이 중복되는 경우 재정의 한다.
extends 키워드 뒤에 오는건 하나이다. Implements 뒤에 100개가 와도 상관이 없다.
인터페이스 상속
인터페이스 간에도 상속이 가능하다
구현이 없으므로 extends 뒤에 여러 인터페이스를 상속받을수 있다.
구현내용이 없으므로 타입상속(type inheritance) 라고 한다.
package interfaceex;
public interface Calc {
public static final double PI = 3.14;
int ERROR = -9999999;
public int add(int num1 ,int num2);
public int substract(int num1 ,int num2);
public int times(int num1 ,int num2);
public int divide(int num1 ,int num2);
default void description() {// 설명을 해주는 메소드 ( 인터페이스에 일반메소드를 정의할수있다.)
System.out.println("정수 계산기를 구현합니다.");
// myMethod();
}
// static 메소드도 만들수있다.
static int total(int[] arr) { // arr가 들어오면 arr의 합을 계산해줘서 합을 반환해주는 메소드
int total = 0; // static을 줘서 인터페이스 타입으로 가져다가 써보자
for(int i : arr) {
total += i;
}
return total;
}
// private 메소드를 쓸수있다. 자바 9 부터 쓸수있는 기능이다.
/*
private void myMethod() { // 같은클래스 즉 인터페이스에서 일반메소드 호출할수있다.
System.out.println("private method");
}
private static mystaticMethod() { // private 메소드에 static 메소드 선언하면 static 메소드에서 불러올수있다.
System.out.println("private static method");
}*/
}
인터페이스에서 일반메소드 , 정적메소드를 생성할수있다.
package interfaceex;
public class CalcTest {
public static void main(String[] args) {
CompleteCalc calc = new CompleteCalc();
int n1 = 10;
int n2 = 20;
System.out.println(calc.add(n1, n2));
System.out.println(calc.substract(n1, n2));
System.out.println(calc.times(n1,n2));
System.out.println(calc.divide(n1, n2));
calc.description();
int[] arr = {1,2,3,4,5}; // 배열 생성 및 초기화
int sum = Calc.total(arr); // static은 인터페이스 타입으로 가져다가 쓴다.
System.out.println(sum);
}
}
static 으로 구현한 인터페이스의 total 메소드는 인터페이스 타입 으로 불러올수있다.
package interfaceex;
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) {
System.out.println("0으로 나눌수없습니다.");
return 0;
}
return num1 / num2;
}
// 인터페이스의 일반 메소드를 자식 클래스에서 재정의 할수 있다.
@Override
public void description() {
System.out.println("재정의 한 description");
}
}
인터페이스의 일반 메소드를 자식 클래스에서 재정의 할수 있다.
'JAVA Programming > JAVA 문제' 카테고리의 다른 글
[55] equals 를 재정의 하여 날짜가 같으면 true 반환 (0) | 2020.07.20 |
---|---|
[49] 코딩해보세요 , 인터페이스로 정렬 알고리즘 구현하기 (0) | 2020.07.17 |
[42] 템플릿 메소드문제( ArrayList, 템플릿메소드 run() , 추상클래스) (0) | 2020.07.16 |
[38] 코딩해보세요 (상속,오버라이딩,업캐스팅,ArrayList 활용) (0) | 2020.07.16 |
[31] ArrayList 활용 문제 (0) | 2020.07.15 |