33일 차 - 추상클래스(Abstract), 인터페이스(Interface), 드라이버(Driver) (23.02.10)

yvonne·2023년 2월 10일
0

📂Java

목록 보기
33/51
post-thumbnail

1. 아래를 프로그래밍 하시오.

  • 철수 학생은 다음 3개의 필드와 메소드를 가진
    4개의 클래스 Add, Sub, Mul, Div를 작성하려고 한다
  • int 타입의 a, b 필드: 2개의 피연산자
  • void setValue(int a, int b): 피연산자 값을 객체 내에 저장한다.
  • int calculate(): 클래스의 목적에 맞는 연산을 실행하고 결과를 리턴한다.
  • 곰곰 생각해보니, Add, Sub, Mul, Div 클래스에 공통된 필드와 메소드가 존재하므로 새로운 추상 클래스 Calc를 작성하고 Calc를 상속받아 만들면 되겠다고 생각했다. 그리고 main() 메소드에서 다음 실행 사례와 같이 2개의 정수와 연산자를 입력받은 후, Add, Sub, Mul, Div 중에서 이 연산을 처리할 수 있는 객체를 생성하고 setValue() 와 calculate()를 호출하여 그 결과 값을 화면에 출력하면 된다고 생각하였다. 철수처럼 프로그램을 작성하라.

  • 출력결과:
    두 정수와 연산자를 입력하시오 >> 5 7 +
    12

package drivertest;

import java.util.Scanner;

abstract class Calc {
	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 Calc {
	@Override
	public int calculate() {
		return a + b;
	}
}

class Sub extends Calc {
	@Override
	public int calculate() {
		return a - b;
	}
}

class Mul extends Calc {
	@Override
	public int calculate() {
		return a * b;
	}
}

class Div extends Calc {
	@Override
	public int calculate() {
		return a / b;
	}
}

public class abstractTest {

	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);
		Calc 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();

	}

}
  • 출력결과





2. 아래를 프로그래밍 하시오.

  • 겜블링 게임에 참여할 선수 숫자>>3
    1번째 선수 이름>>영희
    2번째 선수 이름>>철수
    3번째 선수 이름>>길동

[영희]:
3 3 2 아쉽군요!
[철수]:
3 3 2 아쉽군요!
[길동]:
1 1 1 길동님이 이겼습니다!
Process finished with exit code 0


package drivertest;

import java.util.Scanner;

public class abstractTest2 {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);

		System.out.print("겜블링 게임에 참여할 선수 숫자 (최대 3명 )>>");
		int pNum = sc.nextInt();
		String[] players = new String[pNum];
		for (int i = 1; i < pNum + 1 && i < 4; i++) {
			System.out.print(i + "번째 선수 이름>>");
			players[i - 1] = sc.next();
		}
		boolean isWon = false;
		while (true) {
			for (int i = 0; i < pNum; i++) {
				if (play(players[i])) {
					isWon = true;
					break;
				}
			}
			if (isWon) {
				break;
			}
		}
	}

	static boolean play(String player) {
		System.out.println(player + "님! Enter 입력하여 게임 진행>>");
		try {
			System.in.read();
			System.in.read();
		} catch (Exception e) {
		}
		int[] result = getNum();
		System.out.println(result[0] + " " + result[1] + " " + result[2] + "\n");
		if (result[0] == result[1] && result[0] == result[2]) {
			System.out.println(player + "님 승!");
			return true;
		} else {
			return false;
		}
	}

	static int[] getNum() {
		int[] getNum = new int[3];
		{
			for (int i = 0; i < getNum.length; i++) {
				int num = (int) (Math.random() * 3) + 1;
				getNum[i] = num;
			}
			return getNum;
		}
	}
}





3. 아래의 결과물이 나오도록 짜시오.

interface Printable {
    public void print(String doc);
}

class PrinterDriver {
    public static void main(String[] args) {
        String myDoc = "This is a report about...";
    
        // 삼성 프린터로 출력
        Printable prn = new SPrinterDriver();
        prn.print(myDoc);

        System.out.println();

        // LG 프린터로 출력
        prn = new LPrinterDriver();
        prn.print(myDoc);
    }
}

//결과
From Samsung printer
This is a report about...

From LG printer
This is a report about...

  package drivertest;

interface Printable {
	public void print(String doc);
}

class SPrinterDriver implements Printable {
	@Override
	public void print(String doc) {
		System.out.println("From Samsung printer");
		System.out.println(doc);
	}
}

class LPrinterDriver implements Printable {
	@Override
	public void print(String doc) {
		System.out.println("From LG printer");
		System.out.println(doc);
	}
}

abstract class Calc2 {
	private int a, b;

	public int add() {
		return a + b;
	}

	public abstract int sub(); // 자식이 구현해야함
}

class MyCalc extends Calc2 {
	@Override
	public int sub() {
		return 0;
	}
}

public class printProgram {

	public static void main(String[] args) {
		Calc2 calc = new MyCalc();

		String myDoc = "This is a report about...";

		Printable prn = new SPrinterDriver();
		prn.print(myDoc);
		System.out.println();

		prn = new LPrinterDriver();
		prn.print(myDoc);

	}

}
  • 출력결과

profile
개발 연습장

0개의 댓글