반응형
인터페이스란?
- 모든 메서드가 추상 메서드로 선언됨 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");
}
반응형
'개발 > Java' 카테고리의 다른 글
제네릭(Generic) 프로그래밍 <T> (0) | 2021.05.01 |
---|---|
[JAVA 파헤치기] 자바의 유용한 클래스들 (0) | 2021.04.29 |
추상 클래스의 응용 - 템플릿 메서드 패턴 (0) | 2021.04.26 |
추상 클래스(abstract class) (0) | 2021.04.26 |
다운 캐스팅과 instanceof (0) | 2021.04.26 |