본문 바로가기

Java

[Java-자바]인터페이스(interface)


인터페이스란


인터페이스는 프로젝트의 설계도로 생각하면 좋겠다. 기능에 대해 선언만 한 상태이다. 인터페이스는 모든 기능을 추상화로 정의한 상태 즉, 모든 메서드의 선언만 정의하고 메서드의 기능에 대해 주석만 기입하 상태이다. 인터페이스도 추상 클래스처럼 구현이 안된 멤버를 포함하므로 인스턴스를 시킬수 없고 인터페이스를 상속 받은 클래스에서 멤버를 구현한 뒤 자식 클래스를 인스턴스하여 사용된다.

 


인터페이스 구현


인터페이스는 예약어로 class 대신 interface를 사용하며, 접근 제어자로 public 또는 default를 사용한다.

 

멤버 구성

- 인터페이스는 추상 메서드와 상수만 멤버로 가질 수 있다.
- 일반 메서드와 멤버 변수는 구성원으로 가질 수 없다.
- 모든 멤버 변수는 public static final이어야 하며, 이를 생략할 수 있다.
- 모든 메서드는 public abstract이어야 하며, 이를 생략할 수 있다.

비고) 멤버 변수의 "public static final"와 메서드의 "public abstract"는 선언이 안되어 있으면 컴파일러에 의해 컴파일 시 자동으로 추가 해준다.

 

interface 인터페이스이름{
 //컴파일러에 의해 public static fianl이 붙음
 public static final 타입 상수이름 = 값;
 static final 타입 상수이름 = 값;
 final 타입 상수이름 = 값;
 타입 상수이름 = 값;
 
 //컴파일러에 의해 public abstract이 붙음
 public abstract 메서드이름(매개변수);
 매서드이름(매개변수);
}

 


인터페이스 사용


인터페이스 자체를 인스턴스 시킬수는 없다. 자식 클래스에서 인터페이스에서 선언한 메서드를 오버라이딩으로 재 구현하고 자식 클래스를 생성해야 한다. 인터페이스는 자식으로 인터페이스와 클래스를 받을 수 있다.

 

인터페이스를 자식으로 가질 경우

interface 자식인터페이스 extends 부모인터페이스{
}

extends를 예약어로 사용하여 부모인터페이스를 상속 받는다. 부모 인터페이스에서 선언한 메서드를 재 구현하지 않아도 되고 기능 선언을 추가할 수 있다. 자식 인터페이스를 상속 받은 클래스는 부모인터페이스와 자식인터페이스에서 선언한 메서드를 모두 오버라이딩해야 한다.

 

클래스를 자식으로 가질 경우

class 자식클래스 implements 부모인터페이스{
}

implements를 사용하여 부모인터페이스를 상속 받는다.부모인터페이스에서 선언한 메서드에 대해서 모두 오버라이딩하여 재 구현해야 한다.


 

인터페이스를 이용한 다중 상속


Java에서는 class의 다중 상속을 허용하지 않는다. 이런한 점을 보완 하고자 interface를 이용한 다중 상속은 허용한다.
비고) 콤마를(,) 구분자로 사용함

 

interface Parent1{
 void method1();
}

 

interface Parent2{
 void method2();

 

public class Child implements Parent1, Parent2{
 @Overrding
 public void method1(){
 }
 
 @Overrding
 public void method2(){
 }

 

부모 인터페이스로 Parent1, Parent2를 선언하고 Child클래스에서 이 둘을 상속했다.
Child 클래스에서는 두 인터페이스에서 선언한 method1(), method2()를 모두 오버라이딩하여 재 구현해야한다.

 


다형성


인터페이스는 자식 클래스에서 상속 받아 사용되므로 다형성의 특성을 가지고 있다.
다형성에 대한 내용은 이전 교육을 참고 바란다.

Parent1 p1 = new Child();
Parent2 p2 = new Child();

Child c1 = (Parent1)p1;
Child c2 = (Parent2)p2;

Parent1 pp1 = (Parent1)c1;
Parent2 pp2 = (Parent2)c2;

Parent1 ppp1 = (Parent2)c1; //런 타임 에러 발생
Parent2 ppp2 = (Parent1)c2; //런 타임 에러 발생

 


인터페이스 사용 이유


지금까지 인터페이스를 사용하는 방법에 대해서 알아보았다. 그럼 왜 인터페이스를 궂이 사용해야 하는지 알아보겠다.

 

클래스간 결합도를 낮출 수 있다.
 - 객체지향 설계 원칙의 하나로 클래스간의 영향도는 낮출수로 좋다.(클래스간 간접적인 관계로 변경) 사용자에서 제공자를 직접 사용하지 말고 인터페이스로 사용하면 제공자쪽에 소스의 변경이 있어도 사용자쪽에 직접적인 영향이 없어 변경을 하지 않아도 된다.


표준화가 가능하다.
 - 클래스이 기본틀을 제공하여 개발자들에게 정형화된 개방을 강요한다.


개발 시간을 단축 시킬수 있다.
 - 제공자쪽에서 미 구현되어 있어도 사용자쪽에서 인터페이스 명과 메서드 명만 알고 있어도 사용자쪽에서 개발이 가능하다.
 
 
감사합니다.