본문 바로가기
JAVA BASE/OOP(객체지향 프로그래밍)

12. [자바] 인터페이스(interface)

by staticClass 2020. 12. 15.

인터페이스란?

인터페이스는 일종의 추상클래스이다. 인터페이스는 추상클래스처럼 추상메서드를 갖지만
추상클래스보다 추상화 정도가 높아 몸통을 갖춘 메서드나 멤버변수를 가질 수 없다.
오직 추상메서드와 상수만을 멤버로 가질 수 있다.
추상클래스를 부분적으로 완성된 '미완성 설계도' 라고 한다면
인터페이스는 밑그림만 그려져 있는 '기본 설계도' 이다.

인터페이스의 작성

인터페이스를 작성하는 것은 클래스를 작성하는 것과 같지만
키워드를 class 대신 interface로 사용한다. 또 interface에도
클래스와 같이 접근제어자로 public 또는 default를 사용할 수 있다.

interface 인터페이스이름 {
    public static final 타입 상수이름 = 값;
    public abstract 메서드이름(매개변수목록);
}

일번적 클래스 멤버들과 달리 인터페이스 멤버는 제약사항이 있다.
 * 모든 멤버변수는 public static final 이어야 하며, 이를 생략할 수 있다.
 * 모든 메서드는 public abstract 이어야 하며, 이를 생략할 수 있다.

인터페이스에 정의된 모든 멤버에 예외없이 적용 되기 때문에 제어자(public, default, ..., static, final, ...)

를 생략할 수 있고 편의상 생략하는 경우가 많다.

생략되도 컴파일 시에 컴파일러가 자동적으로 추가 해준다.

인터페이스의 상속

인터페이스는 인터페이스로부터만 상속받을 수 있고, 클래스와 달리 다중상속이 가능하다

interface Chat {
    /*채팅의 내용을 입력하는 기능의 메서드*/
    void chatContents(String contents)
}

interface Person {
    /* 채팅의 내용을 보낼 대상을 선택하는 메서드 */
    void target(String name)
}

interface ChatingProgram extends Chat, Person{}

클래스의 상속과 마찬가지로 자손 인터페이스(ChatProgram)는
조상 인터페이스(Chat, Person)에 정의된 멤버를 모두 상속받는다.

하지만 '인터페이스를 이용하면 다중상속이 가능하다' 라고 하는 것일 뿐

다중상속을 구현하는 경우는 거의 없다.

인터페이스는 static 상수만 정의할 수 있어서 조상클래스의 멤버변수와 충돌하는 경우는 거의 없지만

충돌된다 하더라도 클래스 이름을 붙여서 구분이 가능하다.

인터페이스의 구현

인터페이스도 추상클래스처럼 인스턴스를 생성할 수 없고 상속을 통해 완성된다.
다만 다른점이 있다면 상속의 키워드가 'extends(확장)'에서 'implements(구현)'
으로 바뀐다.

class KakaoTalk implements ChatingProgram {
    void chatContents(String contents) { ... }
    void target(String name)           { ... }
}
이 때 'KakaoTalk클래스는 ChatingProgram인터페이스를 구현한다.' 라고 한다.

만일 구현하는 인터페이스의 메서드 중 일부만 구현한다면, abstract를 붙여서
추상클래스로 선언해야한다.

abstract class KakaoTalk implements ChatingProgram {
    void chatContents(String contents) { ... }
}

그리고 다음과 같이 상속과 구현을 동시에 할 수도 있다.

class KakaoTalk extends UserProfile implements ChatingProgram {
    void chatContents(String contents) { ... }
    void target(String name)           { ... }
}

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

다형성이란 자손의 인스턴스를 조상 클래스 타입의 참조변수로 참조하는 것인데
인스턴스도 마찬가지로 인터페이스를 구현한 클래스는 자손이라 할 수 있으므로
인터페이스(조상)의 타입의 참조변수에 인터페이스를 구현한 클래스(자손)의 인스턴스를
참조시킬 수 있고 참조가 되니 당연히 인터페이스 타입으로 형변환도 가능하다.

interface Poeple {}                    // 사람 인터페이스
class Friend implements People {}   // 친구 클래스 (People 인터페이스를 구현했다.)

public static void main(String[] args){
    People p = new Friend();          // 참조가 가능함.
       또는
    People p = (People)new Friend();  // 형변환 및 참조가 가능함.
}

따라서 인터페이스는 메서드의 매개변수 타입으로 사용될 수 있다.
void name(People p){
    //...
}

또, 리턴타입으로 인터페이스의 타입을 지정하는것 역시 가능하다
People method(){
    People p = new People();
    return p;
}

인터페이스의 다형성은 클래스의 다형성과 마찬가지로 같은 족보 안에 있어야 가능하다
단 고조 할아버지, 증조할아버지, 할아버지, 부모, 자식, 손자 끼리 가능하고
형제 자매 사이에서는 불가능하다.

인터페이스의 장점

 * 개발시간을 단축시킬 수 있다.
 * 표준화가 가능하다.
 * 서로 관계없는 클래스끼리 관계를 맺어 줄 수 있다.
 * 독립적인 프로그래밍이 가능하다.

각 내용의 자세한 내용을 보고 싶다면 글을 펴보라.

더보기

1. 개발시간을 단축시킬 수 있다.

인터페이스가 작성되면 인터페이스 안에 기능을 구현하지 않아도 프로그램을 작성하는 것이 가능하기 때문에

메서드를 호출하는 코드쪽에서 구현되지 않은 인터페이스를 가지고 일단 개발을 진행하고

동시에 인터페이스를 구현할 수 있어서 메서드의 구현을 기다리지 않고도 동시에 개발이 가능하다.

 

2. 표준화가 가능하다

프로젝트에 사용되는 기본 틀을 인터페이스로 작성한 다음, 개발자들에게 인터페이스를 구현하여

프로그램을 작성하도록 하여 보다 일관되고 정형화된 프로그램의 개발이 가능하다.

 

3. 서로 관계없는 클래스들끼리 관계를 맺어 줄 수 있다.

서로 상속관계에 있지도 않고, 같은 조상클래스를 가지고 있지 않은 서로 아무런 관계가 없는

클래스들에게 하나의 인터페이스를 공통적으로 구현하도록 함으로써 관계를 맺어 줄 수 있다.

 

4. 독립적인 프로그래밍이 가능하다.

인터페이스를 이용하면 클래스의 선언과 구현을 분리시켜 실제구현에 독립적인 프로그램을 작성하는 것이

가능하다. 클래스와 클래스간의 직접적인 관계를 인터페이스를 이용해서 간접적인 관계로 변경하면,

한 클래스의 변경이 관련된 다른 클래스에 영향을 미치지 않는 독립적인 프로그래밍이 가능하다.

 

댓글