35일차 java 연산(2023-02-10)

권단비·2023년 2월 10일
0

IT

목록 보기
66/139
・immutable 원형 보존의 법칙
・다형성 : 부모=자식
・오버라이딩은 자식꺼
・instanceof 해당 객체가 해당 클래스를 가지고 있느냐 묻는것
・if(객체 instanceof 클래스 이름)
・interface : 자손이 구현하라(without default 1.7)
・interface = 공통 = 규약 = 강제 = 표준 = 드라이버 = 외주

[Eclipse 연습]

[계산]
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메서드를 완성하시오.
  1. 메서드명 : buy
    기 능 : 지정된 물건을 구입한다. 가진 돈(money)에서 물건의 가격을 빼고,
    장바구니(cart)에 담는다.
    만일 가진 돈이 물건의 가격보다 적다면 바로 종료한다.
    반환타입 : 없음
    매개변수 : Product p - 구입할 물건
  1. 메서드명 : add
    기 능 : 지정된 물건을 장바구니에 담는다.
    만일 장바구니에 담을 공간이 없으면, 장바구니의 크기를 2배로 늘린 다음에 담는다.
    반환타입 : 없음
    매개변수 : Product p - 구입할 물건
  1. 메서드명 : 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

0개의 댓글