JAVA/이론

33. [ JAVA ] 상속 : interface

천재단미 2024. 12. 16. 17:59
728x90
반응형

상속interface

 

1

 

인터페이스는 클래스 키워드를 사용하지 않습니다. 

인터페이스도 필드를 선언할 수 있지만 변수가 아닌 상수(final)로서만 정의할 수 있습니다. 

상수(final) : 한번 결정되면 값을 바꾸지 못하고, static으로 되어있는 변수 

static이 있으면, 메모리의 date 영역에 저장된다.(heap에 저장하지 않는다.)

 

예 )



    String name;
       int age;



 

위와 같은 변수의 경우 오류 발생합니다. 

public static final 과 public abstract 제어자는 생략이 가능합니다.

인터페이스에 정의된 모든 멤버에 적용되는 사항이기 때문에 편의상 생략 가능하게 지원하는 것입니다. 생략된 제어자는 컴파일 시에 컴파일러가 자동으로 추가해 줍니다.

 

 

예) 




package entety;

public interface Card {


    public static final int  CLOVER = 1;
    public static final int  HEART = 2;
    public static final int  DIAMOND = 3;
    public static final int  SAPDE = 2;
    


 

구현하지 않는, 함수 이름만 적을 수 있습니다. 

 

2-1
2
3

 

0

자바는 클래스 상속에 대해서 다중 상속을 허용하지 않지만, 인터페이스에 한해서는 다중상속을 허용한합니다.

 



[ 인터페이스의 extends는 상속이 아니다?? ]


인터페이스는 하나의 타입이나 규격일 뿐이지 그 자체가 하나의 객체가 되는 것이 아닙니다. 
따라서 엄밀히 말하자면, 
인터페이스의 상속은 클래스의 상속처럼 부모의 속성과 동작을 물려받는 것이 아닙니다. 
정확히 말하면, 인터페이스의 상속은 규격이나 스펙 자체 혹은 기능 자체의 선언을 물려받은 것입니다. 
규격이나 스펙을 물려받아서 새로운 스펙을 만든다면 기존 여러 개의 스펙을 조합해서 하나로 묶거나 기존의 스펙을 고스란히 물려받은 후에 다시 추가적인 기능을 가지게 하는 것이다.


 

 

1. 예시 

 

 

1) 예시

4

 

 




package entety;

public interface PaymentProcessor {
    boolean processPayment(double amount);
    void refund(double amount);
    String getPaymentMethod();

}


5

 

 




package entety;

public class CreditCardPayment implements PaymentProcessor {
    private String cardNumber;
    private String cardHolderName;

    // 생성자

    public CreditCardPayment() {
    }

        // cardNumber와 cardHolderName을 초기화하세요.

    public CreditCardPayment(String cardNumber, String cardHolderName) {
        this.cardNumber = cardNumber;
        this.cardHolderName = cardHolderName;
    }



    @Override
    public boolean processPayment(double amount) {

        // 1. "[cardHolderName]의 카드 [cardNumber]로 [amount]원

        System.out.println(cardHolderName + "의 카드" + cardNumber "로" amount + "원 결제 시도" );

        // 2. true를 리턴하시오.

        return true;
    }


    @Override
    public void refund(double amount) {

        // "[cardHolderName]의 카드 [cardNumber]로 [amount]원 환불 처리" 메시지 출력

        System.out.println( cardHolderName + "의 카드" + cardNumber "로" amount + "원 환불 처리");
    }


    @Override
    public String getPaymentMethod() {

        // "Credit Card" 문자열 반환

        System.out.println("Credit Card");

        return "Credit Card";
    }

       // "Credit Card" 문자열 반환 = return "Credit Card";
}



 

 

6





package entety;

public class KakaoPayPayment implements PaymentProcessor {
    private String phoneNumber;


    // 생성자

    public KakaoPayPayment() {
    }

        // phoneNumber를 초기화하세요.

    public KakaoPayPayment(String phoneNumber) {
        this.phoneNumber = phoneNumber;
    }

    @Override
    public boolean processPayment(double amount) {
            // 1. "[phoneNumber]로 카카오페이 [amount]원 결제 시도" 메시지 출력

            System.out.println(phoneNumber + "로 카카오페이" + amount "원 결제 시도");

            // 2. true 를 리턴하시오.

            return true;
        }


    @Override
    public void refund(double amount) {
        // "[phoneNumber]로 카카오페이 [amount]원 환불 처리" 메시지 출력
        System.out.println( phoneNumber + "로 카카오페이" + amount + "원 환불 처리");
    }

    @Override
    public String getPaymentMethod() {

        // "KakaoPay" 문자열 반환

        System.out.println ("KakaoPay");

        return "KakaoPay";
    }
}



7

 





import entety.CreditCardPayment;
import entety.KakaoPayPayment;

public class Main {
    public static void main(String[] args) {
        // CreditCardPayment 객체 생성 (카드 번호: "1234-5678-9012-3456", 소유자 이름: "홍길동")

        CreditCardPayment c1 = new CreditCardPayment("1234-5678-9012-3456","홍길동");

        // KakaoPayPayment 객체 생성 (전화번호: "010-1234-5678")

        KakaoPayPayment k1 = new KakaoPayPayment("010-1234-567");

        // 결제 프로세서 배열 생성 및 위에서 만든 객체들로 초기화
        // 각 결제 방식에 대해 반복:
        //   1. 결제 방식 이름 출력 (getPaymentMethod() 사용)
        c1.getPaymentMethod();

        //   2. 50000원 결제 시도 및 결과 출력

        c1.processPayment(50000);

        //   3. 30000원 환불 처리

        c1.refund(30000);

        //   4. 빈 줄 출력

        System.out.println();

    }
}



8

 

 

2) 예시

11

 




package entety;

public class Product {
    protected String name;
    protected double price;


    // 디폴트 생성자

    public Product() {
    }

        // 생성자: 상품 이름과 가격 초기화
        // TODO: name과 price를 초기화하세요.

    public Product(String name, double price) {
        this.name = name;
        this.price = price;
    }  


      // 상품 정보 출력 메서드
       // TODO: 상품명과 가격을 출력하세요.

    public void displayInfo() {
        System.out.println("상품명 : " + name);
        System.out.println("가격 : " + price + "원");
    }

}



12




package entety;

public class DigitalProduct extends Product implements Payable {

    private String downloadLink;


//  DigitalProduct 클래스가  extends Product 와 mplements Payable 를 둘다 상속합니다.


    // 디폴트 생성자


    public DigitalProduct() {
    }

        // TODO: 부모 클래스의 생성자를 호출하고, downloadLink를 초기화하세요.

    public DigitalProduct(String name, double price, String downloadLink) {
        super(name, price);
        this.downloadLink = downloadLink;
    }

    // 상품 정보 출력 메서드 오버라이드
        // TODO: 부모 클래스의 displayInfo 메서드를 호출하고, 추가로 다운로드 링크 정보를 출력하세요.

    @Override
    public void displayInfo() {
        super.displayInfo();
        System.out.println("다운로드 링크 : " downloadLink);
    }

    // Payable 인터페이스의 getPrice 메서드 구현
        // TODO: 상품 가격을 반환하세요.

    @Override
     public void getPrice() {
      System.out.println("가격 : " + price + "원");
        return price;
    }

      // 가격을 반환요청 사항이기때문에        return price;   로 작성해줍니다. 



        // TODO: 결제 완료 메시지와 다운로드 링크 전송 메시지를 출력하세요.

    @Override
    public void processPayment() {
        System.out.println("결재가 완료되었습니다. " + "다운로드 하세요 : " + downloadLink);
        }
    }




13

 




package entety;

public interface Payable {

    // 상품 가격 반환 메서드

    double getPrice();

    // 결제 처리 메서드

    void processPayment();

}



9

 




import entety.DigitalProduct;

public class Main {
    public static void main(String[] args) {

      // DigitalProduct 객체 생성

       DigitalProduct ebook = new DigitalProduct("자바 프로그래밍 기초"29900"http://example.com/download/java_ebook");

        // TODO: ebook 객체의 displayInfo 메서드를 호출하세요.

         ebook.displayInfo();

          // TODO: ebook 객체의 getPrice 메서드를 호출하여 가격을 출력하세요.

        ebook.getPrice();

         // TODO: ebook 객체의 processPayment 메서드를 호출하세요.

        ebook.processPayment();

    }
}



10

 

 

 

728x90
반응형

'JAVA > 이론' 카테고리의 다른 글

35. [ JAVA ] 배열 : ArrayList  (0) 2024.12.17
34. [ JAVA ] 문자열 생성하는 방법  (1) 2024.12.17
31. [ JAVA ] 상속 : 추상클래스(abstract class)  (0) 2024.12.16
30. [ JAVA ] 상속 : 직속  (0) 2024.12.16
29. [ JAVA ] 상속 : extends  (0) 2024.12.16
home
}