본문 바로가기

언어/Java

인터페이스 예시

인터페이스 생성

package com.my.product.dao;

import com.my.exception.AddException;
import com.my.product.dto.Product;

public interface ProductDAOInterface {	// 모든 메서드는 추상메서드
	/**
	 * 상품을 저장소에 저장한다. 저장소가 꽉찬 경우 "저장소가 꽉찼습니다" 메시지가 출력되고 저장안된다.
	 * @param product 상품
	 */	
	void insert(Product product) throws AddException ;	// abstract가 생략된 형태 = public abstract void insert(Product product);와 같음
	// 부모 자식 동일해야해서  throws AddException 넣어줌 부모쪽에 선언한 Exception만 자식쪽에서 선언가능
	
	/**
	 * 상품번호에 해당 상품을 저장소에서 검색하여 반환한다
	 * @param prodNo 상품번호
	 * @return 상품객체. 번호에 해당 상품을 찾지 못하면 null을 반환한다 
	 */
	Product selectByProdNo(String no);
	
	/**
	 * 저장소에 저장된 상품들만 반환한다
	 * @return 상품들. 저장소에 저장된 상품이 한개도 없으면 null을 반환한다 
	 */
	Product[] selectAll();

}

ProductDAOArray에 작성되어 있던 문서용 주석 ProductDAOInterface로 옮긴 후,

public class ProductDAOArray 뒤에 implements ProductDAOInterface 추가한다.

커서 올렸을 때 상위의 설명서가 오버라이드된 하위에 뜨는거 볼 수 있음, 삼각형표시 오버라이딩된 메서드란 뜻

interface A { void a();}
interface B extends A{ void b();}
interface C { void c();}
class D implements B,C {
	public void a() { }
	public void b() { }
	public void c() { }
	public void d() { }
}

D d = new D(); d.a(); d.b(); d.c(); d.d();
B b = new D(); b.a(); b.b(); 	// b.c(); b.d(); 사용불가
A a = new D(); a.a();; 		// a.b(); a.c(); a.d(); 사용불가

- D 클래스는 B 인터페이스와 C 인터페이스를 모두 구현(implements)

   D 클래스의 인스턴스인 d를 통해 B와 C 인터페이스의 모든 메서드(a(), b(), c())에 접근 가능

   D 클래스에만 정의된 d() 메서드에도 접근 가능


-  b는 인터페이스 B의 참조 변수로, D 클래스의 인스턴스를 참조.

   인터페이스 타입으로 선언된 변수는 해당 인터페이스에 정의된 메서드만 사용가능

   B 타입으로 선언된 변수는 B 인터페이스에 정의된 메서드만 접근

   따라서 b.a();와 b.b();는 B 인터페이스에 정의된 a()와 b() 메서드를 호출
   실제로 실행되는 메서드는 D 클래스에서 오버라이드된 메서드
   D 클래스에서 B 인터페이스의 메서드를 구현(오버라이드)한 내용이 실행됩니다.

   b.c();: C 인터페이스에 정의된 메서드이지만, B 타입으로 선언된 변수 b는 C 인터페이스의 메서드에 직접 접근 불가

 

-  A 타입으로 선언된 a 변수도 실제로 D 클래스의 인스턴스를 참조

   A 타입으로 선언된 변수이기 때문에 A 인터페이스에 정의된 a.a() 메서드에만 접근가능


→ 이러한 특성은 인터페이스의 다형성

'언어 > Java' 카테고리의 다른 글

리플렉션(Reflection)  (0) 2023.08.02
GUI프로그램  (0) 2023.08.02
인터페이스(Interface)  (0) 2023.08.01
클래스의 용도  (0) 2023.08.01
이클립스 Source로 메서드 작성하기  (0) 2023.08.01