[Java] 인터페이스 - 인터페이스란?

나영원·2020년 8월 30일
0

Java_basic

목록 보기
49/60

인터페이스란?

  • 인터페이스는 어떤 객체에 대한 명제로 이 객체가 어떤 메서드들을 제공하고 어던 역할을 하는지에 대한 일종의 설명서로 대부분 설계단계에서 만들게 됩니다.

  • 인터페이스란 클래스의 일종으로 추상메서드로만 이루어진 클래스로 추상클래스에는 추상메서드와 일반 메서드가 동시에 있을 수 있다는 점에서 다릅니다.

  • 추상메서드의 경우와 같이 구현부가 없는 메서드로만 구성되어 있기에 new 생성자를 사용할수 없고 그로 인해 인터페이스 안에 변수를 선언하더라도 힙메모리 안에 구성이 안되기 때문에 결국 상수로 변환됩니다.

  • 구현 코드가 없는 인터페이스의 상속은 타입 상속이라고 불리기도 합니다.(하위 클래스들의 타입의 역할을 하여 다형성을 구현할 수 있게 해주기 때문에)

  • 인퍼페이스의 요소로 앞에서 언급한 추상 메서드, 상수 외에도 디폴트 메서드, 정적 메서드, private메서드가 나머지는 뒤에서 더 자세히 알아보도록 하겠습니다.

인터페이스의 선언과 구현

인터페이스를 어떻게 선언하고 구현하는지에 대한 예제를 살펴보겠습니다.

	//1번
public interface Calc {
	//2번	
	double PI = 3.14; //나중에 상수가됨
	int ERROR = -9999999;
	//3번
	int add(int num1, int num2);
	int substract(int num1, int num2);
	int times(int num1, int num2);
	int divide(int num1, int num2);
}
  • 1번 : 계산을 기능을 하는 객체에 인터페이스를 작성하기 위해 Calc클래스를 만들고 클래스 선언부(public class Clac)에 class를 지우고 interface를 적으면 인터페이스로 선언됩니다.

  • 또한 클래스를 생성할 때 클래스로 생성하지 않고 바로 인터페이스를 생성하는 방법도 있습니다.

  • 2번 : 변수 PI와 ERROR은 실제 변수가 아닌 상수로 컴파일과정에서 public static final이 다 붙어서 상수화됩니다.

  • 3번 : 계산 기능을 하는 add(), substract(), times(), divde() 메서드를 만듭니다. abstract 키워드가 생략됬지만 이들은 구현부가 없는 추상메서드 입니다. 이 메서드들도 컴파일 과정에서 추상 메서드로 변환됩니다.

  • 메서드를 함수의 이름, 매개변수 반환값을 선언할 수 있다는 것은 결국 이 메서드가 어떤 기능을 대략적으로 보여주는 기능을 합니다. 인터페이스는 이렇게 객체의 기능을 간략하게 설명하는 기능을 하고 하위 클래스에서 어떻게 구현되야 하는지를 안내합니다.

  • 위의 그림같이 추상메서의 경우와 같이 이탤릭체로 표현된 Calc를 구현한 Calculator와의 관계는 점선으로 표현합니다.

  • 인터페이스의 메서드를 일부만 구현한 Calculator는 추상클래스이고 이를 실선으로 상속받은 CompleteCalc클래스에서는 Claculator에서 구현되지 않은 메서드들이 구현될 것입니다.

//1번
public abstract class Calculator implements Calc {
	//2번
	public int add(int num1, int num2) {
		return num1+num2;
	}

	public int substract(int num1, int num2) {
		return num1-num2;
	}

}
  • 1번 : Claculator 클래스를 만들고 인터페이스 Calc를 구현한다는 뜻에서 implements를 선언부에 사용합니다. 또한 Calc의 일부 메서드들만 구현할 것이기에 class앞에 abstract을 붙여 추상 클래스라고 선언해 줍니다.

  • 2번 : add(),substarct()클래스를 각각의 기능에 맞게 작성합니다

public class CompleteCalc extends Calculator {

	public int times(int num1, int num2) {
		return num1 * num2;
	}

	public int divide(int num1, int num2) {
		if(num2 == 0)
			return ERROR;
		else
		return num1/num2;
	}
	
	public void showInfo() {
		System.out.println("모두 구현하였습니다.");
	}
}
  • 클래스 선언부에 extends를 사용하여 상속 받는다는 것을 알리고 아래의 Calculator에서 구현하지 않은 나머지 2개의 메서드를 마저 작성합니다.

  • showInfo()메서드를 추가해서 작성합니다.

public class CalcTest {

	public static void main(String[] args) {
		CompleteCalc calc = new CompleteCalc();
		int n1 = 10;
		int n2 = 2;
		
		System.out.println(calc.add(n1, n2));
		System.out.println(calc.substract(n1, n2));
		System.out.println(calc.times(n1, n2));
		System.out.println(calc.divide(n1, n2));
		
		calc.showInfo();
	}
}
  • CalcTest를 만들고 유일하게 생성할 수 있는 CompleteCalc클래스를 선언합니다

  • Completecalc는 Calc나 Calculator로도 선언할 수 있지만 업캐스팅(묵시적 형변환) 되기 때문에 인터페이스의 메서드들만 사용할 수 있고 CompleCalc에서 만든 shoInfo();메서드는 사용할 수 없습니다.

  • n1,n2 변수에 값을 넣어주고 메서드들의 결과값을 출력문을 만들어 출력합니다.

  • cal.했을 때 뜨는 메서드 항목을 통해 사용자들은 이 개체에서 제공하는 것들이 무엇인지 알 수 있게되는데 그게 인터페이스의 역할중에 하나입니다.

profile
배우는 개발 일기

0개의 댓글