728x90

추상 메소드 : 메소드 본체가 없는 메소드 

    -> 목적 : 자식에게 강제로 오버라이딩 하기 위한 것임. 코드의 독립성, 일관성을 유지하기 위해 사용

추상클래스 - 객체생성불가

 

InputStream -> FileInputStream - 상속의 대표적인 예

read()메소드를 반드시 오버라이딩 해야함. ->가문의 특징을 유지할 수 있음.

DB ->MYSQL로 바꿔라 할 때 추상메소드로 모든 클래스를 read()메소드를 가진 추상클래스를 사용하게 하면 코드를 하나도 안바꿔도 됨.

추상클래스 & 인터페이스

service 추상클래스와 인터페이스 만들기 -> 크게보면 한줄쓰는 것이 나중에 필요하게 됨. -> 그런 안목이 필요함

 

추상클래스에 있는 추상 메소드에 메소드 본체가 없는 이유 : 추상메소드는 오버라이딩하기 위한 목적, 그래서 본체가 없음.

앞에 abstract를 붙여줌★★

 

abstract class MessageSender{}

MessageSender arr[] {  emailsender

                                        smssender

}

for()

arr[],sendMessage (sendMessage메소드를 클래스가 다 가지고 있어야 예외오류가 안뜸 -> 안정성 굿)

 

부모의 데이터타입으로 형변환함.

위의 두개는 같은 코드 - 아래는 메소드로 넘겨준것.

 

--Kosta.oop3

Role (Abstract클래스) -doIt()

Work : Role을 상속받음 & doIt 메소드 자동으로 오버라이딩 됨.

Drive : Role을 상속받음 & doIt 메소드 자동으로 오버라이딩 됨.

Person(name, role) : role 객체 생성, role 메소드 생성

Main : 

 

--Exercise1

Function : doIt()

OracleDeo : insert()

MySQLDeo : insert()

Service(변하지 않고도 사용하고 싶다.)  : name, function

 

***인터페이스 : 일종의 추상클래스, 다중상속가능

자바 - 다중상속지원x

인터페이스 구현 2가지

  1. 자신이구현했을때 : 코드의 독립성 일관성을 위해서

  2. 자바API가 구현해줬을때 : 해당기술구현방법

 

***면접 : 인터페이스와 추상클래스의 공통점과 차이점

공통점 : 둘다 추상메소드를 가짐. 코드의 독립성과 일관성을 유지할 수 있음.

차이점 : 사용하는 방법이 다르고, 

          인터페이스 : abstract생략가능

          추상클래스 : 일반메소드도 있을수 있고 추상메소드도 있을 수 있어 반드시 abstract써줘야 함.

보통의 인터페이스 : 일종의 추상클래스로, 추상메소드로 오버라이딩하기 위함.

시리얼라이져블 인터페이스만 추상메소드랑 연관이 없음: 추상메소드로 오버라이딩하기 위함이 아님.

->AppCDInfo는 CDInfo와 Lendable 둘다로 형변환 가능

 

-인터페이스의 장점

  1. 개발시간을 단축시킬 수 있다

  2. 표준화가 가능하다(일관성)

  3. 서로 관계없는 클래스들에게 관계를 맺어 줄 수 있다.

  4. 독립적인 프로그래밍이 가능하다.

 

다형성 -> 형변환이 가능하다.

인터페이스의 상속 -> 잘안쓰임

인터페이스의 다중 상속 가능 (부모 2명 가능)

-interface Changeable extends Resizable, Colorable{}

인터페이스로 다형성 표현 가능 - 형변환 가능 -호출하는 메소드 제약생김(오버라이딩 된 메소드만 사용가능) ->독립성

인터페이스 구현 , 추상메소드 : 오버라이딩=> 연관성

 

run추상클래스도 있는데 자바의 다중상속이 안되서 Runnable인터페이스를 사용

 

여러가지를 동시에 처리하고 싶다. Runnable을 인터페이스 구현해서 그 안에 있는 run메소드를 오버라이딩해서 멀티스레드를 구현해라.

 

public class MyThread implements Runnable {//2가지의 일을 동시에 시작하고픔

        @Override

        public void run() { //runnable의 추상메소드

                // TODO Auto-generated method stub

                for(int i=1;i<11;i++) {

                        try {

                                Thread.sleep(1000);

                        } catch (Exception e) {

                                e.printStackTrace();

                        }

                        System.out.println();

                }

        }

        public static void main(String[] args) {

                MyThread thread = new MyThread();

                Thread t = new Thread(thread);

                t.start();

                

                for(int i=11;i<21;i++) {

                        try {

                                Thread.sleep(1000);

                        } catch (Exception e) {

                                e.printStackTrace();

                        }

                        System.out.println();

                }

        }

}

 

내가 Frame이 되고 싶다. -> Frame을 상속받기. ->그 안에 있는 메소드를 사용하면 하고싶었던 것이 구현된단다.^^

 

---과제 : 자바의 다형성을 표현할 수 있나

Speakable (인터페이스)

public interface Speakable {

        public String speak();

        

}

Man

public class Man {

        private String name;

        

        public Man(String name) {

                super();

                this.name = name;

        }

        public String getName() {

                return name;

        }

        public void setName(String name) {

                this.name = name;

        }

}

Reader

public class Reader extends Man implements Speakable {

        

        public Reader(String name) {

                super(name);

        }

        

        public String speak() {

                return getName() + "자바화이팅";

        }

}

Work

public class Work extends Man implements Speakable {

        

        public Work(String name) {

                super(name);

        }

        

        public String speak() {

                return getName() + "열심히 일해야 한다.";

        }

}

Student

public class Student extends Man {

        public Student(String name) {

                super(name);

        }

        

        public String speak() {

                return getName()+"공부나 열심히해";

        }

}

Main

public class Main {

        public static void main(String[] args) {

                Object obj[] = {

                                new Reader("둘리"),

                                new Work("길동"),

                new Student("마이콜")

                };

                

                for(int i=0;i<obj.length;i++) {//obj에서 바로 speak메소드  호출불가(obj[i].speak불가)

                        if(obj[i] instanceof Speakable) {

                                Speakable speaker = (Speakable) obj[i];

                                System.out.println(speaker.speak());

                        }

                }

        }

}

둘리 자바화이팅

길동 열심히 일해야 한다.

 

**물품구매 프로그램

 

물품구매 프로그램 구현

 

Product (인터페이스)

- getPrice() : int   => 상품가격(정가) 구하기

- getDc() : double => 가격할인률 구하기

- show() : void => 상품내역 출력하기 //오버라이딩 되어야함.

 

Phone (product상속)

- name, price, dc

 

NoteBook (product상속)

- name, price, dc

 

Cart

- pArr : Product[]

- total : int

- count : int

 

- addCart(Product p) : void => 상품 카트 추가

- orderList() : void =>상품목록 출력 : 총 주문가격(할인된 가격) 포함

 

Main

  Product arr[] = {new Phone(name, price, dc),

                  new NoteBook(name, price, dc)}

 

  1. 제품구매, 2.구매목록 3.종료

>입력 : 1

등록된 제품(배열에 있는 제품) 출력(제품이 4개라고 가정하고)

> 입력 : 3(3번째 제품 선택)

   => Cart에 해당 제품 등록

 

-Product

public interface Product {

    public int getPrice();

    public double getDc();

    public void show();

}

-Phone

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 void show() {

        System.out.println("상품명: " + name);

        System.out.println("가격: " + price);

        System.out.println("할인율: " + (dc*100)+"%");    

    }

    @Override

    public int getPrice() {

        return price;

    }

    @Override

    public double getDc() {

        return dc;

    }

    public String getName() {

        return name;

    }

    public void setName(String name) {

        this.name = name;

    }

    public void setPrice(int price) {

        this.price = price;

    }

    public void setDc(double dc) {

        this.dc = dc;

    }

}

-NoteBook

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*100)+"%");        

    }

    public String getName() {

        return name;

    }

    public void setName(String name) {

        this.name = name;

    }

    public void setPrice(int price) {

        this.price = price;

    }

    public void setDc(double dc) {

        this.dc = dc;

    }

}

-Cart

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

import java.util.Scanner;

 

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;

            }

        }

    }

}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

728x90

+ Recent posts