본문 바로가기

Java

[Java] 객체지향(5) 추상클래스와 인터페이스

 

추상클래스(abstract)

  • 추상클래스는 인스턴스화(객체생성)를 금지하는 클래스이다. 코드의 독립성과 일관성을 유지하는 것이 목적이다.
  • abstract 키워드를 사용하여 추상클래스를 정의한다.
  • 추상메서드는 내용이 없는 메서드이며 적어도 하나의 추상메서드를 가지고 있다면 추상클래스이다.
  • 추상메서드의 목적은 하위클래스에게 강제로 오버라이딩하게 하여 구현하도록 한다.

API 메서드들 중 하나인 FileInputStream은 InputStream을 상속한다. FileInputStream은 파일을 읽어오기 위해 read라는 메서드가 필요하고 InputStream에 read라는 추상메서드를 작성하여 FileInputStream이 구현하게 하도록 하였다.

 

인터페이스(interface)

  • 인터페이스는 implements 키워드를 사용하여 구현하게 하도록한다.
  • 인터페이스를 implements하면 오버라이딩을 반드시 수행해야만 한다.
  • 상속과 달리 여러 개의 인터페이스를 구현할 수 있다.
  • 인터페이스로도 형변환이 가능하고 리턴타입, 매개변수 값으로도 사용될 수 있다.
  • 인터페이스는 상속이 되고 다중상속이 가능하다. 자주 사용되지는 않는다.

 

인터페이스를 자신(개발자)이 구현 : 독립성과 일관성이 목적 (독립성 - 다형성, 일관성 - 추상메서드)

인터페이스 API 구현 : 해당 기술을 구현하는 방법, 원하는 기술을 구현하는 방법 제시 (가이드 역할)

ex) Thread -> Runnable 인터페이스 구현, run()을 오버라이딩하면 멀티스레드를 구현

 

 

  • 예시 코드

물품구매 프로그램 구현

Prodect.java (interface)

public interface Product {

   public int getPrice();
    public double getDc();
    public void show();
  }

Phone.java

public class Phone implements Product {
    private String name;
    private int price;
    private double dc;

    public Phone(){}


    public Phone(String name, int price, double dc) {
        super();
        this.name = name;
        this.price = price;
        this.dc = dc;
    }


    @Override
    public int getPrice() {        
        return price;
    }

    @Override
    public double getDc() {
        return dc;        
    }

    @Override
    public void show() {
        System.out.println("제품명 : " + name);
        System.out.println("가격 : " + price);
        System.out.println("DC 가격 : " + (dc*100)+"%");        
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setDc(double dc) {
        this.dc = dc;
    }

    public void setPrice(int price) {
        this.price = price;
    }
  }

NoteBook.java

public class NoteBook implements Product {
    private String name;
    private int price;
    private double dc;

    public NoteBook() {}    

    public NoteBook(String name, int price, double dc) {
        super();
        this.name = name;
        this.price = price;
        this.dc = dc;
    }


    @Override
    public int getPrice() {        
        return price;
    }

    @Override
    public double getDc() {
        return dc;

    }

    @Override
    public void show() {
        System.out.println("제품명 : " + name);
        System.out.println("가격 : " + price);
        System.out.println("DC 가격 : " + (dc*100)+"%");

    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }


    public void setDc(double dc) {
        this.dc = dc;
    }

    public void setPrice(int price) {
        this.price = price;
    }
}

Cart.java

    public class Cart {
    private Product[] pArr;
    private int total;
    int count = 0;


    public Cart(){
        pArr = new Product[100];
    }

    public void addCart(Product p){
        pArr[count++] = p;
    }

    public void orderList(){
        for(int i=0;i<count;i++){
            pArr[i].show();
            System.out.println();
        }

        System.out.println("총 주문금액: " + getTotal());
    }

    public int getTotal(){
        for(int i=0;i<count;i++){
            total += pArr[i].getPrice() * (1 - pArr[i].getDc());
        }

        return total;
    }
}

Main.java

public class Main {
    public static void showProduct(Product[] arr) {
        for (int i = 0; i < arr.length; i++) {
            System.out.println(i + "번째 상품");
            arr[i].show();
            System.out.println();
        }
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        Cart cart = new Cart();

        Product arr[] = { new Phone("갤럭시S7", 500000, 0.1), new Phone("갤럭시S8", 900000, 0.15),
                new NoteBook("삼성노트북", 1200000, 0.20) };

        while (true) {
            System.out.println("1.제품구매 2.주문목록  3.종료");
            System.out.print("선택: ");
            String menu = sc.nextLine();
            switch (menu) {
            case "1":
                showProduct(arr);
                System.out.print("입력: ");
                int idx = Integer.parseInt(sc.nextLine());
                cart.addCart(arr[idx]);
                break;
            case "2":
                cart.orderList();
                break;

            }
        }

    }
  }