추상클래스(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;
}
}
}
}
'Java' 카테고리의 다른 글
[Java] java.lang패키지(2) String클래스, StringBuffer클래스 (0) | 2020.07.17 |
---|---|
[Java] java.lang패키지(1) Object 클래스, wrapper클래스 (0) | 2020.07.17 |
[Java] 객체지향(4) 다형성 정리 (0) | 2020.07.15 |
[Java] 객체지향(3) 상속 정리 (0) | 2020.07.15 |
[Java] 객체지향(2) 연습 정리 (0) | 2020.07.11 |