인터페이스 (interface)

2020. 3. 12. 11:08자바 Java/자바 공부 java study

반응형

인터페이스란

클래스의 한 종류이며, 일종의 추상클래스이다. 추상메소드 들로만 이루어진 추상메소드의 집합체 클래스라고 볼 수 있다.  추상클래스보다 추상의 정도가 높아 구현이 없는 메서드 멤버변수를 구성원으로 가질 수 없다. 오직 추상메서드와 상수만을 멤버로 가질 수 있으며 그외에 어떠한 요소도 허용하지 않는다. 

 

 

인터페이스의 사용방법

interface의 상속은 implements 키워드를 사용한다. 

인터페이스도 타입으로 사용할 수 있다. 

인터페이스를 임플리먼트 한 클래스 타입의 인스턴스 객체를 만드는 것은 가능 하다 

 

 

인터페이스를 왜쓸까?

1.추상메소드를 하나라도 갖고 있으면 클래스도 추상화 되야된다라는 단점

2. abstract라는 키워드를 꼬박꼬박 다 써야한다는 귀찮음 

3. 상속은 단일 상속밖에 안되지만 인터페이스의 경우 다중으로 선언할 수 있다. 즉, 여러부모에게서 상속받을수 있다 ( 다중상속이 가능해진다) 

4. 인터페이스는 상속과 추상의 단점들을 보완하기 위해 만들어진 클래스 이다. 

(추상 클래스 자체는 잘 쓰지 않는다. 인터페이스를 위해서 설명 한 것이다. )

 

인터페이스는 클래스와 달리 기본 접근제어자는 public 이다. 인터페이스에 필드 변수를 선언하면 public static final 로 선언해야 하며 이 역시 생략하면 기본으로 설정되어 있다. 메서드를 private 로 설정하면 실제 구현체를 인터페이스 내에 구현해야 한다.(물론 이를 밖에서 사용할 수 없으므로 직접적으로 사용하는 곳은 적을 것으로 생각된다.)

 

인터페이스의 작성은 키워드 class 대신에 interface로 선언하면 되며 접근제어자로는 public과 default를 사용하면 된다. 단지 class와의 차이인 제약조건이 있다.

  1. 모든 멤버변수는 public static final 이어야 하며, 생략할 수 있다.
  2. 모든 메서드는 public abstract 이어야 하며, 생략할 수 있다.

 

default 접근 제어자

자바8 버전 이상부터는 인터페이스에서 default 접근 제어자를 사용할 수 있게 되었다.
이는 인터페이스 내에서 직접 메서드를 구현한다는 의미의 접근 제어자이다. 이를 구현한 구체 클래스는 오버라이딩없이 이 default 메서드를 사용할 수 있고, 오버라이딩 역시 할 수 있다.

이로 인해 다중 상속일 때 고려해야할 사항이 많아지는 등 복잡했다. 하지만 이를 만든 주된 이유는 라이브러리 업데이트 때문이다. 인터페이스는 라이브러리나 프레임워크에서 매우 자주 사용된다. 라이브러리를 업데이트할 때 인터페이스에 추가된 기능이 있다면 이를 구현한 클래스 역시 추가해주어야 한다. 하지만 이 라이브러리를 사용하는 사용자가 해당 인터페이스를 구현한 클래스가 있다면 이를 구현하지 않아 컴파일 에러가 발생할 것이다. 이러한 심각한 불편함을 해소하기 위해 default 라는 키워드를 만들었다고 한다.

 

인터페이스를 이용한 다형성

인터페이스 역시 이를 구현한 클래스의 부모라 할 수 있으므로 해당 인터페이스 타입의 참조변수로 이를 구현한 클래스의 인스턴스를 참조할 수 있으며, 인터페이스 타입으로의 형변환도 가능하다. 그리고 메서드의 리턴타입으로 인터페이스의 타입을 지정한것이 가능하다. 리턴타입이 인터페이스 곧 객체이기에 인스턴스화 하여 반환을 하게된다.

인터페이스의 장점으로는 아래와 같다.

  1. 개발시간 단축
  2. 표준화 가능
  3. 서로 관계없는 클래스들에겍 관계를 맺어 줌
  4. 독립적인 프로그래밍 가능

 

인터페이스와 상속 차이

다형성을 활용하기 위해서는 기본적으로 자바를 기준으로 클래스 상속과 인터페이스 구현으로 나뉜다. 이를 선택하는 것은 전적으로 개발자의 몫이다. 물론 이 판단을 도와주는 기준은 존재한다. 상속에 대해서는 일반적으로 다음과 같이 추천한다.

  • 상속보다는 위임을 사용해라
  • 다형성을 위한 것이라면 클래스 상속보다는 인터페이스를 구현하라.

위를 보면 대부분 상속을 추천하지 않는다. 그만큼 비용이 큰 작업이기 때문이다. 변하지 않는 구조에서 상속을 사용하면 중복 코드를 제거하고 깔끔하게 코드를 작성할 수 있지만, 변화가 발생하는 순간 상속 구조는 깨지기 쉽다.

예를 들어 상속 관계에서 부모 클래스에 기능이 추가되었는데, 자식 클래스 중 하나에서 이를 사용할 수 없도록 해야 한다면 상속 구조가 깨질 수 있다. 따라서 상속은 기본적으로 Is-A 관계가 확실하고, 설계 이후에 변화가 없는 곳에서 사용해야 한다. 하지만 현실은 설계 이후에도 기능 변화가 비일비재 하다. 그래서 대부분 인터페이스를 사용한다.

인터페이스의 구현은 Can-Do 관계라고 말할 수 있다. 어떤 기능을 할 수 있다고 명세를 해주는 것이다. 위 상속 문제에서 일부 자식 클래스에서는 필요하고, 일부에서는 필요하지 않는 기능이 있다고 했다. 이러한 기능들은 설계 이후에 생기는 경우가 빈번하다. 이와 같은 구조를 쉽게 만들 수 있는 것이 인터페이스이다.

 

 

 

 

 

반응형