ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Java Interface] 인터페이스를 사용하는 이유
    프로그래밍/Java 2022. 3. 20. 13:04
    반응형

    인터페이스(Interface)

    • 구현 코드가 없는 메서드들의 집합을 의미함.
    • 모든 메서드가 추상 메서드로 선언됨 적지 않아도 추상 메서드로 JVM에서 알아서 선언
    • 모든 변수는 상수로 선언됨
    • 모든 인터페이스는 형변환이 가능
    • 형변환해서 사용한다고 하면, 상위 인터페이스 객체로 만들면 상위 인터페이스에 있는 메서드만 사용가능하고
    • 하위클래스에서 만든 함수는 사용하지 못함

    인터페이스 사용법

    • interface로 생성된 곳에 상속받아 구현할 메서드의 내용만 작성함
    • implements를 사용하여 상속을 받음
    • 하위클래스에서 interface에 정의된 내용을 일부분만 구현을 한다면 abstract를 사용하여 처리해야함, 다 구현을 한다면 abstract를 정의 하지 않아도됨

    인터페이스를 사용하는 이유

    • 클래스나 프로그램이 제공하는 기능을 명시적으로 선언
    • 일종의 클라이언트 코드와의 약속이며 클래스나 프로그램이 제공하는 명세서 라고 보면됨
    • 어떤 객체가 하나의 인터페이스 타입이라는 것은 그 인터페이스가 제공하는 모든 메서드를 구현했다는 의미

     

    예제 코드

    public interface Calc {
    	double PI = 3.14;
    	int ERROR = -999999999;
    	
    	int add(int num1, int num2);
    	int substract(int num1, int num2);
    	int times(int num1, int num2);
    	int divide(int num1, int num2);
    }
    • 위 와 같이 interface코드가 있다면 add, substract, times, divide를 하위 클래스에서 모두 작성을 해줘야 사용이 가능함
    //implements를 이용하여 상속 받기 
    public abstract class Calculator implements Calc{
    
      //@Override를 이용하여 구현하기
    	@Override
    	public int add(int num1, int num2) {
    		return num1 + num2;
    	}
    
    	@Override
    	public int substract(int num1, int num2) {
    		return num1 - num2;
    	}
    }
    • implements Calc를 이용하녀 Calc를 인터페이스를 상속받음
    • 아래 add, substract, times, divide중 add, substract만 구현하고 나머지 두개는 구형하지 않았으므로
    • class 명 앞에 abstract를 붙였음 안붙이면 오류가 발생함.
    public class CompleteCalc extends Calculator{
    
    	@Override
    	public int times(int num1, int num2) {
    		return num1 * num2;
    	}
    
    	@Override
    	public int divide(int num1, int num2) {
    		if(num2 == 0) {
    			return ERROR;
    		}
    		return num1/num2;
    	}
    
    	public void showIfo() {
    		System.out.println("모두 구현했습니다.");
    	}
    }
    • 나머지를 구현하기 위해 만든 클래스는 interface가 아닌 클래스를 상속받으므로 implements를 쓰지 않고, extends로 클래스를 상속받아야함
    • 상위 클래스에서 abstract를 처리가 되어있던 나머지 함수를 모두 구현 하였기 때문에 abstract를 안붙여도 됨
    • 상속을 받았기 때문에 상위 함수와 자신이 정의한 함수 사용가능하며, 추가 및 재정의하여 사용 가능함
    public class CalculatorTest {
    
    	public static void main(String[] args) {
    		int num1 = 10;
    		int num2 = 2;
    		
    		//상위 인터페이스 형을 받았기 때문에 
    		//인터페이스 형으로 선언이 가능하다.
    		//하지만, 인터페이스에서 선언된 함수들만 사용가능하다. 하위에서 선언된 showInfo는 사용이 불가능하다.
    		Calc calc = new CompleteCalc();
    		System.out.println(calc.add(num1, num2));
    		System.out.println(calc.substract(num1, num2));
    		System.out.println(calc.times(num1, num2));
    		System.out.println(calc.divide(num1, num2));
    		
    		//인터페이스를 상속받은 클래스의 함수가 호출이 가능하다.
    		//선언 부는 둘다 사용가능하다.
    		CompleteCalc calc2 = new CompleteCalc();
    		calc2.showIfo();		
    	}
    }
    • 또한 상속받은 클래스 형태를 띄기 때문에 클래스의 모든 기능은 사용이 가능함(ex : 다형성 등)

     

    반응형

    댓글

Designed by Tistory.