・immutable 원형 보존의 법칙
・다형성 : 부모=자식
・오버라이딩은 자식꺼
・instanceof 해당 객체가 해당 클래스를 가지고 있느냐 묻는것
・if(객체 instanceof 클래스 이름)
・interface : 자손이 구현하라(without default 1.7)
・interface = 공통 = 규약 = 강제 = 표준 = 드라이버 = 외주
[계산] interface Printable1 { public abstract void print(String doc); } class Printer1 implements Printable1 { @Override public void print(String doc) { System.out.println(doc); } } public class Test50 { public static void main(String[] args) { Printable1 prn = new Printer1(); prn.print("Hello Java"); // 결과 : Hello Java } }
[결과값] Hello Java
[계산] interface ICalculator2 { public abstract int add(int num, int num2); public abstract int sub(int num, int num2); public abstract int mul(int num, int num2); int div(int num, int num2); } class MyCalculator2 implements ICalculator2 { public int add(int num, int num2) { return num + num2; } public int sub(int num, int num2) { return num - num2; } public int mul(int num, int num2) { return num * num2; } public int div(int num, int num2) { return num / num2; } } public class Test50 { public static void main(String[] args) { ICalculator2 calculator = new MyCalculator2(); System.out.println(calculator.add(10, 20)); // 30 System.out.println(calculator.sub(10, 20)); // -10 } }
[결과값] 30 -10
디바이스 드라이버 : 컴퓨터에서 하드웨어 장치를 운영 체제에 연결하기 위해 필요한 소프트웨어
인터페이스에 상수도 선언된다
public static final int PAPER_WIDTH = 70;
public static final int PAPER_HEIGHT = 120;
public void print(String doc)
[계산] //[안 좋은 예] //각 회사마다 프린터 클래스 및 생성자를 생성해야 함.(번거로움) //삼성 프린트 드라이버(삼성 개발자가 짜 줌) class SamsungPrint { void samsungPrint(String str) { System.out.println("삼성 프린터에 출력: " + str); } } //LG 프린트 드라이버(LG 개발자가 짜 줌) class LGPrint { void LGPrint(String str) { System.out.println("LG 프린터에 출력: " + str); } } public class PrintProgram { public static void main(String[] args) { SamsungPrint sprint = new SamsungPrint(); sprint.samsungPrint("어제보다 나은 나"); LGPrint lprint = new LGPrint(); lprint.LGPrint("어제보다 나은 나"); } }
[결과값] 삼성 프린터에 출력: 어제보다 나은 나 LG 프린터에 출력: 어제보다 나은 나
[계산] interface Printable1 { // MS가 정의하고 제공한 인터페이스 public void print(String doc); } class SPrinterDriver implements Printable1 { @Override public void print(String doc) { System.out.println("From Samsun printer"); System.out.println(doc); } } class LPrinterDriver implements Printable1 { @Override public void print(String doc) { System.out.println("From LG printer"); System.out.println(doc); } } public class PrinterDriver { public static void main(String[] args) { String myDoc = "This is a report about..."; //삼성 프린터로 출력 Printable1 prn = new SPrinterDriver(); prn.print(myDoc); System.out.println(); //LG 프린터로 출력 prn = new LPrinterDriver(); prn.print(myDoc); } }
[결과값] From Samsun printer This is a report about... From LG printer This is a report about...
상속을 통해서 자손 클래스에서 완성하도록 유도하는 클래스(미완성)
하나 이상의 추상 메소드를 지니는 클래스를 가리켜 추상 클래스라 한다.
추상 클래스를 대상으로는 인스턴스 생성이 불가능하다. 물론 참조변수 선언은 가능하다.
1.일반클래스 : 일반 클래스에서 extends 사용 시 재사용의 의미가 더 크다.
but 두 가지 클래스를 동시에 상속할 수는 없고,
함수를 추상 클래스로 만들지 못한다. → 더미 메소드를 구현해야 해서 그만큼 메모리를 많이 잡아먹는다.
class Printable{
public void print(String doc) {
System.out.println("더미"); // 더미를 구현해야 함.
}
}
2.인터페이스 : 규약, 표준, 공통의 개념
3.추상 클래스 : 자기 자신 데이터를 가져야 할 때 추상 클래스를 사용한다.
인터페이스가 일반클래스보다 좋다.
인터페이스가 추상 클래스보다 좋다.
・인터페이스 > 일반클래스 || 인터페이스 > 추상클래스
[계산] //abstract는 무조건 자식이 구현해줘야 함. abstract class Calc { private int a, b; public int add() { return a + b; } public abstract int sub(); // 추상 메소드 사용 시 class도 추상 클래스로 만들어줘야 한다. } class MyCalc extends Calc { @Override public int sub() { return 0; } } public class Abstract { public static void main(String[] args) { // Calc calc = new Calc(); // 추상 클래스라 객체 생성이 안 됨. Calc calc = new MyCalc(); } }
[계산] import java.util.Scanner; abstract class Calc1 { protected int a; protected int b; public void setValue(int a, int b) { this.a = a; this.b = b; } abstract int calculate(); } class Add extends Calc1 { @Override public int calculate() { return a + b; } } class Sub extends Calc1 { @Override public int calculate() { return a - b; } } class Mul extends Calc1 { @Override public int calculate() { return a * b; } } class Div extends Calc1 { @Override public int calculate() { return a / b; } } public class Test50 { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int result = 0; System.out.print("두 정수와 연산자를 입력하시오 >> "); int a = sc.nextInt(); int b = sc.nextInt(); char c = sc.next().charAt(0); Calc1 cal; switch (c) { case '+': cal = new Add(); break; case '-': cal = new Sub(); break; case '*': cal = new Mul(); break; case '/': cal = new Div(); break; default: System.out.println("잘못된 연산자 입니다."); sc.close(); return; } cal.setValue(a, b); result = cal.calculate(); System.out.println(result); sc.close(); } }
Q19. 다음은 물건을 구입하는 사람을 정의한 Buyer클래스이다.
이 클래스는 멤버변수로 돈(money)과 장바구니(cart)를 가지고 있다.
제품을 구입하는 기능의 buy메서드와 장바구니에 구입한 물건을 추가하는 add메서드,
구입한 물건의 목록과 사용금액, 그리고 남은 금액을 출력하는 summary메서드를 완성하시오.
[결과값] class Buyer { int money = 1000; Product[] cart = new Product[3]; // 구입한 제품을 저장하기 위한 배열 int i = 0; // Product배열 cart에 사용될 index
void buy(Product p) {
if (money < p.price) {
System.out.println("살 수 없습니다.");
} else if (money >= p.price) {
money -= p.price;
this.add(p);
}
}
void add(Product p) {
if (i >= cart.length) {
Product[] temp = this.cart;
this.cart = new Product[i * 2];
for (int j = 0; j < temp.length; j++) {
this.cart[j] = temp[j];
}
} else {
this.cart[i] = p;
}
i++;
}
void summary() {
for (int i = 0; i < cart.length; i++) {
System.out.println(cart[i]);
System.out.println(money);
}
}
}
class Product {
int price; // 제품의 가격
Product(int price) {
this.price = price;
}
}
class TVb extends Product {
TVb() {
super(100);
}
public String toString() {
return "TVb";
}
}
class Computer extends Product {
Computer() {
super(200);
}
public String toString() {
return "Computer";
}
}
class Audio extends Product {
Audio() {
super(50);
}
public String toString() {
return "Audio";
}
}
public class Test51 {
public static void main(String[] args) {
Buyer b = new Buyer();
b.buy(new TVb());
b.buy(new Computer());
b.buy(new TVb());
b.buy(new Audio());
b.buy(new Computer());
b.buy(new Computer());
b.buy(new Computer());
b.summary();
}
}
//잔액이 부족하여 을 를 살수 없습니다 Computer / .
//구입한 물건:Tv,Computer,Tv,Audio,Computer,Computer,
//사용한 금액:850
//남은 금액:150
>>```
[결과값]
살 수 없습니다.
TVb
150
Computer
150
TVb
150
null
150
Computer
150
Computer
150