Day 33 (23.02.10)

Jane·2023년 2월 10일
0

IT 수업 정리

목록 보기
35/124

1. 드라이버 프로그램

1-1. 옛날의 드라이버 프로그램의 구성

  • 제조사 별로 각각의 클래스가 있었다.
// 삼성 프린트 드라이버 (삼성 개발자의 코드)
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("Hello World");
		
		LGPrint lprint = new LGPrint();
		lprint.lgPrint("Hello World");
		
	}

}

[Console]
삼성 프린터에 출력 : Hello World
LG 프린터에 출력 : Hello World

1-2. 인터페이스를 적용한 프린트 드라이버 프로그램의 구성

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

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

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

public class PrintProgram {

	public static void main(String[] args) {
		String myDocument = "Hello World";

		Printable prn = new SamsungPrintDriver();
		prn.print(myDocument);
		System.out.println();
		prn = new LGPrintDriver();
		prn.print(myDocument);

	}

}

[Console]
From Samsung Printer
Hello World


From LG Printer
Hello World

  • 드라이브를 설치하는 것 = program.class를 OS에 넣어준다 (코드를 보여주는 것 X)

2. 인터페이스의 특징

  • 인터페이스에는 상수(final)를 선언할 수 있다.
interface Printable {
	public static final int PAPER_WIDTH = 70;
	public static final int PAPER_HEIGHT = 120;
	public void print(String doc);
}
  • 인터페이스도 extends를 이용하여 상속을 받을 수 있다.

  • instanceof 연산자도 사용 가능하다.

3. 추상 클래스

  • 하나 이상의 추상 함수(구현하는 내용이 없는 함수)가 들어가 있는 클래스
    (클래스 안에 추상함수가 있으면, 클래스에도 추상 클래스라는 것을 알려줘야 한다)
abstract class Calc {
	private int a, b;

	public int add() {
		return a + b;
	}
	
	public abstract int sub();
}
  • 추상 클래스에서는 객체 생성 X > 자식 클래스를 상속받아서 객체를 생성한다.
abstract class Calc {
	protected int a, b;

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

	public abstract int sub();
}

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

class JavaTest {

	public static void main(String[] args) {
		Calc c = new MyCalc();
	}
}

4. 일반 클래스 / 인터페이스 / 추상 클래스 비교

  • 부모-자식 간의 오버라이딩을 사용할 때는 일반 클래스보다 인터페이스를 사용한다.
    (일반 클래스의 함수에는 무언가의 dummy 내용이 들어가 있다.)
  • 추상 클래스는 변수가 있어야 할 때 쓴다.
    (인터페이스는 변수를 사용할 수 없기 때문이다.)

5. 추상 클래스를 사용한 계산기

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
	int calculate() {
		return a + b;
	}

}

class Sub extends Calc {

	@Override
	int calculate() {
		return a - b;
	}

}

class Mul extends Calc {

	@Override
	int calculate() {
		return a * b;
	}

}

class Div extends Calc {

	@Override
	int calculate() {
		return a / b;
	}

}

class JavaTest {

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

}
profile
velog, GitHub, Notion 등에 작업물을 정리하고 있습니다.

0개의 댓글