33일차 - 2023.2.10

문우림·2023년 2월 11일
0

Java

목록 보기
17/23

1. 인터페이스

Printer Driver(interface)예제

  • 인터페이스는 기능을 표준화 시키는 것, 공통으로 사용한다는 뜻.
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 클래스에서 자세한 내용을 각각 구현.

2. 추상 클래스

  • 클래스는 설계도, 추상 클래스는 미완성 설계도

  • 키워드 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());
	}

3. 인터페이스와 추상 클래스 차이

상속 : 재사용 + 확장

객체지향에서의 상속은 부모 클래스의 특성을 자식 클래스에서 상속하고 거기에 더해 필요한 특성을 추가, 확장해서 사용할 수 있다.

  • 부모 클래스로 갈 수록 추상화 되어있고, 자식 클래스로 갈 수록 구체화 돠어있다.
  • 인터페이스는 클래스가 무엇을 할 수 있다라고 하는 기능을 구현하도록 강제하는 특징을 가지고 있다.

인터페이스는 정의된 메소그를 각 클래스의 목적에 맞게 구현
인터페이스 -> implements로 상속

추상 클래스(부모)는 자신의 기능들을 자식 클래스로 확장 시킴
추상 클래스 -> extends로 상속(일반 클래스와 비슷)

4. 추상 클래스를 사용한 예제

계산기

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

}
  • char c = sc.next().chatAt(0); 는 Strng형으로 받은 값을 char형으로 반환해서 출력.

0개의 댓글