인터페이스 선언과 구현하기
인터페이스와 다형성 구현
인터페이스 활용하기
인터페이스 선언과 구현하기
인터페이스란?
모든 메서드가 추상 메서드(abstract method)로 이루어진 클래스
형식적인 선언만 있고 구현은 없음
interface InterfaceName {
public static final float PI = 3.14f;
public void add();
}
인터페이스에 선언된 모든 메서드는 public abstract로 추상 메서드
인터페이스에 선언된 모든 변수는 public static final로 상수
인터페이스 만들기
public interface Calc {
double PI = 3.14; // 인터페이스에서 선언한 변수는 컴파일 과정에서 상수로 변환됨
int ERROR = -9999999;
int add(int num1, int num2); // 인터페이스에서 선언한 메서드는 컴파일 과정에서 추상 메서드로 변환됨
int substract(int num1, int num2);
int times(int num1, int num2);
int divide(int num1, int num2);
}
클래스에서 인터페이스 구현하기
Calc 인터페이스를
Calculator 클래스에서 구현
Calc의 모든 추상 메서드를 구현하지 않으면
Calculator는 추상 클래스가 됨
CompleteCalc클래스가 Calculator를
상속받은 후 모든 메서드를 구현
CompleteCalc는 생성 가능한 클래스
인터페이스 구현과 형 변환
인터페이스를 구현한 클래스는 인터페이스 형으로 선언한 변수로 형 변환할 수 있음
상속에서의 형 변환과 동일한 의미
단 클래스 상속과 달리 구현코드가 없기 때문에 여러 인터페이스를 구현할 수 있음
형 변환시 사용할 수 있는 메서드는 인터페이스에 선언된 메서드만 사용할 수 있음
Calc calc = new CompleteCalc();
/*
CompleteCalc가 Calc 형으로 대입된 경우 사용할 수 있는 메서드
*/
인터페이스와 다형성
인터페이스는 "Client Code"와 서비스를 제공하는 "객체" 사이의 약속이다.
어떤 객체가 어떤 interface 타입이라 함은 그 interface가 제공하는 메서드를 구현했다는 의미임
Client는 어떻게 구현되었는지 상관없이 interface의 정의만을 보고 사용할 수 있음 (ex : JDBC)
다양한 구현이 필요한 인터페이스를 설계하는 일은 매우 중요한 일임
인터페이스의 요소
상수 : 모든 변수는 상수로 변환됨
추상 메서드 : 모든 메서드는 추상 메서드로 구현
정적 메서드 : 인스턴스 생성과 상관없이 인터페이스 타입으로 사용할 수 있는 메서드
private 메서드 : 인터페이스를 구현한 클래스에서 사용하거나 재정의 할 수 없음.
인터페이스 내부에서만 기능을 제공하기 위해 구현하는 메서드
디폴트 메서드 정의
// Calc 인터페이스에 디폴트 메서드 정의
public interface Calc {
...
default void description(){
System.out.println("정수 계산기를 구현합니다.");
}
}
// CompleteCalc에서 재정의 하기
public class CompleteCalc extends Calculator{
...
@Override
public void description() {
super.description();
}
}
private 메서드
인터페이스 내부에 private 혹은 private static으로 선언한 메서드 구현
private static은 정적 메서드에서 사용가능
public interface Calc {
...
default void description(){
System.out.println("정수 계산기를 구현합니다.);
myMethod(); // 디폴트 메서드에서 private 메서드 호출
}
static int total(int[] arr) {
int total = 0;
for(int i : arr){
total += i;
}
myStaticMethod(); // 정적 메서드에서 private static 메서드 호출
return total;
}
private void myMethod() {
System.out.println("private 메서드입니다.); // private 메서드
}
private static void myStaticMethod() {
System.out.println("private static 메서드입니다."); // private static 메서드
}
두 개의 인터페이스 구현하기
package interfaceex;
public interface Buy {
void buy();
}
package interfaceex;
public interface Sell{
void sell();
}
두 인터페이스를 구현한 클래스
package interfaceex;
public class Customer implements Buy, Sell { //Customer 클래스는 Buy, Sell 인터페이스 모두를 구현함
@Override
public void sell() {
System.out.println("구매하기");
}
@Override
public void buy() {
System.out.println("판매하기");
}
인터페이스 상속
인터페이스 간에도 상속이 가능
구현 코드의 상속이 아니므로 형 상속(type inheritance)이라고 함
인터페이스 구현과 클래스 상속 함께 사용하기
public class BookShelf extends Shelf implements Queue {
@Override
public void enQueue(String title) {
shelf.add(title); // 배열에 요소 추가
{
@Override
public String deQueue() {
return shelf.remove(0); // 맨 처음 요소를 배열에서 삭제하고 반환
}
@Override
public int getSize() {
return getCount(); // 배열 요수 개수 반환
}
}
'IT' 카테고리의 다른 글
[Do it! 자바 프로그래밍 입문] 12 컬렉션 프레임워크 (0) | 2022.06.08 |
---|---|
[Do it! 자바 프로그래밍 입문] 11 기본클래스 (0) | 2022.06.05 |
[Do it! 자바 프로그래밍 입문] 09 추상 클래스 (0) | 2022.05.31 |
[Do it! 자바 프로그래밍 입문] 08 상속과 다형성 (0) | 2022.05.31 |
[Java 개발자가 되기 위한 첫걸음 2] 04 캡슐화와 정보 은닉 (0) | 2022.05.28 |