728x90
목차
1. 인터페이스
■ 인터페이스란?
- 추상 클래스의 개념과 동일
- 사용 방법을 제공한다고 생각하면 됨
- 자바에서 클래스는 단일 상속이지만 인터페이스는 다중 상속 가능
- 구성 요소는 모두 추상 메소드임
- 인터페이스는 멤버 변수를 가질 수 없지만 상수는 가질 수 있으며, 상수 생성 시 final 생략 가능
- default를 사용하면 일반 메소드를 사용 가능
2. 예시
■ Calculator
package j15_인터페이스;
// 인터페이스 내부는 모두 abstract 메소드임
// 멤버 변수는 가질 수 없지만 상수는 가질 수 있음
public interface Calculator {
// 인터페이스는 상수 생성 시 final 생략가능
public int ERROR = -9999999;
public double plus(double x, double y);
public double minus(double x, double y);
// default를 사용하면 일반 메소드를 사용가능
public default double multiplication(double x, double y) {
return x * y;
}
public double division(double x, double y);
}
■ Equipment
package j15_인터페이스;
public abstract class Equipment {
public abstract void powerOn();
public abstract void powerOff();
}
■ Computer
package j15_인터페이스;
public class Computer implements Calculator {
@Override
public double plus(double x, double y) {
System.out.println("컴퓨터에서 더하기 실행");
return x + y;
}
@Override
public double minus(double x, double y) {
System.out.println("컴퓨터에서 빼기 실행");
return x - y;
}
@Override
public double division(double x, double y) {
System.out.println("컴퓨터에서 나누기 실행");
if (x == 0 || y == 0) {
return ERROR;
}
return x / y;
}
}
■ GeneralCalculator
package j15_인터페이스;
public class GeneralCalculator extends Equipment implements Calculator {
@Override
public void powerOn() {
System.out.println("일반 계산기 전원을 켭니다.");
}
@Override
public void powerOff() {
System.out.println("일반 계산기 전원을 끕니다.");
}
@Override
public double plus(double x, double y) {
System.out.println("일반계산기에서 더하기 실행");
return x + y;
}
@Override
public double minus(double x, double y) {
System.out.println("일반계산기에서 빼기 실행");
return x - y;
}
@Override
public double division(double x, double y) {
System.out.println("일반계산기에서 나누기 실행");
if (x == 0 || y == 0) {
return ERROR;
}
return x / y;
}
}
■ SmartPhone
package j15_인터페이스;
public class SmartPhone extends Equipment implements Calculator {
@Override
public void powerOn() {
System.out.println("스마트폰 전원을 켭니다.");
}
@Override
public void powerOff() {
System.out.println("스마트폰 전원을 끕니다.");
}
@Override
public double plus(double x, double y) {
System.out.println("스마트폰에서 더하기 실행");
return x + y;
}
@Override
public double minus(double x, double y) {
System.out.println("스마트폰에서 빼기 실행");
return x - y;
}
@Override
public double division(double x, double y) {
System.out.println("스마트폰에서 나누기 실행");
if (x == 0 || y == 0) {
return ERROR;
}
return x / y;
}
}
■ Main
package j15_인터페이스;
public class Main {
public static void main(String[] args) {
Equipment[] equipments = new Equipment[2];
equipments[0] = new GeneralCalculator();
equipments[1] = new SmartPhone();
Calculator calculator = new Computer();
System.out.println("모든 장비 전원 켜기");
for (Equipment eq : equipments) {
eq.powerOn();
}
// a와 b는 같은 형 변환 과정
// a는 최종 형 변환 형태인 Calculator를 명시
// b는 SmartPhone으로 다운 캐스팅하여 명시하고 그 후Calculator로 업캐스팅함
// a.
// Equipment eq = equipments[1];
// Calculator c = (Calculator) eq;
// b.
// Equipment eq = equipments[1];
// SmartPhone ca = (SmartPhone) eq;
// Calculator c = ca;
System.out.println("모든 장비에서 10과 20을 더하기");
for (Equipment eq : equipments) {
// Equipment가 SmartPhone으로 다운캐스팅 후 Carculator로 업캐스팅하는 과정을 최종역인 Calculator로 명시하여 나타냄
Calculator c = (Calculator) eq;
double result = c.plus(10, 20);
System.out.println("결과 : " + result);
}
System.out.println();
System.out.println("모든 장비에서 0과 10을 나누기");
// equipment 활성화, calculator 비활성화
for (Equipment eq : equipments) {
// calculator 활성화, equipment 비활성화
Calculator c = (Calculator) eq;
double result = c.division(10, 0);
System.out.println("결과 : " + result);
}
System.out.println();
System.out.println("모든 장비 전원 끄기");
for (Equipment eq : equipments) {
eq.powerOff();
}
System.out.println();
}
}