추상 메소드 : 메소드 본체가 없는 메소드
-> 목적 : 자식에게 강제로 오버라이딩 하기 위한 것임. 코드의 독립성, 일관성을 유지하기 위해 사용
추상클래스 - 객체생성불가
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가지
-
자신이구현했을때 : 코드의 독립성과 일관성을 위해서
-
자바API가 구현해줬을때 : 해당기술구현방법
***면접 : 인터페이스와 추상클래스의 공통점과 차이점
공통점 : 둘다 추상메소드를 가짐. 코드의 독립성과 일관성을 유지할 수 있음.
차이점 : 사용하는 방법이 다르고,
인터페이스 : abstract생략가능,
추상클래스 : 일반메소드도 있을수 있고 추상메소드도 있을 수 있어 반드시 abstract써줘야 함.

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

->AppCDInfo는 CDInfo와 Lendable 둘다로 형변환 가능
-인터페이스의 장점
-
개발시간을 단축시킬 수 있다
-
표준화가 가능하다(일관성)
-
서로 관계없는 클래스들에게 관계를 맺어 줄 수 있다.
-
독립적인 프로그래밍이 가능하다.
다형성 -> 형변환이 가능하다.
인터페이스의 상속 -> 잘안쓰임
인터페이스의 다중 상속 가능 (부모 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;
}
}
}
}