인터페이스3

1. 인터페이스의 요소

  • 상수: 모든 변수는 상수로 변환된다
  • 추상 메서드: 모든 메서드는 추상 메서드로 구현된다
  • 디폴트 메서드: 기본 구현을 가지는 메서드,구현 클래스에서 재정의 가능하다

=> 구현 클래스에서 공통으로 사용하는 메서드를 구현

//형식
default 리턴타입 메서드명([매개변수]){
	구현부
}
//예시
default void createCale() {
		System.out.println("계산기를 구현합니다.");
}
  • 정적 메서드: 인스턴스 생성과 상관 없이 인터페이스 타입으로 사용할 수 있는 메서드
//형식
static 리턴타입 메서드명([매개변수]){
	구현부
}
//예시
static void createCale() {
		System.out.println("계산기를 구현합니다.");
}
//사용
인터페이스명.메서드명([매개변수]);
Calc.createCale();
  • private 메서드: 인터페이스 내부에서만 기능을 제공하기 위해 구현하는 메서드, 구현 클래스에서 사용하거나 재정의 할 수 없다

2. 두 개의 인터페이스 구현하기

  • 하나의 클래스에서 여러 개의 인터페이스 구현 가능

  • 예시

public interface Buy {
	void buy();
	
	default void order() {
		System.out.println("구매주문");
	}
}
public interface Sell {
	void sell();
	
	default void order() {
		System.out.println("판매주문");
	}
}
public class Customer implements Buy, Sell {

	@Override
	public void sell() {
		System.out.println("판매하기");
	}

	@Override
	public void buy() {
		System.out.println("구매하기");
	}
	
    //여러 인터페이스에 같은 이름의 메서드가 있으면 구현 클래스에서 오버라이드
	@Override
	public void order() {
		System.out.println("고객 판매주문");
	}

}
public class CustomerTest {
	public static void main(String[] args) {
		Customer customer = new Customer();
		
		Buy buyer = customer;
		buyer.buy();
		//buyer.sell(); //사용불가(인스턴스의 타입에 따라 사용 가능한 메서드가 달라진다)
		
		Sell seller = customer;
		seller.sell();
		//seller.buy(); //사용불가(인스턴스의 타입에 따라 사용 가능한 메서드가 달라진다)
		
		//가상 메서드 => 타입이 아니라 인스턴스의 메서드가 사용된다.
		customer.order(); //Customer 클래스의 메서드 호출
		buyer.order(); //Customer 클래스의 메서드 호출
		seller.order(); //Customer 클래스의 메서드 호출
	}
}

3. 인터페이스 상속

  • 인터페이스 간에도 상속이 가능
  • 구현 코드의 상속이 아니므로 형 상속(type inheritance)라고 한다

  • 구현 시 상속 받은 상위 인터페이스의 추상 메서드도 모두 구현해야 한다

  • 예시
public interface X {
	void x();
}
public interface Y {
	void y();
}
//인터페이스 상속
public interface MyInterface extends X, Y {
	void myMethod();
}
public class MyClass implements X, Y, MyInterface {

	@Override
	public void y() {
		System.out.println("y()");
	}

	@Override
	public void x() {
		System.out.println("x()");
	}
	
	@Override
	public void myMethod() {
		System.out.println("myMethod()");
	}
	
	public static void main(String[] args) {
		MyClass myClass = new MyClass();
		//전부 사용 가능
		myClass.x();
		myClass.y();
		myClass.myMethod();
		
		X xClass = myClass; //X 인터페이스로 형변환
		xClass.x(); //사용 가능
		//xClass.y(); //사용 불가
		//xClass.myMethod(); //사용 불가
	}
}

4. 인터페이스 구현과 클래스 상속 함께 사용하기

  • 클래스를 상속 받으면서 동시에 인터페이스 구현도 가능하다

  • 예시

public interface Queue {
	void enQueue(String title);
	String deQueue();
	int getSize();
}
import java.util.ArrayList;

public class Shelf {
	protected ArrayList<String> shelf;
	
	public Shelf() {
		shelf = new ArrayList<String>();
	}
	
	public ArrayList<String> getShelf(){
		return shelf;
	}
	
	public int getCount() {
		return shelf.size();
	}
}
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();
	}
	
}
public class BookShelfTest {
	public static void main(String[] args) {
		Queue shelfQueue = new BookShelf();
		shelfQueue.enQueue("도서1");
		shelfQueue.enQueue("도서2");
		shelfQueue.enQueue("도서3");
		
		System.out.println(shelfQueue.deQueue());
		System.out.println(shelfQueue.deQueue());
		System.out.println(shelfQueue.deQueue());
	}
}

태그:

카테고리:

업데이트: