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 |