본문 바로가기
BOOKS/수월한 Java

인터페이스

by IT여행자 2024. 4. 7.
728x90

개요


자바 클래스들이 필수로 사용되어야 하는 기능들을 추상 메서드로 정의하는 것으로 일종의 클래스들의 가이드라인 역할을 하는 구조라 볼 수 있다. 인터페이스 안에는 추상 메서드와 상수만으로 이루어져 있다. 구현 코드가 없기 때문에 인스턴스를 만들 수 없고 자손 클래스가 상속받아 추상 메서드를 재정의하여 사용하게 된다.

 

인터페이스의 특징을 정리하면 아래와 같다.

  • 다중 상속 가능 : class 형식으로 만드러 진 클래스들은 단일 상속만을 지원하는데 반해 인터페이스로 만들어진 구조는 다중 상속을 지원한다.
  • 생성자 불가 : 단독으로 인스턴스를 생성할 수 없기 때문에 생성자 사용은 불가하다.
  • 메서드 오버라이딩 : 인터페이시를 상속받은 클래스에서는 반드시 추상 메서드들을 재정의(Overriding) 해야 한다.
  • 인터페이스를 상속받아 인터페이스를 만들 수 있다. 이때는 extends 키워드를 사용하여 상속받는다.
  • 인터페이스를 상속받아 클래스를 만들 때는 implements 키워드를 사용하여 상속받는다.

인터페이스를 사용하는 이유를 간단히 정리해 보자.

  • 네이밍 통일 : 같은 인터페이스를 상속받았다면 동일한 이름의 추상 메서드를 재정의해서 사용해야 하므로 자연스럽게 네이밍이 통일되어 가독성 및 유지보수 기능이 향상될 수 있을 것이다.
  • 의존성 약화 : 객체 간의 결함도를 낮추어 보다 유연한 개발 방식을 구현할 수 있다.
  • 스프링과 같은 프레임워크에서는 DI(Dependency Injection:의존성주입)과 같은 개념의 프로그램을 보다 쉽게 개발할 수 있게 해 준다. 

 

인터페이스 작성하기


인터페이스 안에는 상수와 추상 메서드만을 기술할 수 있다. name과 irum에 final이 붙어 있지 않지만 모두 상수가 된다.

또한 모든 메서드 앞에는 abstract 가 붙어 있어야 하지만 인터페이스에서는 생략하여 사용한다.

 

interface MyInter1{
   String name = "my interface1";
   public void sum(int x, int y);
   public void div(int x, int y);
}

interface MyInter2{
   String irum = "my interface2";
   public void mul(int x, int y);
   public void sub(int x, int y);
}

 

인터페이스 사용하기


인터페이스를 상속받아 인터페이스 만들기

 

인터페이스를 상속받아 또 다른 인터페이스로 확장시킬 수 있다.

 

interface ExtendsInterface extends MyInter1, MyInter2{ }

 

 

위의 인터페이스를 구현한 클래스는 아래와 같이 MyInter1과 MyInter2에 있는 추상 메서드를 모두 재정의해 주어야 한다.

 

class ExtendsInterExam implements ExtendsInterface{

   @Override
   public void sum(int x, int y) {
   }

   @Override
   public void div(int x, int y) {
   }

   @Override
   public void mul(int x, int y) {
   }

   @Override
   public void sub(int x, int y) {
   }
}

 

인터페이스를 상속받아 클래스 만들기

 

public class InterfaceExam implements MyInter1{

   @Override
   public void sum(int x, int y) {
      System.out.println(x+y);
   }

   @Override
   public void div(int x, int y) {
      System.out.println(x/(double)y);
   }

   public static void main(String[] args) {
      InterfaceExam ex = new InterfaceExam();
      ex.sum(10,20);
      ex.div(10,2);
      //ex.name = "park";//상수이므로 값을 수정할 수 없음.
   }
}

 

sum(), div()  메서드는 반드시 재정의해야 하며 name 필드는 상수가 되므로 값을 수정할 수 없다.