개발 일기

인터페이스란? 본문

Java&Spring/Java

인터페이스란?

flow123 2021. 12. 12. 23:53

인터페이스란? 

 

인터페이스는 클라이언트 프로그램에 어떤 메서드/멤버를 제공하는지 미리 알려주는 명세, 약속의 역할을 한다.

다시 말해, 최종 구현된 클래스를 사용하는 클라이언트 코드와, 클라이언트에게 기능을 제공하는 코드 사이의 약속이다. 

인터페이스를 잘 정의하는 것이 확장성 있는 프로그램을 설계하는 토대다. 

 

인터페이스: 인터페이스를 구현한 클래스가 어떤 기능의 메서드를 제공하는지 (제공할지) 명시

클라이언트: 인터페이스에서 약속한 명세대로 구현한 클래스 생성

 

 

인터페이스의 특징 

-인터페이스는 Abstract, final 과 함께 자바의 대표적인 규제다. 

-인터페이스는 대상이 되는 시스템을 제어할 때 사용한다 

-인터페이스를 implement 할 때는, 메서드를 구현해줘야 한다.

-구현 후에는 꼭 아래와 같이 {} body를 넣어줘야 한다. 

-인터페이스의 멤버/메서드는 public 이어야 한다. 

*인터페이스는 그 인터페이스를 구현한 클래스를 어떻게 조작할 것인가를 규정한다. 

그렇기 때문에, 외부에서 제어할 수 있는 가장 개방적인 접근 제어자인 public 만을 허용한다.

public을 생략하며 접근 제어자 default 가 되는 것이 아니라, public 이 된다. (인터페이스의 멤버는 무조건 public이다)

-인터페이스에서 선언한 메서드는 모두 구현 코드가 없는 추상 메서드다. public abstract 예약어를 쓰지 않아도, 컴파일 과정에서 자동으로 추상메서드로 변환된다.  

 

아래 Class A는 인터페이스 I를 구현한다.

 

interface I {
	public void z();
}

class A implements I{
	public void z() {}
}

 

 

인터페이스를 왜 사용할까? 

 

인터페이스를 이용하면 다형성을 구현해서 확장성있는 프로그램을 만들 수 있다. 클라이언트 프로그램을 많이 수정하지 않고 기능을 추가할 수 있고, 다른 기능을 사용할 수 있다. 

*다형성을 다시 짚고 넘어가자면, 같은 코드를 활용해서 다양한 프로그램을 구현한 것이다. 코드는 변함이 없어도, 어떤 매개변수가 넘어왔느냐에 따라 출력문이 달라진다. 

실무에서는 프레임워크와 기존 소스코드를 사용해서 개발하는 경우가 많다. 그러니 인터페이스가 많이 쓰인다. 

 

 

ex. calculator 클래스 만드는 개발자 A와 calculator 클래스를 쓰는 기능을 만드는 개발자 B가 있다. 

B는 calculator 클래스에 의존하니까 우선 의존해야한다.

이럴 경우 CalculatorDummy 같은 가짜 클래스를 일단 만들어두고 본인의 기능을 개발할 것이다. 

그런데, 만약 둘이 이해한 바가 다를 가능성이 있다. (예를 들어, b는 매개변수를 3개 들어가게 했지만, a 는 2개 들어가게 만든 것이다) 많은 사람들이 참여하는 프로젝트라면, 이는 수정에 많은 리소스가 들게 된다.

그러니, 더 구체적으로 코드로 정의를 해두고, 커뮤니케이션 에러가 없도록 합의 후 시작해야한다. 이를 위한 기능이 interface다.  

 

 

Calculatable 이라는 interface 를 정의하자. 

 

 

B는 Calculator Dummy 를 만들지만, Calculatable을 implement 하면서 시작한다.

Calculator 가 구현된 후에는 , Dummy 만 Calculator 로 바꾸어 주면 된다. 

이렇게 interface 를 공유할 경우, calculator 라는 클래스가 모두 구현되지 않아도, calculator 클래스를 어떻게 사용할지 알 수 있다. 개발자 A도 Calculatable 을 구현하면서 설계되기 때문에 B와 A가 의도된 방향으로, 같은 맥락에서 개발을 진행할 수 있다. (그리고 이 모든 것이 코드단에서 구현되는 것이다!) 

 

 

abstract vs interface (추상클래스) vs 인터페이스

추상클래스는 일반 클래스와 다를 바가 없다. 하위 클래스가 상속받아서(overriding) 사용하도록 강제한다는 것 차이 말고는 없음. 하위클래스에서 상속받을 수 있도록 비워놓은 메서드가 있을 것이다. 그럼에도 구체적인 로직을 갖고 있는 메서드, 필드가 존재할 수 있는 형태다. 

반면, 인터페이스는 반드시 본체가 없는 메서드만 가져야 한다. 

 

출처: 생활코딩 자바, 책 자바 프로그래밍 입문 

Comments