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);
}
}
public class Printer_Driver {
public static void main(String[] args) {
String myDoc = "This is a report ";
Printable prn = new SPrinterDriver();
prn.print(myDoc);
System.out.println();
prn = new LPrinterDriver();
prn.print(myDoc);
}
}
프린트 하라
라는 공통된 기능을 인터페이스로 선언, SPrinterDriver/LPrinterDriver 클래스에서 자세한 내용을 각각 구현.클래스는 설계도, 추상 클래스는 미완성 설계도
키워드 abstract만 붙여주면 된다.(추상 메소드가 하나라도 있을 경우)
안스턴스, 즉 객체를 만들 수 없는 클래스
추상 메소드는 자식 클래스에서 메소드의 구현을 강제해야 한다.
상속하는 클래스는 IS-A관계여야 한다.
abstract class Calc {//class앞에 abstract를 붙여주면 일반 클래스에도 추상 메소드를 선언할 수 있다.
private int a, b;
public int add() {
return a + b;
}
public abstract int sub(); //추상 메소드
}
class MyCalc extends Calc{//추상 메소드의 구현은 반드시 자식 클래스에서 해줘야된다.
private int a, b;
public MyCalc(int a, int b) {
this.a =a;
this.b =b;
}
@Override
public int sub() {
return a - b;
}
}
public static void main(String[] args) {
Calc calc = new MyCalc(5, 2);
System.out.println(calc.sub());
}
객체지향에서의 상속은 부모 클래스의 특성을 자식 클래스에서 상속하고 거기에 더해 필요한 특성을 추가, 확장해서 사용할 수 있다.
인터페이스는 정의된 메소그를 각 클래스의 목적에 맞게 구현
인터페이스 -> implements로 상속
추상 클래스(부모)는 자신의 기능들을 자식 클래스로 확장 시킴
추상 클래스 -> extends로 상속(일반 클래스와 비슷)
계산기
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();
}
}