본문 바로가기
Programming Languages/Java

Chapter 19. 인터페이스

by 더 이프 2023. 1. 13.
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();
    	}
    }